diff --git a/docs/video_system/index.html b/docs/video_system/index.html index f852b2a..c2be959 100644 --- a/docs/video_system/index.html +++ b/docs/video_system/index.html @@ -693,11 +693,11 @@ header, .context-menu, .megamenu-content, footer{ 视频监控系统开发及使用手册
-
    • 0 前言说明

      0.1 编译说明

      0.1.1 注意事项

      1. 可执行文件在源码同级目录的bin目录下。

      2. 编译完成后记得将源码下的file目录下(切记是file目录下而不是file目录)的所有文件复制到可执行文件同一目录。

      3. 如果开启了视频监控(默认开启),则记得将对应的动态库文件复制到可执行文件同一目录。比如采用ffmpeg内核(默认就是ffmpeg)的话,则将下载到的dll_ffmpeg4下的所有文件复制到可执行文件同一目录。

      4. 各个操作系统对应的ffmpeg编译好的动态库以及miniblink的动态库下载地址。 +

      0 前言说明

      0.1 编译说明

      0.1.1 注意事项

      1. 可执行文件在源码同级目录的bin目录下。

      2. 编译完成后记得将源码下的file目录下(切记是file目录下而不是file目录)的所有文件复制到可执行文件同一目录。

      3. 如果开启了视频监控(默认开启),则记得将对应的动态库文件复制到可执行文件同一目录。比如采用ffmpeg内核(默认就是ffmpeg)的话,则将下载到的dll_ffmpeg4下的所有文件复制到可执行文件同一目录。

      4. 各个操作系统对应的ffmpeg编译好的动态库以及miniblink的动态库下载地址。 https://pan.baidu.com/s/13LDRu6mXC6gaADtrGprNVA  提取码: ujm7。

      5. 如果是64位的qt则对应的dll是拷贝dll_ffmpeg4_64目录下的,64位的linux对应的是liblinux64.tar.gz。

      6. 本系统支持ffmpeg2/3/4/5/6所有版本,默认是ffmpeg4,如果要支持XP需要用ffmpeg2/3。如果是在linux/mac系统上编译记得查看core_videoffmpeg/下面的 linux系统和mac系统上库的用法.txt/编译阶段linux系统ffmpeg库放置位置.jpg/运行阶段linux系统ffmpeg库放置位置.jpg。

      7. 如果编译运行提示miniblink文件不存在请先拷贝,则说明你当前用的Qt版本没有浏览器模块,要么没安装,要么不支持,你也不用担心啥,此时自动切换用的miniblink浏览器内核,你还需要将ffmpeg库下载的网盘的地方找到dll_miniblink.zip下载解压到可执行文件同一目录即可。

      8. 系统中所有的图标,都采用的图形字体,对照表在doc目录下的FontAwesome.png、FontAliBaBa.png,对应图形字体类IconHelper中加载的图形字体,后期如果还有增加的其他图形字体也是放在这里,一个类支持多种图形字体,通过不同的值范围自动设置。

      9. 如果发现地图打不开或者提示秘钥文件丢失,请先确认file目录下的所有文件有没有拷贝过去。

      10. 如果是用vs+qt可能报错 error LNK2026,解决办法详细见本文档中13其他说明/13.5环境使用qt+vs。

      11. 默认用户名admin 密码admin。

      12. 系统配置参数在加载的时候会对节点值进行过滤判断,如果为空会自动用初始值生成新的配置文件,如果不想要显示版权所有公司,可以填xxx而不是删掉整个值。

      13. 如果是用vlc推流的rtsp地址,比如 rtsp://:8554/aabb,由于vlc推流默认写死的采用的udp协议,所以监控系统也必须在系统设置中通信方式选择udp才行(默认tcp)。

      0.1.2 特别提示

      1. 本系统没有说基于哪个Qt版本,由于系统中电子地图模块用到了浏览器模块,所以理论上要求你电脑的Qt版本也有浏览器模块才行。

      2. 如果没有浏览器模块则电子地图模块不可用,但是其余功能全部可用,没有任何影响。

      3. 支持Qt4.7以上的所有版本,亲测msvc、mingw、gcc、clang、armgcc各种编译器,亲测xp、win7、win10、linux、mac、树莓派、香橙派、全志H3、cotex-A9、imx6等。

      4. 2021-1-6开始集成了miniblink浏览器内核,意味着mingw版本的qt5.6以上版本也全部支持,这样就所有系统都有浏览器模块不需要担心没有电子地图的问题。Qt6.4.1到Qt6.5.1之间的版本,miniblink浏览器控件会和openglwidget冲突导致白屏,建议避开这几个版本。

      5. 部分构建套件可能不支持预编译头,预编译头仅仅是为了加快编译速度,和程序本身无关。比如在win+Qt5.5 5.6就发现不支持,也可能是支持的不够全面,如果编译发生错误可以试着打开pro文件注释掉PRECOMPILED_HEADER = head.h 这行。

      6. Qt6.2的mingw版本的multimedia模块不可用,msvc版本的正常。

      7. 开启视频存储后默认存储的MP4格式的文件,如果想要调整体积大小,可以找到core/core_videoffmpeg/ffmpegsave.cpp videoCodecCtx->bit_rate = FFmpegHelper::getBitRate(videoWidth, videoHeight); 将这个码率调小即可,比如 videoCodecCtx->bit_rate = FFmpegHelper::getBitRate(videoWidth, videoHeight)/2; 可以将体积减少一半,相应的画质也会差一些。

      8. 推荐用64位的Qt搭配64位的ffmpeg,目前绝大部分系统都是64位的,能获得最大性能提升,本人亲自对比测试32位和64位,64位无论资源占用和操作响应等体验都更优。尤其是开启硬解码后,如果64个通道都需要硬解码,32位的测试下来貌似资源不够用。

      9. 如果更改appconfig.cpp中的值发现没有变化,那是因为里面的值是用来默认生成配置文件的值,如果配置文件已经存在,则对应变量是从配置文件读取的值,如果想要更改后的默认值生效,需要删除配置文件(config/video_system.ini)重新打开程序即可。

      10. 内核ffmpeg画框画文字水印等采用的滤镜实现,默认硬解码的数据是NV12不支持滤镜,意味着画框等无效,绘制文字有效,如果一定要在硬解码的帧数据画框,可以使用包含各种形状比如正方形/三角形/矩形的图形字体,指定图形字体的值来绘制。

      11. 如果在linux系统编译提示 -disable-new-dtags: unknown option ,打开core_videobase/core_videobase_include.pri ,把底部 DTAGS = ,-disable-new-dtags 整行注释就行。

      12. 关于声音的几点说明:系统中有多个声音相关的控制参数,一个是decodeAudio,用于控制是否解码音频数据;一个是playAudio,用于控制是否将解码后的音频数据发到声卡进行播放;一个是soundMute,用于控制声音大小为静音;在视频控件上的音量图标切换是用于切换静音。音频振幅也就是音柱的变化,只要声卡那边有数据播放,无论静音与否,都会有音频振幅效果。

      0.1.3 离线地图

      1. 离线地图可以用网上的瓦片地图下载器下载百度的离线地图放到对应目录即可。

      2. 也可以直接下载网盘中已经下载好的上海市的离线地图。

      3. 下载地址:https://pan.baidu.com/s/1ZxG-oyUKe286LPMPxOrO2A 提取码:o05q 文件名称:bin_map_tiles.tar.xz

      使用说明

      1. 将压缩包下的两个文件夹复制到对应可执行文件下的config文件夹下,和map.js文件同一级目录。

      2. tiles文件夹是街道图,tiles_hybrid文件夹是卫星图,tiles_self是路网图,路网图和卫星图合并就是混合图。

      3. 默认提供的是上海市徐汇区的瓦片地图,如果自己用万能地图下载器下载的百度地图的瓦片文件,也可以对应替换就行。

      4. 要注意的是格式,默认是jpg,如果下载的瓦片地图格式是png则需要打开config文件夹下的map_load.js文件,将.jpg改成.png保存即可。

      0.2 目录说明

      1. 本源码项目文件中对编译生成的临时文件和可执行文件做了重定向,可执行文件并不在build开头的目录下,而是在源码同级目录的bin目录下。

      2. config目录放的是软件的配置文件、地图模块需要的图片资源等。

      3. db目录一般有三个文件,key.db是秘钥文件、video_system.db是对应sqlite的数据库文件、video_system.sql是对应数据库脚本(可以在系统设置中数据库管理部分执行脚本用来切换到mysql等其他数据库)。

      4. logo目录存放的各种左上角软件LOGO图片,可以在系统设置中下拉选择。

      5. map目录存放的图片地图模块所用的地图图片文件,可以手动拷贝到此。

      6. sound目录存放的本系统所用的声音文件。

      7. layout目录存放的不同工作模式不同界面对应的布局方案配置文件。

      0.3 系统说明

      1. 本视频监控系统做的是通用的系统,主要偏重整体框架和UI交互等。

      2. 主要功能包括摄像机管理,实时视频显示,视频轮询、视频存储、设备地图显示,各种画面切换,各种悬停子模块、onvif搜索设备和云台控制及预置位,通用的NVR视频流播放(比如海康的NVR支持直接取流回放),录像计划、用户管理等功能。

      3. 如果是依赖SDK去实现的功能(雨刷、去雾等)都没有做,那个破坏了兼容性,无法通用其他摄像机设备以及其他操作系统。

      4. 每个厂家SDK和定制的功能都不一样,如果有这方面的需要都是买过去自己加上SDK的功能和自己定制需要的功能。

      5. 整个项目源代码行数大概30W行(项目代码本身除去第三方库以后约7W行,就是自己写的部分),其中代码13.5W行(占比45%),注释12.7W行(占比42%),空行3.5W行。分层设计注释详细。

      6. 本程序会一直持续迭代更新,包括项目源码、整体框架、使用说明等,一次购买终生售后。

      0.4 特别说明

      1. 程序本身是个客户端(直接从摄像机或者NVR等设备取rtsp视频流)并不是服务器程序,对标的是海康大华的PC客户端程序,只不过海康大华的客户端默认只支持自家的设备,而本程序支持各个厂家的设备。

      2. 摄像机管理没有限制摄像机的数量,理论上10000路肯定没有问题,就是个数据库记录。

      3. 实时显示具体能支持多少路,和具体的电脑配置有关(亲测1.8G主频8G内存I5子码流64路,总之比海康大华客户端要更优秀)。

      4. 程序实时显示界面最大可以到64路,每个通道都是打开的时候才会去建立连接取视频流,而不是一开始就建立了连接。

      5. 系统采用onvif协议+rtsp视频流机制,并不限定支持哪家的摄像机,只要符合这两种协议的都支持,市面上99%的网络摄像机都支持这两种基础协议,包括但不限于海康、大华、宇视、天地伟业、华为等各种安防厂家的摄像机。

      6. 本系统没有内置人脸识别等任何相关算法,提供的是相关的接口,比如自己的算法识别到人脸区域后,将区域坐标传入视频控件自动绘制。

      7. 系统采用纯QtWidget(非qml)编写,解码采用ffmpeg,搜索采用onvif协议,视频播放采用rtsp协议,所有源码开放,没有封装的库。

      8. 同时集成了数据库、多线程、串口通信、网络通信、音视频解码/同步/存储、网页地图、界面美化、UI布局等众多知识点。

      9. 未经本人许可不可将本项目源码扩散,如有发现本人将追究法律责任,谢谢配合。

      0.5 相关站点

      1. 国内站点:https://gitee.com/feiyangqingyun

      2. 国际站点:https://github.com/feiyangqingyun

      3. 个人主页:https://blog.csdn.net/feiyangqingyun

      4. 知乎主页:https://www.zhihu.com/people/feiyangqingyun

      5. 产品主页:https://blog.csdn.net/feiyangqingyun/article/details/97565652

      6. 在线文档:https://feiyangqingyun.gitee.io/qwidgetdemo/video_system/

      7. 体验地址:https://pan.baidu.com/s/1d7TH_GEYl5nOecuNlWJJ7g 提取码:01jf 文件名:bin_video_system.zip。

      8. 文章导航:https://qtchina.blog.csdn.net/article/details/121327495

      0.6 功能特点

      0.6.1 软件模块

      1. 视频监控模块,各种停靠小窗体子模块,包括设备列表、图文警情、窗口信息、云台控制、预置位、巡航设置、设备控制、悬浮地图、网页浏览等。

      2. 视频回放模块,包括本地回放、远程回放、设备播放、图片回放、视频上传等。

      3. 电子地图模块,包括图片地图、在线地图、离线地图、路径规划等。

      4. 日志查询模块,包括本地日志、设备日志等。

      5. 系统设置模块,包括系统设置(基本设置、视频参数、数据库设置、地图配置、串口配置等)、录像机管理、摄像机管理、轮询配置、录像计划、用户管理等。

      0.6.2 基础功能

      1. 支持各种视频流(rtsp、rtmp、http等)、视频文件(mp4、rmvb、avi等)、本地USB摄像机播放。

      2. 支持多画面切换,包括1、4、6、8、9、13、16、25、36、64画面切换。

      3. 支持全屏切换,多种切换方式包括鼠标右键菜单、工具栏按钮、快捷键(alt+enter全屏,esc退出全屏)。

      4. 支持视频轮询,包括1、4、9、16画面轮询,可设置轮询分组(轮询预案)、轮询间隔、码流类型等。

      5. 支持onvif协议,包括设备搜索、云台控制、预置位、设备控制(图片参数、校对时间、系统重启,抓拍图片等)。

      6. 支持权限管理,不同的用户可以对应不同的模块权限,比如删除日志、关闭系统等。

      7. 数据库支持多种,包括sqlite、mysql、sqlserver、postgresql、oracle、人大金仓等。

      8. 本地USB摄像机支持设置分辨率、帧率等参数。

      9. 所有停靠模块都自动生成对应的菜单用来控制显示和隐藏,在标题栏右键可以弹出。

      10. 支持显示所有模块、隐藏所有模块、复位普通布局、复位全屏布局。

      11. 双击设备弹出实时预览视频,支持图片地图、在线地图、离线地图等。

      12. 摄像机节点拖曳到对应窗体播放视频,同时支持拖曳本地文件直接播放。

      13. 删除视频支持鼠标右键删除、悬浮条关闭删除、拖曳到视频监控面板外删除等多种方式。

      14. 图片地图上设备按钮可自由拖动,自动保存位置信息。百度地图上可以鼠标单击获取经纬度信息,用来更新设备位置。

      15. 视频监控面板窗体中任意通道支持拖曳交换,瞬间响应。

      16. 封装了百度地图,视图切换,运动轨迹,设备点位,鼠标按下获取经纬度等。

      17. 双击节点、拖曳节点、拖曳窗体交换位置等操作,均自动更新保存最后的播放地址,下次软件打开自动应用。

      18. 右下角音量条控件,失去焦点自动隐藏,音量条带静音图标,自动记忆最后的音量及静音状态。

      19. 支持视频截图,可指定单个或者对所有通道截图,底部小工具栏也有截图按钮,每个视频控件悬浮条也有抓拍按钮。

      20. 支持超时自动隐藏鼠标指针、自动全屏机制。

      21. 支持onvif云台控制,可上下左右移动云台摄像机,包括复位和焦距调整等。

      22. 支持onvif预置位,可以添加、删除、修改预置位,可以调用起始位。

      23. 支持OSD增删改查,可以通过onvif协议添加及修改OSD信息。

      24. 支持onvif图像参数设置,包括明亮度、对比度、饱和度、尖锐度等。

      25. 支持onvif其他操作,包括抓图、网络设置、校时、重启、事件订阅等。

      26. 支持任意onvif摄像机,包括但不限于海康、大华、宇视、天地伟业、华为等。

      27. 可保存视频,可通过录像计划存储,也可在悬浮条手动切换开始录像和停止录像。

      28. 可设置视频流通信方式tcp或udp,可设置视频解码是速度优先、质量优先、均衡处理、最快速度等。

      29. 可设置软件中文名称、英文名称、LOGO图标等。

      30. 存储的视频文件支持导出到指定目录,支持批量上传到服务器。

      31. 完善的录像计划设置,支持每个通道7 * 24小时每半小时设置是否存储录像。

      32. 音视频同步显示以及音视频同步存储到MP4文件。

      0.6.3 特色功能

      1. 主界面采用停靠窗体模式,各种组件以小模块的形式加入,可自定义任意模块加入。

      2. 停靠模块可拖动任意位置嵌入和悬浮,支持最大化全屏,支持多屏幕。

      3. 双重布局文件存储机制,正常模式、全屏模式都对应不同的布局方案,自动切换和保存,比如全屏模式可以突出几个模块透明显示在指定位置,更具科幻感现代化。

      4. 原创onvif协议机制,采用底层协议解析(udp广播搜索+http请求执行命令)更轻量易懂易学习拓展,不依赖任何第三方组件比如gsoap。

      5. 原创数据导入、导出、打印机制,跨平台不依赖任何组件,瞬间导出数据。

      6. 内置多个原创组件,宇宙超值超级牛逼,包括数据导入导出组件(导出到xls、pdf、打印)、数据库组件(数据库管理线程、自动清理数据线程、万能分页、数据请求等)、地图组件、视频监控组件、文件多线程收发组件、onvif通信组件、通用浏览器内核组件等。

      7. 自定义信息框+错误框+询问框+右下角提示框(包含多种格式)等。

      8. 精美换肤,高达20套皮肤样式随意更换,所有样式全部统一,包括菜单等。

      9. 选中通道对应设备树节点高亮,选中通道节点对应视频控件高亮,方便查看当前通道信息。

      10. 视频控件悬浮条可以自行增加多个按钮,监控界面底部小工具栏也可自行增加按钮。

      11. 双击摄像机节点自动播放视频,双击节点自动依次添加视频,会自动跳到下一个,双击父节点自动添加该节点下的所有视频。可选主码流、子码流。

      12. 录像机管理、摄像机管理,可添加删除修改导入导出打印信息,立即应用新的设备信息生成树状列表,不需重启。

      13. 可选多种内核自由切换,ffmpeg、vlc、mpv等,均可在pro中设置。推荐用ffmpeg,跨平台最多,默认提供好了linux和mac平台上编译好的库。

      14. 支持硬解码,可设置硬解码类型(qsv、dxva2、d3d11va等)。

      15. 默认采用opengl绘制视频,超低的CPU资源占用,支持yuyv和nv12两种格式绘制,性能爆表。

      16. 标签和图形信息支持三种绘制方式,绘制到遮罩层、绘制到图片、源头绘制(对应信息可以存储到文件)。

      17. 包括但不限于视频监控内核组件的所有功能,可参阅说明书中功能介绍 视频监控内核

      18. 高度可定制化,用户可以很方便的在此基础上衍生自己的功能,比如增加自定义模块,增加运行模式、机器人监控、无人机监控、挖掘机监控等。

      19. 支持xp、win7、win10、win11、linux、mac、各种国产系统(UOS、中标麒麟、银河麒麟等)、嵌入式linux等系统。

      20. 注释完整,项目结构清晰,超级详细完整的使用开发手册,精确到每个代码文件的功能说明,不断持续迭代版本。

      0.7 地址格式

      0.7.0 特别提示

      1. 由于编解码涉及到很多参数,一般都按照默认参数进行处理。

      2. 部分用户有时候希望通过填入的播放地址就带上这些信息,比如通信协议、桌面采集的分辨率、编码保存是否转码、转码是否缩放原图等。

      3. 各种参数设置有个优先级,优先取地址中带的,没有带则取结构体中的,还没有则取默认值。

      4. 有些值会根据具体情况自动调整,比如本地设备采集没有硬解码,udp开头的视频流强制用udp协议,有些不支持硬解的格式自动将硬解码=none。

      5. 对于需要在地址中指定参数,对应占位符不填的需要占位符留空,不可以跳过。

      6. 占位符中填了对应参数的必须严格按照指定的格式要求,不按照则很可能导致解析失败。

      7. 参数用英文竖杠 | 隔开。

      0.7.1 通用格式

      1. 格式要求: url|transport|decodeType|encodeVideo|encodeVideoFps|encodeVideoRatio|encodeVideoScale。

      2. url表示媒体地址,比如 f:/1.mp3 d:/1.mp4 rtsp://192.168.0.100 等。

      3. transport表示通信协议,可选 tcp/udp,一般用于rtsp视频流,很多时候在linux系统中必须指定tcp,rtsp摄像头才能正常采集。

      4. decodeType表示解码策略,0-速度优先,1-质量优先,2-均衡处理,3-最快速度(不做音视频同步,收到就立马解码和显示)。

      5. encodeVideo表示视频编码格式,0-不做处理,1-自动转码(源头是264就264/265就265),2-强制用264编码,3-强制用265编码。

      6. encodeVideoFps表示编码帧率,默认取源头流的帧率,如果指定了则取指定的。

      7. encodeVideoRatio表示视频压缩比率,对应bit_rate的值,在不改变分辨率的情况下,通过调整这个参数来控制保存文件体积的大小。范围值0-1。

      8. encodeVideoScale表示视频缩放值,字符串类型,如果值float值,则相当于在原有分辨率按照这个值等比例缩放,比如encodeVideoScale=0.5,视频源分辨率是1920x720,则编码保存按照960x360这个分辨率保存。如果是640x480,则按照指定的这个分辨率强制缩放,可能会变形。

      0.7.2 本地设备

      1. 格式要求:url|bufferSize|frameRate|codecName。

      2. url表示媒体地址,采集摄像头统一约定 video=或者audio=开头。

      3. bufferSize表示分辨率,可填1280x720这种,不填默认640x480。

      4. frameRate表示帧率,不填默认25。

      5. codecName表示解码器名称,有些本地摄像头可以指定解码器名称比如mjpeg/h264,前提是要该设备支持该解码器。默认为空则不指定会自动处理。

      6. win系统如何查看设备名见本文档中 打开本地摄像头

      7. linux系统查看设备名直接执行命令 ls /dev/video * 即可,一般对应的设备名是 /dev/video0。

      8. 下面假定本地摄像头的设备名为 USB Video Device。

      9. 写法1:video=USB Video Device,这种写法默认按照640x480分辨率打开摄像头。

      10. 写法2:video=USB Video Device|1280x720|30,这种写法按照指定的分辨率1280x720以及采集帧率30来打开摄像头。

      11. 写法3:video=/dev/video0,这种是对应linux系统,程序内部会自动过滤和调整填入的地址。

      12. 写法4:audio=麦克风 (USB Audio Device),只采集本地麦克风。

      13. 写法5:video=USB Video Device:audio=麦克风 (USB Audio Device),同时采集本地摄像头和麦克风。

      14. 写法6:video=USB Video Device|1920x1080|30|h264,按照1080P分辨率30帧h264格式解码来打开摄像头。

      15. 约定audio=开头是只采集音频,video=开头可以采集视频或者视音频。

      16. 如果指定了分辨率和帧率则需要硬件支持才行,比如摄像头的最大分辨率是640x480,而指定了1280x720则会打开失败。

      0.7.3 本地桌面

      1. 格式要求:url|bufferSize|frameRate|offsetX|offsetY|screenIndex|encodeVideoScale。

      2. url表示媒体地址,采集桌面统一约定 screen=开头。

      3. bufferSize表示采集分辨率,不填则默认取屏幕分辨率。

      4. frameRate表示采集帧率,基本上在2-30之间,不填的话默认ffmpeg会设定一个值,有时候是30。

      5. offsetX/offsetY表示偏移值XY坐标,从屏幕的左上角(0,0)开始。

      6. screenIndex表示屏幕索引,不填的话则默认取当前鼠标所在屏幕。在多个屏幕的时候可通过此参数指定屏幕索引。

      7. encodeVideoScale表示缩放,1表示原始比例(默认值1),0.2则表示按照原始分辨率等比例0.2倍缩放,也可以填400x300表示强制按照这个分辨率缩放。这个在高分辨率的时候特别有用,比如采集的桌面分辨率很大,但是传输的时候受限于带宽,需要等比例压缩一下再传输,此时可以填0.5/0.2之类的值。

      8. 写法1:screen=desktop,当前屏幕全屏采集。

      9. 写法2:screen=desktop||15|0|0|1,屏幕2全屏采集,帧率15。

      10. 写法3:screen=desktop|800x600|10|50|100,鼠标所在当前屏幕采集,采集区域rect(50,100,800,600),帧率10。

      11. 写法4:screen=desktop|10x10,约定10x10分辨率表示所有屏幕合并到一个屏幕采集,比如两个屏幕的时候,当做一个屏幕整体采集。当合并屏幕采集的时候,XY偏移值参数无效。

      12. 写法5:screen=desktop|800x600|25|1500|300|255,约定屏幕索引255则取用户自定义的区域,该字符串表示采集区域是(1500, 300, 800, 600),自由区域,可以任意指定,比如两个屏幕中间区域。前提只要保证该区域在两个屏幕区域中,如果超过了的话可能采集失败,这要求用户需要对采集区域精准定位。

      13. 写法6:screen=title=MainWindow,对指定窗口标题是MainWindow的窗体采集。支持中文标题比如screen=title=系统设置。

      14. 经过大量测试发现,如果打包发布的Qt程序带了qt.conf文件并且里面指定了 WindowsArguments = dpiawareness=0 ,在电脑分辨率设置了缩放比不为100%的时候,计算出来的桌面区域未必正确,建议如果此种情况下一定要采集正确的桌面,去掉qt.conf文件中的对应内容或者删除qt.conf文件即可。

      0.7.4 电视频道

      1. 中央综合:http://39.135.138.60:18890/PLTV/88888910/224/3221225618/index.m3u8

      2. 中央新闻:http://39.135.138.60:18890/PLTV/88888910/224/3221225638/index.m3u8

      3. 中央音乐:http://39.135.138.60:18890/PLTV/88888910/224/3221225641/index.m3u8

      4. 中央电视:http://39.135.138.60:18890/PLTV/88888910/224/3221225635/index.m3u8

      5. 中央记录:http://39.135.138.60:18890/PLTV/88888910/224/3221225646/index.m3u8

      6. 中央少儿:http://39.135.138.60:18890/PLTV/88888910/224/3221225639/index.m3u8

      7. 湖南卫视:http://39.135.138.60:18890/PLTV/88888910/224/3221225745/index.m3u8

      8. 深圳卫视:http://39.135.138.60:18890/PLTV/88888910/224/3221225741/index.m3u8

      9. 上海纪实:http://39.135.138.60:18890/PLTV/88888910/224/3221225654/index.m3u8

      10. 天津卫视:http://39.135.138.60:18890/PLTV/88888910/224/3221225739/index.m3u8

      0.7.5 视频文件

      万能办法,用谷歌或者谷歌内核的浏览器,打开时光网 http://www.mtime.com/ ,随便打开个视频,这里一般是预告片,按F12切换到审查元素,顶部切换到网络,选中媒体,刷新网页,按照尺寸排列,最大的那个MP4文件就是,鼠标右键复制地址,这个地址就是完整的网络地址。

      1. http://vfx.mtime.cn/Video/2021/11/16/mp4/211116131456748178.mp4

      2. http://vfx.mtime.cn/Video/2023/03/09/mp4/230309152143524121.mp4

      3. http://vfx.mtime.cn/Video/2023/03/07/mp4/230307085324679124.mp4

      4. http://vfx.mtime.cn/Video/2022/07/18/mp4/220718132929585151.mp4

      5. http://vfx.mtime.cn/Video/2022/12/17/mp4/221217153424902164.mp4

      6. http://vfx.mtime.cn/Video/2022/07/04/mp4/220704110656040153.mp4

      7. http://vfx.mtime.cn/Video/2021/02/08/mp4/210208150307073134.mp4

      8. http://vfx.mtime.cn/Video/2021/05/11/mp4/210511114524329144.mp4

      9. http://vfx.mtime.cn/Video/2021/04/20/mp4/210420113022586184.mp4

      10. http://vfx.mtime.cn/Video/2021/03/13/mp4/210313111010421158.mp4

      11. http://vfx.mtime.cn/Video/2020/01/15/mp4/200115125943120574.mp4

      百度视频

      1. https://vd2.bdstatic.com/mda-nhpqy7k8xamgiqw3/720p/h264/1661362621500413748/mda-nhpqy7k8xamgiqw3.mp4

      2. https://vd2.bdstatic.com/mda-nhp9zvu4tiinsp7z/576p/h264/1661324637707658476/mda-nhp9zvu4tiinsp7z.mp4

      3. https://vd4.bdstatic.com/mda-nhp77xn7fx3e0jgb/576p/h264/1661317610850513689/mda-nhp77xn7fx3e0jgb.mp4

      4. https://vd2.bdstatic.com/mda-nhp72n8xvbtdcmcq/576p/h264/1661317214259599500/mda-nhp72n8xvbtdcmcq.mp4

      5. https://vd2.bdstatic.com/mda-nhp6z0in87tvw77v/576p/h264/1661316943890074768/mda-nhp6z0in87tvw77v.mp4

      6. http://vd3.bdstatic.com/mda-jennyc5ci1ugrxzi/mda-jennyc5ci1ugrxzi.mp4

      7. http://vd2.bdstatic.com/mda-mhhf5mr00yyhpfjs/1080p/cae_h264/1629284581057661229/mda-mhhf5mr00yyhpfjs.mp4

      8. http://vd2.bdstatic.com/mda-mhig1c3sw223mx8p/1080p/cae_h264/1629380139191731149/mda-mhig1c3sw223mx8p.mp4

      9. http://vd3.bdstatic.com/mda-mekfm7wu6f4rtt99/1080p/cae_h264/1621595318412084671/mda-mekfm7wu6f4rtt99.mp4

      10. http://vd2.bdstatic.com/mda-mesdm11tdp69a9ye/1080p/cae_h264/1622115758783335310/mda-mesdm11tdp69a9ye.mp4

      时间很短的视频文件

      1. https://highlight-video.cdn.bcebos.com/video/6s/95ae2066-ee02-11ed-9f01-6c92bf5ceb6f.mp4

      2. https://highlight-video.cdn.bcebos.com/video/6s/1a74a352-d1fb-11ed-829b-6c92bf468c1f.mp4

      3. https://highlight-video.cdn.bcebos.com/video/6s/e0d35168-edf5-11ed-8709-6c92bf3b0281.mp4

      4. https://highlight-video.cdn.bcebos.com/video/6s/0757f6ec-ee03-11ed-85d3-6c92bf3b0af4.mp4

      5. https://highlight-video.cdn.bcebos.com/video/6s/6ffb9cbe-ee01-11ed-916c-6c92bfb45e04.mp4

      专业测试视频播放器的各种文件 http://samples.mplayerhq.hu/

      0.7.6 监控设备

      下面列出的是一些常用厂家的格式,不同厂家格式不一样,具体什么格式请咨询厂家索要对应的视频流格式,或者设备支持onvif的话,通过onvif工具搜索可以拿到视频流格式。

      0.7.6.1 海康
      0.7.6.2 大华
      0.7.6.3 常规

      0.7.7 指定协议

      1 登录退出

      1.1 用户登录

      系统启动后,首先会弹出用户登录界面,从用户姓名的下拉框选择用户名,然后输入密码(默认用户名密码都是admin),单击登录按钮,密码正确则会进入到系统主界面,错误会弹出提示,错误超过三次自动关闭,需要重新打开软件。

      在登录界面可以勾选是否记住密码,是否自动登录,如果勾选了记住密码,则下次启用软件会自动填入最后用户的密码,勾选了自动登录(以最后的用户信息作为当前登录用户)则启动后直接进入主界面。如果开启了自动登录,不会弹出登录界面,可以在系统设置中关闭自动登录和记住密码。

      1.2 用户退出

      在主界面单击右上角的关闭按钮,会弹出用户退出界面,需要输入密码验证防止误关闭,会自动填入登录的用户名,密码输入正确才会退出软件。用户登录和退出都内置了超级密码a防止管理员忘记密码。

      2 模块功能

      主界面由顶部主菜单导航、左侧右侧停靠窗体(设备列表、窗口信息、图文警情、悬浮地图、云台控制、设备控制、预置巡航、视频轮询等)、中间视频监控主画面组成,其中左右两侧的停靠窗体可以拉伸宽度,上下停靠窗体之间也可以拉伸高度,每个停靠窗体都可以关闭和悬浮。自动保存布局文件,下次启动自动应用。

      1. 所有模块都是停靠窗体。

      2. 可以任意组合多种子模块。

      3. 模块可停靠悬浮。

      4. 在普通模式和全屏模式都有独立的布局文件。

      5. 不同的工作模式都可对应不同的布局文件。

      2.1 模块显示

      左侧和右侧的面板,可以通过单击面板右上角的关闭按钮来隐藏,当隐藏一个面板以后,剩余的面板会自动填充布局,如果需要重新显示面板,则在标题栏鼠标右键就可以对小面板进行显示和隐藏,右上角的时间和CPU显示面板可以在系统设置中控制显示隐藏。系统会自动记住最后的布局比如显示的面板和宽高占比,下次启动后自动应用。

      1. 在停靠窗体的标题栏鼠标右键也会弹出子窗体的开启菜单,复选框勾选表示显示,悬浮的窗体没有这个特性,一定要是嵌入在主界面中的子窗体标题栏才有。

      2. 如果是全屏模式,由于没有了标题栏,想要关闭模块的话,需要将其拖动到边缘嵌入主窗体,然后在标题栏鼠标右键菜单中关闭即可。

      2.2 模块拖动

      面板和面板之间有个分隔条,鼠标移到对应分隔条的地方,会变成可拉动的鼠标指针,此时可以上下左右拉动调整宽高,调整好以后会自动保存宽高比例,下次启动后自动应用最后的配置来显示。

      2.3 视频播放

      视频播放支持多种方式:

      1. 双击子节点播放单个摄像机,在当前选中通道处播放。

      2. 双击父节点播放整个录像机的摄像机,依次排列。

      3. 按住子节点拖曳到对应通道,播放摄像机。

      4. 本地文件直接拖曳到通道,自动播放本地文件。

      5. 启动后自动播放最后通道的视频信息。

      6. 代码接口提供指定通道播放url,AppEvent::Instance()->slot_loadVideo。

      7. 代码接口提供指定两个通道交换,AppEvent::Instance()->slot_changeVideo,比如报警的时候将某个通道移到最前面显示。

      2.4 视频截图

      视频截图支持多种方式:

      1. 监控通道鼠标右键,弹出菜单选择截图当前视频/截图所有视频。

      2. 视频面板底部工具栏截图按钮。

      3. 每个通道悬浮工具条截图按钮。

      4. 截图默认保存在可执行文件所在目录下的image_normal目录,文件名格式ch01_2028-11-24-13-41-24-000.jpg。

      5. 底部工具栏截图按钮触发截图后会弹出提示抓拍文件后的保存位置。

      2.5 删除视频

      有多种方法可以删除视频:

      1. 鼠标右键删除当前视频。

      2. 鼠标右键删除所有视频。

      3. 按住通道画面移出视频监控画面。

      4. 悬浮条关闭按钮。

      2.6 画面切换

      -

      系统支持多画面切换,全屏切换等,包括1/4/6/8/9/13/16/25/36/64画面切换,如果还需要增加更多的画面比如81/100/255等,可以直接在videobox.cpp源码中稍微修改即可。

      画面切换支持多种方式:

      1. 鼠标右键画面切换。

      2. 底部左侧画面切换缩略图。

      3. 快捷键alt+enter全屏。

      4. 快捷键esc退出全屏。

      5. 切换到X画面,标准的行列数通道布局,比如竖屏一般需要4x2这种,表示4行2列布局。

      6. 切换到Y画面,自定义的一些布局,比如通道01-通道02表示左右两侧各一个通道。通道01-通道03表示上面一整个通道,下面左右两侧各一个通道。可以自行在videobox类中增加或者修改。

      2.7 声音调节

      在主界面画面栏右下角,按下声音图标自动弹出声音调节面板,失去焦点自动隐藏,拉动声音滚动条来调节声音大小,还有静音切换。右下角的声音和静音切换是针对所有通道的,单个通道可以在每个通道的悬浮条工具栏中单击静音切换按钮。

      2.8 视频轮询

      参数说明:

      2.9 通道交换

      通道交换功能很常用,一般用户喜欢调整自己想要的通道显示到前面或者占据画面的更大部分,比如6画面8画面的时候,左侧有一个画面占据很大的位置,一般这个用来显示重要性最高的实时视频,如果需要通道交换,则按住通道拖动到另外一个通道上面松开鼠标即可,会立即应用,瞬间切换,这里切记不要移出视频画面外,移出去表示删除。

      本系统也封装了代码中动态控制切换和动态交换,具体演示示例代码在DeviceThreadUI类中,具体全局调用函数在AppEvent类中,具体执行在frmVideoPanelTool窗体类中。

      2.10 云台控制

      如果需要控制云台移动,先要选择对应的通道,边缘会高亮,进行云台控制的前提是该摄像机要是支持云台的摄像机,很多人以为啥摄像机都可以移动,这是错误的,如果摄像机不支持云台,这个功能就别玩了,玩不起,经常遇到一些人说怎么云台不能用了,一检查尼玛原来摄像机根本没有云台。

      本系统云台控制走的是onvif协议,没有使用私有协议,上百家厂家的摄像机,走私有协议会玩死人的,所以统一采用onvif通用协议,需要提前在系统设置中的摄像机管理,搜索摄像机,输入正确的onvif用户信息后一键获取到云台地址。具体操作参见 设备搜索

      2.11 设备控制

      设备控制部分,目前可以获取和设置图片参数、手动校时、重启设备、抓拍图片等,和云台控制操作一样,操作前也是需要选中某个通道,然后才是对选中的通道进行设备控制,比如图片参数中的明亮度、对比度、饱和度、尖锐度。

      后面把OSD配置模块和网络配置模块也放在这里,因为这几个模块参数排列不适合作为悬停模块,所以统一放在设备控制模块中,通过单击按钮切换出来。

      2.12 报警订阅

      本系统默认支持海康、大华、宇视、华为、天地伟业等厂家的摄像机的报警事件订阅,可以在系统设置中的视频参数设置中开启事件订阅开关,如果摄像机已经开启了报警事件的话(一般摄像机的网页配置界面进去有移动侦测、遮挡报警、人脸识别、报警输入等各种),默认一般是关闭的,比如摄像机后面的开关量输入报警接口,需要web页面进去设置开启。具体操作参见 报警输入设置

      报警订阅走的是onvif协议,具体事件内容和含义可以在config/event.txt事件字典表中修改,由于onvif事件有多种,而且不同厂家对应关键字对应的事件含义可能不一样,不同厂家的设备可能含义有点出入,所有可以通过事件字典表自行更改,对应内容含义 事件等级/唯一标识/报警字样/解除字样,默认程序按照这个表中的进行过滤,不在表中的可以正常收到但是不会处理。具体处理逻辑代码在DeviceOnvif类中。

      常用几种事件字典:

      2.13 悬浮工具

      悬浮条功能介绍:

      1. 内置悬浮条控件,悬浮条位置支持顶部、底部、左侧、右侧。

      2. 悬浮条控件参数包括边距、间距、背景透明度、背景颜色、文本颜色、按下颜色、位置、按钮图标代码集合、按钮名称标识集合、按钮提示信息集合。

      3. 悬浮条控件一排工具按钮可自定义,通过结构体参数设置,图标可选图形字体还是自定义图片。

      4. 悬浮条按钮内部实现了录像切换、抓拍截图、静音切换、电子放大、关闭视频等功能,也可以自行在源码中增加自己对应的功能。

      5. 悬浮条按钮对应实现了功能的按钮,有对应图标切换处理,比如录像按钮按下后会切换到正在录像中的图标,声音按钮切换后变成静音图标,再次切换还原。

      6. 悬浮条按钮单击后都用名称唯一标识作为信号发出,可以自行关联响应处理。

      7. 悬浮条空白区域可以显示提示信息,默认显示当前视频分辨率大小,具体要显示哪些信息在系统设置中的功能激活中勾选。

      2.14 电子放大

      在悬浮条中单击电子放大按钮,可以切换到电子放大状态,然后在画面上选取一块区域,选取的时候会自动绘制对应的矩形,鼠标松开后会自动放大显示选取的区域。为了能够区分哪些通道处于电子放大状态,在单击了电子放大按钮后,悬浮条会一直显示,直到再次单击该按钮撤出电子放大状态。画面模式和原始的视频显示模式一致,如果画面模式是拉伸填充则电子放大的画面也是拉伸填充。

      2.15 标签图形

      可动态添加任意多个osd标签信息,标签信息包括名字、是否可见、字号大小、文本文字、文本颜色、标签图片、标签坐标、标签格式(文本、日期、时间、日期时间、图片)、标签位置(左上角、左下角、右上角、右下角、居中、自定义坐标)。

      具体结构体参数和使用方法如下:

      2.16 预置巡航

      预置位功能,只对带有预置位的球机才起作用,有云台的球机未必有预置位,要仔细查看清楚,不清楚可以询问厂家或者查阅手册,在本模块中,可以获取预置位、添加预置位、调用预置位、删除预置位、调用起始位、设置起始位、开始巡航、停止巡航等。

      获取预置位以后,会将获取到的预置位集合(一般有255个甚至更多)显示到列表中,前面是编号token,后面是预置位的别名name,别名可以是中文的,可以通过添加预置位的时候设置中文的名称。在每个预置位信息后面都有三个按钮:调用、添加、删除,直接单击即可执行相应的动作,拉伸子模块窗体对应名称列自动拉伸填充。

      自动巡航目前采用的策略是通过勾选查询回来的预置位信息,勾选,然后定时器每隔一段时间调用一次对应的预置位来实现,每次正在执行哪个预置位会在列表中自动选中该预置位,后期如果有更好的处理方法会自动更新改进代码。

      操作步骤:

      1. 左侧选中通道,前提是该通道的设备支持预置位,一般是球机才有预置位。

      2. 单击获取预置位,所有预置位信息会表格形式显示,每个预置位有唯一编号和名称,名称可以修改,编号改不了。

      3. 预置位表格中三个按钮依次为执行、更新、删除。

      4. 单击执行按钮(三角形状),会调用对应的预置位,设备会切换到对应预置位对应的位置。

      5. 单击更新按钮(加号形状),将当前设备停留的位置作为新的位置更新对应预置位。

      6. 单击删除按钮(删除形状),将当前选中的预置位信息删除,有部分设备仅仅是删除位置信息,预置位还会在,具体要看设备的支持。

      7. 输入预置位名称,调整画面到要新加的预置位置,单击添加预置位按钮,会新增加一个预置位。

      8. 调用起始位,一般是球机的默认开机后的位置,原始位置,单击调用起始位按钮后,会自动切换过去。

      9. 设置起始位,将当前位置设置为起始位置。

      2.17 OSD配置

      操作步骤:

      1. 左侧选中通道,前提是该通道的设备支持OSD的onvif协议设置,一般大厂的都会支持。

      2. 单击获取OSD,所有OSD的唯一标识自动列在列表框中。

      3. 选中一个OSD,会自动获取该OSD的详细信息然后填入在下面,比如坐标位置、字体大小、标签类型等。

      4. 单击添加OSD,会将填写好的对应唯一标识的OSD添加到设备中,一般摄像头会限制OSD的数量,如果已经存在了很多OSD,有可能添加会失败,很多设备会限制最大支持4个OSD。

      5. 添加OSD的时候未必是按照填写的唯一标识来添加,设备一般按照自己的命名规则,所以该字段默认即可,比如海康的OSD标识都是OsdToken字样开头。

      6. 修改OSD,一般支持的修改字段是坐标位置和文字内容,当然这两个也基本上是最常用的需要修改的字段,一般设备不支持将日期时间类型的OSD修改成文字文本类型的OSD,可以选择删除再添加的方式来实现。

      7. 很多设备会限制只支持1个日期时间的OSD和多个文字文本的OSD,所以如果你添加多个日期时间OSD的时候,可能会失败。

      8. 单击删除OSD会将当前选中的OSD删除,删除后会重新读取所有OSD信息。

      9. 在左侧通道上按下鼠标,会自动将鼠标按下处的位置对应的真实像素坐标发送到坐标位置文本框中,以便添加和修改OSD。

      2.18 网络配置

      操作步骤:

      1. 左侧选中通道,前提是该通道的设备支持onvif协议做网络设置,一般大厂的都会支持。

      2. 单击获取网络按钮,会自动获取网络信息,包括主机名称、网络地址、子网掩码等。

      3. 左侧填好信息后,单击设置网络,会将新的网络配置信息通过onvif协议下发给设备。

      4. 一般建议重新修改了设备网络地址后,摄像头管理那边也需要做相应的修改。

      2.19 图文警情

      如果开启了警情订阅,则触发报警后,会自动抓拍报警图片,和对应的警情内容和报警事件以图文卡片的形式展示在图文警情模块中。双击可以查看详细的报警图片,对应的警情信息存储的日志记录中,可以到日志记录中查询。

      2.20 设备列表

      设备列表通过读取录像机信息和摄像机信息,自动生成设备列表,每个摄像机都对应一个主码流和子码流。录像机用于生成父节点,相当于区域,录像机信息本身在整个系统中目前就一个作为设备列表的区域信息功能,用户可以自行拓展作为其他用途。

      操作步骤:

      1. 双击顶层父节点,自动打开该分组下的所有摄像头。

      2. 双击摄像头节点,自动打开该摄像头,具体是子码流还是主码流,按照系统设置中的视频参数的码流类型来决定。

      3. 双击码流子节点,自动打开对应码流的地址。

      4. 按照节点拖曳到视频控件,自动打开对应视频流。

      5. 鼠标右键弹出菜单,目前可以刷新所有通道,其他功能菜单是演示。比如开始对讲功能,需要自行实现代码。

      2.21 窗口信息

      窗口信息负责显示一些打印信息,比如通道打开,摄像机是否异常,各种报警日志等,可以在系统设置中设置不同的文字颜色,窗口信息的信息条数自动计算,保证最大可能的适应高度。

      3 视频回放

      视频回放中有多个子模块,分别是不同的含义:

      1. 本地回放:回放存储在本地电脑的视频文件。

      2. 网络回放:通过sdk方式回放NVR上的存储录像(暂未实现,每个厂家不一样)。

      3. 远程回放:通用的rtsp取流形式的播放实时视频和回放录像文件,支持海康大华等厂家的NVR回放。

      4. 图片回放:查找对应文件夹下的所有通道图片,按照设定的间隔回复,类似视频效果,一般用在存储一堆图片序列的应用场景中。

      5. 视频上传:将查询的本地存储的视频文件上传到云端服务器。类似于将视频文件存储到服务器上,需要手动填写服务器地址和端口。

      3.1 本地回放

      3.1.1 视频查询

      操作步骤:

      1. 选择设备通道(可以选择所有通道或者某个通道)。

      2. 选择视频类型(存储视频/报警视频),目前只有存储视频。

      3. 选择时间范围,考虑都范围大文件数量过多,默认限定查询60天内范围的视频。

      4. 单击查询按钮,符合条件的视频文件都会列出来,双击可以播放。

      5. 每个文件前面都有复选框,可以勾选用于下载和删除。

      6. 单击下载按钮,会将当前选中的文件拷贝到选择的目录。

      7. 单击删除按钮,会将当前选中的文件删除。

      8. 单击清空按钮,会将所有查询出来的文件全部删除。

      9. 播放过程中实时显示播放进度,可以单击或者拖动进度条切换进度。

      10. 默认播放完成一个会自动播放下一个,如果有下一个的话。

      11. 进度条左侧显示当前播放时长和文件总时长。

      12. 进度条右侧有三个按钮,分别是播放/暂停按钮、停止按钮、静音切换按钮。

      13. 右上角可以选择播放速度,播放过程中也会立即应用,可选0.5倍速、1.0倍速、2.0倍速、4.0倍速、8.0倍速等。

      3.1.2 存储规则

      1. 默认存储主目录 video_normal。

      2. 主目录下按照日期目录存放(2025-10-01/2025-10-31)。

      3. 日期目录下是单个视频文件(ch01_2025-04-07-14-08-11.mp4/ch02_2025-04-07-14-08-11.mp4)。

      4. 拓展功能可以存储对应的数据文件比如经纬度数据和视频文件一个目录(名称一样并且拓展名可以是txt)。

      3.2 网络回放

      网络回放模块是通过sdk的形式回放远程网络中NVR设备上的录像文件,这个暂未实现,本系统主要是为了兼容性和通用性,通过具体sdk形式调用的处理都没有做,破坏了移植性,到了其他平台就没法使用了。

      3.3 远程回放

      远程回放模块主要是通过rtsp视频流的形式来拉取实时视频和回放视频,现在越来越多的NVR支持直接通过取流的形式来拉取实时视频流和回放视频,这样使用起来很方便,当然在拉取视频流的时候要传入用户信息,防止非法获取,现在越来越多的应用场景需要通过NVR来调取回放视频,传统的SDK的方式非常累厂家太多,而国标的形式太繁琐复杂,于是rtsp形式的最简单的方式应运而生,目前支持的厂家也越来越多,每个厂家格式的规则不一样,可以自行咨询厂家的规则,本程序默认实现了海康、大华的规则。

      操作步骤:

      1. 选择设备厂家,不同厂家rtsp视频流格式不一样,内置支持了海康、大华、通用的。

      2. 选择视频类型,支持实时视频和回放视频两种,回放视频还要选择时间范围。

      3. 填写用户名称、用户密码,最后组成rtsp视频流字符串一起。

      4. 填写或者下拉选择设备地址,填写IP地址,默认会把录像机管理中添加的设备地址填充到下拉框。

      5. 选择设备通道,一个设备比如NVR可能有多个通道,摄像机一般只有1个通道。

      6. 选择码流类型,可以选择主码流、子码流、三码流。

      7. 选择时间范围,实时视频不用选,回放视频才需要。

      8. 左侧选中某个通道,单击开始播放按钮,会将对应参数组成的rtsp视频流地址打开。

      9. 单击关闭所有按钮,会一次性关闭4个通道。如果想要关闭单个通道,直接在视频控件悬浮条中单击右上角的关闭按钮。

      10. 勾选递增复选框,则播放完一个通道,通道下拉框会自动切换到下一个通道,这样只需要一直点开始播放按钮即可。

      11. 同步播放进度,勾选后,切换某一个通道的进度,其他几个通道也会自动切换到对应进度。

      12. 每个通道都有播放进度和总时长以及进度条,可以切换进度条切换对应的播放进度,也可以单击暂停按钮进行暂停和继续播放。

      13. 不是所有通道都支持切换播放进度,经过大量测试发现,哪个厂家的NVR只支持该厂家的IPC,比如大华的NVR,通道1添加的是海康的IPC,则该通道无法切换播放进度,通道2添加的是大华的IPC,则该通道可以切换播放进度。这样处理也是有一定道理的,毕竟厂家都希望你买的都是他们家的设备。

      3.4 图片回放

      3.4.1 图片查询

      选择设备通道和时间范围,单击查询按钮,会将查询到的图片序列按照日期的形式作为一行添加到列表结果中,双击可以自动播放,可以调节播放速度。

      3.4.2 存储规则

      1. 默认存储主目录 image_normal

      2. 主目录下按照日期目录存放(2025-10-01/2025-10-31)

      3. 日期目录下是单个图片文件(ch01_2025-04-07-14-08-11-222.jpg/ch02_2025-04-07-14-08-11-333.jpg)

      4. 拓展功能可以存储对应的数据文件比如警情文字和图片文件一个目录(名称一样并且拓展名可以是txt)

      3.4.3 导出报告

      这个功能专门演示导出图文警情的报警,可以自定义信息,封装好的类,传入图片队列,图片自适应等比例缩放显示,超过自动分页。

      3.5 视频上传

      视频上传功能主要用来将本地存储的视频文件(也可以是其他文件),通过网络传输(默认TCP)上传到其他地方比如服务器,服务器上要运行接收文件的程序,这样就相当于远程备份视频文件的功能,视频文件可以勾选需要上传哪一些。

      3.5.1 本地设置

      本地只需要在视频监控系统客户端上切换到视频上传页面,然后选择要查询的日期范围,单击查询,会将视频文件查询出来显示在左边的表格中,可以勾选要上传的视频文件,右侧填写好服务器的IP和端口(默认6000),单击上传按钮,会多线程的形式上传文件。

      3.5.2 远程设置

      远程需要放置文件传输工具,该工具完整源码如果购买了视频监控系统,可以赠送,该工具同时具备了发送端和接收端的功能,配套视频监控系统使用的是接收端,视频监控系统作为发送端,填好监听端口后,单击监听按钮,一旦有连接文件上传,会自动显示对应的接收进度,文件名称以上传的文件名为准。

      3.5.3 文件加密

      默认文件传输过程采用了加密机制,意味着传输的数据是加密后的数据,接收到以后根据设置的秘钥进行解密重新生成文件,防止文件传输过程中被拦截,可自定义加密规则。

      3.5.4 功能特点

      1. 多线程收发文件,支持加密传输。

      2. 接收端支持监听端口接收文件和主动连接服务器接收文件两种方式。

      3. 按照 文件开始符+文件大小+文件内容+文件结束符 逐个分包接收。

      4. 可对接收的加密过的文件包进行解密输出。

      5. 如果采用连接服务器方式接收文件可指定请求文件。

      6. 接收端请求文件的形式可以作为通用的程序升级方案。

      7. 进度条实时更新收发文件的进度。

      8. 发送端可设置每个包最很大小即切片分包数量。

      9. 发送端可对文件的每个包进行加密传输。

      10. 发送端支持对包进行合并发送。

      11. 可指定目录对客户端发来的请求文件进行搜索。

      12. 每个功能独立的一个类,接口清晰友好,使用方便。

      13. 支持任意Qt版本、任意系统、任意编译器。

      4 电子地图

      电子地图有多个子模块,分别不同的功能,在每个模块上,双击对应的摄像机,都可以弹出实时视频预览画面,支持多个画面同时打开,每个摄像机都一个画面窗体。

      1. 图片地图:摄像机分布在平面图上。

      2. 离线地图:默认采用百度离线瓦片地图,本地使用。

      3. 在线地图:默认采用百度地图,需要联网使用。

      4. 路径规划:指定起始点和终点经纬度坐标,查询最优路径并绘制路线,提取路线坐标集合,动态模拟轨迹,比如机器人和飞机轨迹。

      4.1 双击预览

      4.2 图片地图

      1. 图片地图的功能是为了方便直接提供图片文件,然后摄像机点位可直接拖动,更精确定位的场景,图片可以提供鸟瞰图这种,看起来更直观大气,有3D的感觉。

      2. 图片文件存放在可执行文件下的map文件夹下,如果需要增加或者删除,可以直接文件操作即可,比如复制新的图片文件到这个目录下即可。

      3. 具体摄像机对应哪张图片,可以在摄像机管理中设置,对应字段为地图,直接下拉选择对应的地图即可,默认选择无,就是该摄像机不属于任何地图。

      4.3 离线地图

      功能和在线地图完全一致,唯一区别就是地图是离线的,不需要联网。离线的地图需要自己准备好,可以网上通过瓦片地图下载器来下载需要的地方的离线地图,一般离线地图比较大,他是一张张图片,所以建议离线地图只下载自己需要的即可,比如某个县的地图,而不是所有的,所有的起码有几十GB。

      使用说明

      1. 默认系统提供的是上海市的地图。

      2. 下载地址在下面文章中,会自动更新地址。 -https://blog.csdn.net/feiyangqingyun/article/details/104005917

      3. 请下载同目录下的bin_map_tiles.zip压缩包,解压到config目录下,最后config文件夹下会多出来tiles tiles_hybrid两个文件夹。

      4.4 在线地图

      在摄像机管理的界面,可以添加经纬度信息,这样就可以在地图上显示对应的摄像机点位信息,如果发现位置不对,可以在右侧先选择摄像机设备,然后鼠标单击新的位置,右侧目标经度、目标纬度信息会自动更新,然后再单击更新经纬度值则会更新当前下拉选择的设备的经纬度信息,也可以在摄像机管理界面手动填入进行修改。

      在右侧还有模拟运动轨迹、开始显示轨迹两个按钮,有可能后期还会增加其他功能,是为了演示如何在地图上实现地图的相关功能,开始显示轨迹采用的定时器来生成轨迹点数据,动态模拟运动轨迹,可以单击显示设备位置按钮还原最初的设备点位图。

      功能特点

      1. 同时支持在线地图和离线地图两种模式。

      2. 同时支持webkit内核、webengine内核、IE内核。

      3. 支持设置多个标注点,信息包括名称、地址、经纬度。

      4. 可设置地图是否可单击、拖动、鼠标滚轮缩放。

      5. 可设置协议版本、秘钥、主题样式、中心坐标、中心城市、地理编码位置等。

      6. 可设置地图缩放比例和级别,缩略图、比例尺、路况信息等控件的可见。

      7. 支持地图交互,比如鼠标按下获取对应位置的经纬度。

      8. 支持查询路线,可设置起点位置、终点位置、路线模式、路线方式、路线方案(最少时间、最少换乘、最少步行、不乘地铁、最短距离、避开高速)。

      9. 可显示点线面工具,可直接在地图上划线、点、矩形、圆形等。

      10. 可设置行政区划,指定某个城市区域绘制图层,在线地图自动输出行政区划边界点集合到js文件给离线地图使用。

      11. 可静态或者动态添加多个覆盖物。支持点、折线、多边形、矩形、圆形、弧线、点聚合等。

      12. 函数接口友好和统一,使用简单方便,就一个类。

      13. 支持js动态交互添加点、删除点、清空点、重置点,不需要刷新页面。

      14. 支持任意Qt版本、任意系统、任意编译器。

      4.5 路径规划

      基本步骤

      1. 输入起点坐标和终点坐标,也可以勾选地图选点,开启后直接在左侧的地图界面鼠标按下自动识别对应的经纬度坐标填入,单选框勾选的起点则填入起点坐标输入框中,勾选的终点就填入终点坐标输入框中。

      2. 选择路线方式,可选公交、驾车、步行、骑行等方式,默认选择步行。

      3. 选择路线方案,可选最少时间、最短距离、避开高速等。

      4. 输入关键点数,一般查询返回的路径的经纬度坐标点数非常密集,可能非常多,我们需要根据输入的关键点数来过滤,比如输入30,表示从所有经纬度数据中平均提取出来30个数据就行。点数合计,查询路线后自动返回所有经纬度坐标的数据个数。

      5. 单击查询路线,自动返回对应路径的所有经纬度坐标。

      6. 单击帅选数据,按照填入的关键点数进行数据帅选,在下方可以看到原始数据和最终数据,选中某个数据,自动在左侧生成点预览对应的位置。

      7. 单击模拟轨迹,会启动定时器,从第一个数据点开始,自动移动设备比如机器人、飞行器等,查看整个轨迹点路径是否正确。

      5 日志查询

      5.1 本地日志

      本地日志存放的是本系统的操作日志,比如用户登录退出、记录删除、设备报警等操作,都会有对应的记录存放的数据库,可以在这里选择时间段和日志类型进行查询。查询后的日志记录可以翻页查看,还可以直接支持指定页码跳转,(此翻页组件超级牛逼,外观和功能分离,自动计算页码切换导航,具体可参见对应类的头文件功能描述),每页显示多少条记录在系统设置中可以设置。

      5.1.1 查询记录

      1. 可以按照多条件进行查询记录。

      2. 可以选择设备通道。

      3. 可以选择日志的类型:用户操作、运行日志、设备日志、报警日志。

      4. 可以选择时间范围。

      5. 在查询记录的时候,如果勾选了前面的复选框则表示启用该选择条件进行查询。

      6. 没有勾选,就算后面选择了类型等,也是按照where 1=1 条件查询的。

      7. 查询后的记录会自动分页显示,而不是一次性显示。

      8. 可以单击底部的翻页按钮进行翻页查看记录。

      9. 可以快速切换到第一页、末一页、上一页、下一页、显示的页码切换、指定的页码切换。

      5.1.2 打印记录

      单击打印按钮,会将当前查询的记录打印出来,自动分页。打印前会弹出打印预览对话框,可以最后在这里调整边距、纸张等设置参数。

      5.1.3 导出记录到xls

      单击XLS按钮可以将表格中的内容导出到excel表格,独创的excel导出数据算法,极速导出,支持任意系统,无依赖。

      5.1.4 导出记录到pdf

      5.1.5 删除记录

      单击删除按钮,会弹出时间范围选择对话框,选择要删除的记录的开始时间和结束时间,单击确定,会将该时间段内的记录全部删除,结束时间必须大于开始时间。

      5.1.6 清空记录

      单击清空按钮会先弹出询问框提示是否需要清空数据,单击确定则自动清空所有的记录,清空后不能恢复。

      5.2 设备日志

      设备日志是指直接通过sdk协议,远程从NVR设备上拉取日志记录到本地显示,其余功能和本地日志一致,此功能未实现。

      6 系统设置

      6.1 基本设置

      6.1.1 常规设置

      基本设置中有部分参数的切换会自动重启应用。

      参数说明

      1. 开机运行:开启以后自动随着系统启动运行,默认开启。

      2. 自动登录:开启以后会自动以最后登录的用户信息登录到系统,默认关闭。

      3. 记住密码:开启以后会自动填入最后登录的用户信息到登录窗体,默认关闭。

      4. 中文标题:软件左上角标题栏的中文标题,改动立即应用。

      5. 英文标题:软件左上角标题栏的英文标题,改动立即应用。

      6. 版权所有:当前软件版权所有的公司,目前没有显示在哪里,备用。

      7. 调试日志:开启后会将打印日志输出到日志文件,默认关闭,日志文件存放在可执行文件夹下的log目录下。

      8. 运行时间:开启后会实时记录系统的运行时间,记录当前软件启动后运行了多久,运行时间文件存放在可执行文件夹下的log目录下。

      9. 工作模式:默认视频监控,可选机器人监控、无人机监控等。

      10. 导航样式:用于选择顶部导航栏和左侧导航栏的样式,上侧+左侧表示顶部导航栏上侧样式(图标在上面,文字在下面),左侧导航栏左侧样式(图标在左侧,文字在右侧)。

      11. 界面样式:系统自带17套皮肤,可以在这里自动换肤,默认视频黑。

      12. 软件图标:自动从logo文件夹读取,可以自行选择对应的logo文件。

      13. 全屏模式:开启以后,最大化显示自动全屏显示而不是最大化显示,默认关闭。

      14. 弹框时间:右下角弹出提示信息自动关闭时间,0秒表示常驻不关闭。

      15. 报警声音:0表示不启用,其余表示报警后播放的声音次数。

      16. 鼠标隐藏:主界面多久鼠标没有操作过会自动隐藏鼠标指针,一般在全屏轮询的时候需要设置,效果会更好。

      17. 自动全屏:经过多久以后鼠标没有操作过自动全屏,0表示不启用。

      18. 播放记录:如果开启在软件打开后会自动读取上一次的播放记录并自动打开,不需要可以关闭。

      19. 图文警情:图文警情模块消息行数,0表示自动计算填满,不产生滚动条。

      20. 窗口消息:窗口消息模块消息行数,0表示自动计算填满,不产生滚动条。

      21. 透明度值:停靠窗体的透明度值,可调节,动态应用。

      6.1.2 视频参数

      参数说明

      1. 共享解码:开启后相同地址的通道会复用之前已经打开的通道,这样可以大大节省网络流量和解码压力。

      2. 播放音频:开启以后可以播放声音,有时候不需要声音的时候可以关闭,节省资源。

      3. 保存视频:录像计划的总开关,开启以后自动存储录像文件,目录在可执行文件目录video_normal。

      4. 通道交换:默认开启,开启后在主界面视频面板可以拖曳交换通道。有时候希望禁用这个功能则关闭即可。

      5. 人工智能:用于演示绘制osd标签和添加各种图形绘制到视频图片上。

      6. 事件订阅:开启以后会用onvif的机制订阅报警事件。

      7. 自动校时:开启后摄像机上线立即同步本地时间到设备。

      8. 离线检测:默认关闭,开启后会定时检测添加的摄像机是否在线,不在线则对应设备树状列表那边可以看到离线状态。

      9. 打印信息:这个开关控制音视频组件中是否打印组件中的各种信息,在摄像头很多的时候,如果想要专注监控系统中非组件相关的功能打印,可以关闭,这样就不会显示组件的打印信息,能够快速方便的追踪自己程序的打印信息。

      10. 画面显示:可选自动调整、等比缩放、拉伸填充三种图片显示策略。

      11. 显示模式:可选句柄、绘制、GPU三种模式,在ffmpeg内核下句柄和GPU都是同一种处理。

      12. 视频边框:视频控件边框大小,用户根据实际需要选择即可。

      13. 悬浮工具:视频控件悬浮工具栏的位置,默认在顶部。可选择上下左右四个位置。

      14. 硬件加速:会根据不同的内核以及不同的系统自动显示不同的可用的加速器名称,默认none表示不启用硬件加速,ffmpeg可选dxva2和d3d11va,建议用dxva2。

      15. 通信方式:视频流采用何种通信方式,默认TCP(可靠连接,不会丢包,缺点就是慢),可选UDP(不可靠连接,容易丢包,但是速度快)。

      16. 解码策略:ffmpeg内核专用,可选速度优先、质量优先、均衡处理、最快速度,如果对实时视频流rtsp有实时性要求建议选择最快速度,可以看到无论是打开加载视频流还是响应都是最快的。

      17. 编码策略:ffmpeg内核专用,可选不做处理、自动转码、强转264、强转265,如果选择强转265,则不管视频源头是什么编码,统一转成265格式存储。

      18. 缓存大小:如果摄像机那边是2k/4k这种分辨率,建议这个值设置大一点。

      19. 默认码流:双击设备树状列表打开通道的视频,选择用主码流还是子码流地址去打开。

      20. 读取超时:读取视频流过程的超时时间,可选不处理或者具体的秒数,不处理则一直等待直到系统层通知读取失败,选择的话可以加快速度跳出并立即通知失败,建议设置5s,在网络环境不好或者网络中断的情况下能够快速识别到掉线。

      21. 连接超时:对于视频流地址可用,先探测对应的地址是否通,不通则不用继续,加载很慢的一些网络地址需要把时间设置大一些,可以尝试用vlc等第三方播放器打开地址对比速度,如果确实很慢,这个值可以设置大一些。

      22. 设备双击:可选最后空白通道、最后按下通道,就是双击设备子节点的时候,是在哪个通道打开视频,如果选择的是最后空白通道,则会从通道1开始遍历找到第一个空白的通道打开视频,如果选择的是最后按下通道,则对按下的通道先删除再打开视频。

      23. 分组双击:可选最后空白通道、从头清空通道,就是双击设备父节点的时候,是从哪个通道开始打开,如果选择的是最后空白通道,则会从通道1开始遍历找到第一个空白的通道依次打开,如果选择的是从头清空通道,则每次都是全部清空再从通道1开始打开。

      24. 最大数量:在双击分组打开的时候,是以当前画面数量作为最大数量,还是以整个系统可用的通道数量作为最大数量。比如有的时候我们切换在16通道画面,双击了一个设备分组,而该分组有100个设备,如果最大数量选择当前通道数量,则只打开16个设备,后面的不会打开,这样可以节约很多时间和系统资源,因为很多时候我们只是希望测试下这个分组是否正常,前面的能打开就行。

      25. 表格策略:摄像机管理中,对应表格是按下进入编辑状态还是双击进入编辑状态。

      26. 报警视频:视频报警后,存储报警视频的时长。

      27. 通道文字:视频控件显示的背景文字字样规则,可以选择显示对应的设备名称。

      28. 音柱位置:音柱可以显示在多个位置,也可以不显示音柱。默认禁用就是不显示。如果要显示,建议选择悬浮位置,更美观。

      29. 音柱尺寸:音柱的尺寸大小,如果选择自动调整,则视频控件尺寸越大音柱尺寸越大。也可以选择固定的尺寸。

      30. 悬浮透明:悬浮条的透明度值,建议半透明。

      31. 音柱透明:音柱的透明度值,建议全透明。

      6.1.3 数据库设置

      参数说明

      1. 远程同步:开启后将会启用云端数据同步功能,将本地数据实时同步到远程数据库中。

      2. 主机类型:和本地数据库设置一样,可选多种。

      3. 数据库名:对应数据库的数据库名称,一个数据库系统中可以有多个数据库实例。

      4. 主机地址:数据库所在的网络地址,可以是IP地址或者网址。

      5. 通信端口:数据库开放通信的端口,不同数据库默认端口不同,比如mysql是3306,postgres是5432,sqlserver是1433。

      6. 用户名称:登录到网络数据库对应的用户名称,所有的网络型数据库都需要用户认证。sqlite是文件型数据库一般不需要认证。

      7. 用户密码:登录到网络数据库对应的用户密码,所有的网络型数据库都需要用户认证。sqlite是文件型数据库一般不需要认证。

      8. 连接测试:单击后主动连接一次当前填入的数据库信息,连接成功与失败都会弹框提示。

      9. 初始数据:单击后会执行sql脚本文件,重置数据库,会将原来的数据一并清空。务必记得只有需要的时候才执行。

      其他说明

      1. 默认提供了数据库脚本文件(源码下的file/db/video_system.sql)。

      2. 单击初始化数据按钮可以对整个数据库进行新建和重置,相当于恢复出厂。

      3. 系统支持多种数据库,默认sqlite(Qt内置的数据库,无需安装),可选mysql、postgresql、oracle、人大金仓等。

      4. 具体还需要对应Qt版本有数据库插件支持,没有插件支持可以自行编译对应缺失的插件比如mysql,也可选直接通过万能的ODBC来连接。

      5. 除了sqlite数据库外,其余数据库都需要输入数据库名称、主机地址、通信端口、用户名称、用户密码信息,输入好以后可以单击连接测试按钮测试下是否正常。

      6. 默认提供的是mysql的动态库libmysql.dll,需要放到可执行文件同一目录,严格区分32位和64位的动态库。

      6.1.4 颜色配置

      可以设置不同的场景不同的颜色,比如正常的系统消息显示白色,异常消息红色。

      6.1.5 功能激活

      参数说明

      1. 勾选则表示启用。

      2. 可以对各种分屏进行功能激活。

      3. 可以对各种模块进行功能激活。

      4. 可以勾选悬浮条要显示哪些信息。

      5. 分屏和模块功能激活需要重启应用。

      6. 没有勾选的,不会显示对应的菜单切换和分屏快捷按钮。

      7. 多个子界面模块也可以选择显示或者隐藏,以便将不需要的模块隐藏掉,碍眼。

      6.2 录像机管理

      本系统所用的录像机信息,并没有实际的作用,也就是不一定要填写实际的录像机信息,留作备用后期使用,目前仅仅是作为生成设备的树状列表使用(类似于区域或分组),如果一个录像机都没有填写,则会自动生成一个默认的录像机信息。

      字段说明

      1. 设备编号:录像机的编号,唯一字段。

      2. 设备名称:录像机的别名,建议不要重复。

      3. 设备类型:录像机的厂家类型,可选海康、大华、宇视、其他等。

      4. 设备地址:录像机的IP地址。

      5. 用户姓名:录像机的登录用户名称。

      6. 用户密码:录像机的登录用户密码。

      7. 启用状态:录像机设备是否启用。

      8. 安装位置:录像机的安装位置。

      6.2.1 录像机添加

      单击添加按钮,会自动规则生成默认的信息,直接表格中修改即可,修改好以后单击保存按钮保存所有的信息。

      6.2.2 录像机删除

      如果要删除某个录像机信息,需要先选中该行,然后单击删除按钮,删除后会自动保存。

      6.2.3 录像机清空

      单击清空按钮会对整个表进行清空操作,清空后数据不能恢复,慎用。

      6.2.4 录像机信息导入

      单击导入按钮,可以选择之前导出的csv格式的文件导入数据。

      6.2.5 录像机信息导出

      单击导出按钮,将表格数据导出到csv格式的文件,用户可以打开文件编辑,然后再次导入,这样可以作为简易的备份机制使用,也可将繁琐的基础数据录入交给小姑娘去做。  

      6.2.6 录像机信息打印

      单击打印按钮可以将表格中的内容打印出来,打印前会弹出打印预览界面,可以自行做边距的调整等,可以查看等待打印的内容,翻页切换。

      6.2.7 导出到Excel

      单击导出按钮可以将表格中的内容导出到excel表格,独创的excel导出数据算法,极速导出,支持任意系统,无依赖。

      6.3 摄像机管理

      摄像机表信息,是整个系统中最核心的表,这里管理的所有的摄像机信息,并不是所有的字段都显示出来了,比如onvif地址、云台地址等都是隐藏的,因为无需添加更改,需要搜索自动添加的。

      字段说明

      1. 设备编号:摄像机的唯一编号。

      2. 设备名称:摄像机的别名,建议不要重复。

      3. 录 像 机:该摄像机对应所属的录像机,随便选择一个就行。

      4. 设备厂家:摄像机的厂家类型,通过onvif搜索会自动有厂家信息,没有的就选择其他。

      5. 主码流地址:摄像机的主码流地址。

      6. 子码流地址:摄像机的子码流地址。

      7. 经 纬 度:摄像机的经纬度信息,用来地图上显示位置,中间用 | 隔开。

      8. 背景地图:摄像机对应的平面地图,下拉选择,默认从可执行文件下的map目录下读取图片文件列表生成。

      9. 用户姓名:摄像机登录的用户名称。

      10. 用户密码:摄像机登录的用户密码。

      11. 启用状态:摄像机是否启用。

      12. 安装位置:摄像机的安装位置。

      6.3.1 摄像机添加

      单击添加按钮,会自动规则生成默认的信息,直接表格中修改即可,修改好以后单击保存按钮保存所有的信息。

      6.3.2 摄像机删除

      如果要删除某个摄像机信息,需要先选中该行,然后单击删除按钮,删除后会自动保存。

      6.3.3 摄像机清空

      单击清空按钮会对整个表进行清空操作,清空后数据不能恢复,慎用。

      6.3.4 摄像机信息导入

      单击导入按钮,可以选择之前导出的csv格式的文件导入数据。

      6.3.5 摄像机信息导出

      单击导出按钮,将表格数据导出到csv格式的文件,用户可以打开文件编辑,然后再次导入,这样可以作为简易的备份机制使用,也可将繁琐的基础数据录入交给小姑娘去做。

      6.3.6 摄像机信息打印

      单击打印按钮可以将表格中的内容打印出来,打印前会弹出打印预览界面,可以自行做边距的调整等,可以查看等待打印的内容,翻页切换。

      6.3.7 导出到Excel

      单击导出按钮可以将表格中的内容导出到excel表格,独创的excel导出数据算法,极速导出,支持任意系统,无依赖。

      6.3.8 设备搜索

      如果摄像机已经添加过,则搜索出来的摄像机对应行禁用不可选中。

      基本步骤

      特别说明

      1. 如果没有码流地址,是添加不了的,必须有码流地址才能添加。

      2. 一般一个项目上的摄像机都是同一个品牌的,onvif用户信息也都一样,所以单击获取所有可以把所有摄像机的信息获取到。

      3. 可以填入不同的onvif用户信息,单击获取当前按钮来指定摄像机获取onvif信息。

      4. 如果有些设备不支持广播,只支持单播(比如不是同一网段的设备,但是路由器设置过,是通的),则指定设备右侧填写好IP地址或者onvif地址,再单击单播搜索即可。

      5. 一台电脑可能多个网卡和IP网段,可以选择不同的网卡进行搜索,相当于不同的网段。

      6. 录像机信息和摄像机信息的更改,是自动应用的,无需重启。

      7. 搜索后的设备信息自动添加到表格中,按照IP地址升序排序,支持跨网段排序,自动将IP地址转为quint32整型进行排序,而不是取IP地址末尾。

      参数说明

      1. 用户姓名:onvif用户的名称,默认admin。

      2. 用户密码:onvif用户的密码,默认admin。

      3. 选择网卡:选择对应电脑的网卡IP,可能有多个网段,onvif只能同一个网段。

      4. 指定设备:对指定的IP地址或者onvif地址进行onvif搜索。

      5. 过滤设备:对返回的onvif地址进行过滤,一种厂家的类别的设备地址格式一样。

      6. 搜索间隔:默认onvif搜索指令有好几种,会重发几次,指定发送的间隔。

      7. 搜索策略:默认自动清空,每次都重新添加搜索到的设备,如果选择设备累加则多次搜索后只会将新增加的设备加到设备列表,这个非常有用,在很多设备现场建议用设备累加策略而不是自动清空,因为onvif协议是udp协议,在大量数据的情况下会导致丢包,需要多次搜索,取最终的设备集合。

      8. 广播搜索:广播搜索指定网卡的所有onvif设备。

      9. 单播搜索:对指定设备进行单个搜索。

      10. 获取所有:按照当前填入的用户姓名和密码,填充到onvif请求鉴权中对所有搜索的设备进行媒体地址的获取、云台控制地址的获取、视频流地址的获取等。

      11. 获取当前:很多时候并不是所有的设备onvif用户信息一样,对于不一样的,可以先选中设备所在行,然后输入不同的用户信息,单击获取当前即可,会对当前选中的设备重新获取onvif信息。

      12. 添加选中:搜索到的设备前面都有个复选框,单击添加选中以后会对所有打钩的设备批量添加到摄像机信息表中,会自动过滤已经添加过的设备以及没有视频流地址的设备。

      13. 添加当前:对应获取当前,一般来说单个添加用户信息不一样的设备,因为批量添加不了,他的信息需要单独获取。

      6.3.9 批量添加

      除了可以单个添加或者搜索添加,还支持批量添加功能。为了统一窗体,本地音视频设备比如本地摄像头和桌面的添加也在此界面中。本功能和轮询管理中的批量添加共用。

      1. 地址格式:可选文件、海康、大华等,切换后会自动生成地址模板格式在左侧,生成后可以手动修改。

      2. 地址数量:要批量添加多少个地址。如果是要添加NVR上的通道,则一般这里选择16。

      3. 起始地址:文件名的标识开始地址。

      4. 通道递增:勾选的话,则表示当前准备批量添加一台NVR下的所有通道,起始地址填NVR的地址。

      5. 批量生成:单击该按钮,自动批量添加。

      6. 视频输入设备:自动罗列本地视频设备名称,包括桌面,如果有多个屏幕,全部会获取。

      7. 音频输入设备:自动罗列本地音频设备名称,就是麦克风设备,也可以有本地内置音频输出设备,俗称内录音频设备。

      6.4 轮询配置

      轮询点管理界面,上侧是轮询点信息表,可以直接添加、删除、修改、清空轮询点信息,下侧是摄像机信息表,会自动加载,当摄像机信息变动后,这里会自动加载最新的数据。右下角是批量生成轮询点和轮询分组管理。

      6.4.1 轮询点添加

      轮询点的添加有三种方式:手动添加、单个添加、批量添加。允许重复添加,没有过滤机制。

      6.4.2 轮询点删除

      如果要删除某个轮询点信息,需要先选中该行,然后单击删除按钮,删除后会自动保存。

      6.4.3 轮询点清空

      单击清空按钮会对整个表进行清空操作,清空后数据不能恢复,慎用。

      6.4.4 轮询点信息导入

      单击导入按钮,可以选择之前导出的csv格式的文件导入数据。

      6.4.5 轮询点信息导出

      单击导出按钮,将表格数据导出到csv格式的文件,用户可以打开文件编辑,然后再次导入,这样可以作为简易的备份机制使用,也可将繁琐的基础数据录入交给小姑娘去做。

      6.4.5 轮询点信息打印

      单击打印按钮可以将表格中的内容打印出来,打印前会弹出打印预览界面,可以自行做边距的调整等,可以查看等待打印的内容,翻页切换。

      6.4.7 导出到Excel

      单击导出按钮可以将表格中的内容导出到excel表格,独创的excel导出数据算法,极速导出,支持任意系统,无依赖。

      6.4.8 批量添加

      和摄像机管理中的批量添加功能完全一致,具体参见上面的操作说明。

      6.4.9 分组设置

      可添加、删除、修改、清空轮询分组名称,相当于轮询预案。

      6.5 用户管理

      用户管理是后面增加的一个模块,用于设置不同的用户不同的类型+权限,可以细分到每个模块的权限,勾选表示具有该权限,内置了7种权限选择,后期还可以在此基础上增加其他权限等。

      6.5.1 用户添加

      单击添加按钮,会自动规则生成默认的信息,直接表格中修改即可,修改好以后单击保存按钮保存所有的信息。

      6.5.2 用户删除

      如果要删除某个用户信息,需要先选中该行,然后单击删除按钮,删除后会自动保存。不允许删除内置的admin用户。

      6.5.3 用户清空

      单击清空按钮会对整个表进行清空操作,清空后数据不能恢复,慎用。

      6.5.4 用户信息导入

      单击导入按钮,可以选择之前导出的csv格式的文件导入数据。

      6.5.5 用户信息导出

      单击导出按钮,将表格数据导出到csv格式的文件,用户可以打开文件编辑,然后再次导入,这样可以作为简易的备份机制使用,也可将繁琐的基础数据录入交给小姑娘去做。

      6.5.6 用户信息打印

      +https://blog.csdn.net/feiyangqingyun/article/details/104005917

    • 请下载同目录下的bin_map_tiles.zip压缩包,解压到config目录下,最后config文件夹下会多出来tiles tiles_hybrid两个文件夹。

    • 4.4 在线地图

      在摄像机管理的界面,可以添加经纬度信息,这样就可以在地图上显示对应的摄像机点位信息,如果发现位置不对,可以在右侧先选择摄像机设备,然后鼠标单击新的位置,右侧目标经度、目标纬度信息会自动更新,然后再单击更新经纬度值则会更新当前下拉选择的设备的经纬度信息,也可以在摄像机管理界面手动填入进行修改。

      在右侧还有模拟运动轨迹、开始显示轨迹两个按钮,有可能后期还会增加其他功能,是为了演示如何在地图上实现地图的相关功能,开始显示轨迹采用的定时器来生成轨迹点数据,动态模拟运动轨迹,可以单击显示设备位置按钮还原最初的设备点位图。

      功能特点

      1. 同时支持在线地图和离线地图两种模式。

      2. 同时支持webkit内核、webengine内核、IE内核。

      3. 支持设置多个标注点,信息包括名称、地址、经纬度。

      4. 可设置地图是否可单击、拖动、鼠标滚轮缩放。

      5. 可设置协议版本、秘钥、主题样式、中心坐标、中心城市、地理编码位置等。

      6. 可设置地图缩放比例和级别,缩略图、比例尺、路况信息等控件的可见。

      7. 支持地图交互,比如鼠标按下获取对应位置的经纬度。

      8. 支持查询路线,可设置起点位置、终点位置、路线模式、路线方式、路线方案(最少时间、最少换乘、最少步行、不乘地铁、最短距离、避开高速)。

      9. 可显示点线面工具,可直接在地图上划线、点、矩形、圆形等。

      10. 可设置行政区划,指定某个城市区域绘制图层,在线地图自动输出行政区划边界点集合到js文件给离线地图使用。

      11. 可静态或者动态添加多个覆盖物。支持点、折线、多边形、矩形、圆形、弧线、点聚合等。

      12. 函数接口友好和统一,使用简单方便,就一个类。

      13. 支持js动态交互添加点、删除点、清空点、重置点,不需要刷新页面。

      14. 支持任意Qt版本、任意系统、任意编译器。

      4.5 路径规划

      基本步骤

      1. 输入起点坐标和终点坐标,也可以勾选地图选点,开启后直接在左侧的地图界面鼠标按下自动识别对应的经纬度坐标填入,单选框勾选的起点则填入起点坐标输入框中,勾选的终点就填入终点坐标输入框中。

      2. 选择路线方式,可选公交、驾车、步行、骑行等方式,默认选择步行。

      3. 选择路线方案,可选最少时间、最短距离、避开高速等。

      4. 输入关键点数,一般查询返回的路径的经纬度坐标点数非常密集,可能非常多,我们需要根据输入的关键点数来过滤,比如输入30,表示从所有经纬度数据中平均提取出来30个数据就行。点数合计,查询路线后自动返回所有经纬度坐标的数据个数。

      5. 单击查询路线,自动返回对应路径的所有经纬度坐标。

      6. 单击帅选数据,按照填入的关键点数进行数据帅选,在下方可以看到原始数据和最终数据,选中某个数据,自动在左侧生成点预览对应的位置。

      7. 单击模拟轨迹,会启动定时器,从第一个数据点开始,自动移动设备比如机器人、飞行器等,查看整个轨迹点路径是否正确。

      5 日志查询

      5.1 本地日志

      本地日志存放的是本系统的操作日志,比如用户登录退出、记录删除、设备报警等操作,都会有对应的记录存放的数据库,可以在这里选择时间段和日志类型进行查询。查询后的日志记录可以翻页查看,还可以直接支持指定页码跳转,(此翻页组件超级牛逼,外观和功能分离,自动计算页码切换导航,具体可参见对应类的头文件功能描述),每页显示多少条记录在系统设置中可以设置。

      5.1.1 查询记录

      1. 可以按照多条件进行查询记录。

      2. 可以选择设备通道。

      3. 可以选择日志的类型:用户操作、运行日志、设备日志、报警日志。

      4. 可以选择时间范围。

      5. 在查询记录的时候,如果勾选了前面的复选框则表示启用该选择条件进行查询。

      6. 没有勾选,就算后面选择了类型等,也是按照where 1=1 条件查询的。

      7. 查询后的记录会自动分页显示,而不是一次性显示。

      8. 可以单击底部的翻页按钮进行翻页查看记录。

      9. 可以快速切换到第一页、末一页、上一页、下一页、显示的页码切换、指定的页码切换。

      5.1.2 打印记录

      单击打印按钮,会将当前查询的记录打印出来,自动分页。打印前会弹出打印预览对话框,可以最后在这里调整边距、纸张等设置参数。

      5.1.3 导出记录到xls

      单击XLS按钮可以将表格中的内容导出到excel表格,独创的excel导出数据算法,极速导出,支持任意系统,无依赖。

      5.1.4 导出记录到pdf

      5.1.5 删除记录

      单击删除按钮,会弹出时间范围选择对话框,选择要删除的记录的开始时间和结束时间,单击确定,会将该时间段内的记录全部删除,结束时间必须大于开始时间。

      5.1.6 清空记录

      单击清空按钮会先弹出询问框提示是否需要清空数据,单击确定则自动清空所有的记录,清空后不能恢复。

      5.1.7 报警图片预览

      如果开启了事件订阅,则报警后会自动抓拍报警图片,存储到对应的报警图片目录,对应日志记录行双击可以查看报警图片。

      5.1.8 报警视频回放

      如果开启了事件订阅,则部分事件(可以自定义哪些警情需要保存录像)报警后,会自动开启报警录像存储,对应日志记录行双击可以查看报警录像,在弹出的页面可以切换播放进度和暂停播放等。

      5.2 设备日志

      设备日志是指直接通过sdk协议,远程从NVR设备上拉取日志记录到本地显示,其余功能和本地日志一致,此功能未实现。

      6 系统设置

      6.1 基本设置

      6.1.1 常规设置

      基本设置中有部分参数的切换会自动重启应用。

      参数说明

      1. 开机运行:开启以后自动随着系统启动运行,默认开启。

      2. 自动登录:开启以后会自动以最后登录的用户信息登录到系统,默认关闭。

      3. 记住密码:开启以后会自动填入最后登录的用户信息到登录窗体,默认关闭。

      4. 中文标题:软件左上角标题栏的中文标题,改动立即应用。

      5. 英文标题:软件左上角标题栏的英文标题,改动立即应用。

      6. 版权所有:当前软件版权所有的公司,目前没有显示在哪里,备用。

      7. 调试日志:开启后会将打印日志输出到日志文件,默认关闭,日志文件存放在可执行文件夹下的log目录下。

      8. 运行时间:开启后会实时记录系统的运行时间,记录当前软件启动后运行了多久,运行时间文件存放在可执行文件夹下的log目录下。

      9. 工作模式:默认视频监控,可选机器人监控、无人机监控等。

      10. 导航样式:用于选择顶部导航栏和左侧导航栏的样式,上侧+左侧表示顶部导航栏上侧样式(图标在上面,文字在下面),左侧导航栏左侧样式(图标在左侧,文字在右侧)。

      11. 界面样式:系统自带17套皮肤,可以在这里自动换肤,默认视频黑。

      12. 软件图标:自动从logo文件夹读取,可以自行选择对应的logo文件。

      13. 全屏模式:开启以后,最大化显示自动全屏显示而不是最大化显示,默认关闭。

      14. 弹框时间:右下角弹出提示信息自动关闭时间,0秒表示常驻不关闭。

      15. 报警声音:0表示不启用,其余表示报警后播放的声音次数。

      16. 鼠标隐藏:主界面多久鼠标没有操作过会自动隐藏鼠标指针,一般在全屏轮询的时候需要设置,效果会更好。

      17. 自动全屏:经过多久以后鼠标没有操作过自动全屏,0表示不启用。

      18. 播放记录:如果开启在软件打开后会自动读取上一次的播放记录并自动打开,不需要可以关闭。

      19. 图文警情:图文警情模块消息行数,0表示自动计算填满,不产生滚动条。

      20. 窗口消息:窗口消息模块消息行数,0表示自动计算填满,不产生滚动条。

      21. 透明度值:停靠窗体的透明度值,可调节,动态应用。

      6.1.2 视频参数

      参数说明

      1. 共享解码:开启后相同地址的通道会复用之前已经打开的通道,这样可以大大节省网络流量和解码压力。

      2. 播放音频:开启以后可以播放声音,有时候不需要声音的时候可以关闭,节省资源。

      3. 保存视频:录像计划的总开关,开启以后自动存储录像文件,目录在可执行文件目录video_normal。

      4. 通道交换:默认开启,开启后在主界面视频面板可以拖曳交换通道。有时候希望禁用这个功能则关闭即可。

      5. 人工智能:用于演示绘制osd标签和添加各种图形绘制到视频图片上。

      6. 事件订阅:开启以后会用onvif的机制订阅报警事件。

      7. 自动校时:开启后摄像机上线立即同步本地时间到设备。

      8. 离线检测:默认关闭,开启后会定时检测添加的摄像机是否在线,不在线则对应设备树状列表那边可以看到离线状态。

      9. 打印信息:这个开关控制音视频组件中是否打印组件中的各种信息,在摄像头很多的时候,如果想要专注监控系统中非组件相关的功能打印,可以关闭,这样就不会显示组件的打印信息,能够快速方便的追踪自己程序的打印信息。

      10. 画面显示:可选自动调整、等比缩放、拉伸填充三种图片显示策略。

      11. 显示模式:可选句柄、绘制、GPU三种模式,在ffmpeg内核下句柄和GPU都是同一种处理。

      12. 视频边框:视频控件边框大小,用户根据实际需要选择即可。

      13. 悬浮工具:视频控件悬浮工具栏的位置,默认在顶部。可选择上下左右四个位置。

      14. 硬件加速:会根据不同的内核以及不同的系统自动显示不同的可用的加速器名称,默认none表示不启用硬件加速,ffmpeg可选dxva2和d3d11va,建议用dxva2。

      15. 通信方式:视频流采用何种通信方式,默认TCP(可靠连接,不会丢包,缺点就是慢),可选UDP(不可靠连接,容易丢包,但是速度快)。

      16. 解码策略:ffmpeg内核专用,可选速度优先、质量优先、均衡处理、最快速度,如果对实时视频流rtsp有实时性要求建议选择最快速度,可以看到无论是打开加载视频流还是响应都是最快的。

      17. 编码策略:ffmpeg内核专用,可选不做处理、自动转码、强转264、强转265,如果选择强转265,则不管视频源头是什么编码,统一转成265格式存储。

      18. 缓存大小:如果摄像机那边是2k/4k这种分辨率,建议这个值设置大一点。

      19. 默认码流:双击设备树状列表打开通道的视频,选择用主码流还是子码流地址去打开。

      20. 读取超时:读取视频流过程的超时时间,可选不处理或者具体的秒数,不处理则一直等待直到系统层通知读取失败,选择的话可以加快速度跳出并立即通知失败,建议设置5s,在网络环境不好或者网络中断的情况下能够快速识别到掉线。

      21. 连接超时:对于视频流地址可用,先探测对应的地址是否通,不通则不用继续,加载很慢的一些网络地址需要把时间设置大一些,可以尝试用vlc等第三方播放器打开地址对比速度,如果确实很慢,这个值可以设置大一些。

      22. 设备双击:可选最后空白通道、最后按下通道,就是双击设备子节点的时候,是在哪个通道打开视频,如果选择的是最后空白通道,则会从通道1开始遍历找到第一个空白的通道打开视频,如果选择的是最后按下通道,则对按下的通道先删除再打开视频。

      23. 分组双击:可选最后空白通道、从头清空通道,就是双击设备父节点的时候,是从哪个通道开始打开,如果选择的是最后空白通道,则会从通道1开始遍历找到第一个空白的通道依次打开,如果选择的是从头清空通道,则每次都是全部清空再从通道1开始打开。

      24. 最大数量:在双击分组打开的时候,是以当前画面数量作为最大数量,还是以整个系统可用的通道数量作为最大数量。比如有的时候我们切换在16通道画面,双击了一个设备分组,而该分组有100个设备,如果最大数量选择当前通道数量,则只打开16个设备,后面的不会打开,这样可以节约很多时间和系统资源,因为很多时候我们只是希望测试下这个分组是否正常,前面的能打开就行。

      25. 表格策略:摄像机管理中,对应表格是按下进入编辑状态还是双击进入编辑状态。

      26. 报警视频:视频报警后,存储报警视频的时长。

      27. 通道文字:视频控件显示的背景文字字样规则,可以选择显示对应的设备名称。

      28. 音柱位置:音柱可以显示在多个位置,也可以不显示音柱。默认禁用就是不显示。如果要显示,建议选择悬浮位置,更美观。

      29. 音柱尺寸:音柱的尺寸大小,如果选择自动调整,则视频控件尺寸越大音柱尺寸越大。也可以选择固定的尺寸。

      30. 悬浮透明:悬浮条的透明度值,建议半透明。

      31. 音柱透明:音柱的透明度值,建议全透明。

      6.1.3 数据库设置

      参数说明

      1. 远程同步:开启后将会启用云端数据同步功能,将本地数据实时同步到远程数据库中。

      2. 主机类型:和本地数据库设置一样,可选多种。

      3. 数据库名:对应数据库的数据库名称,一个数据库系统中可以有多个数据库实例。

      4. 主机地址:数据库所在的网络地址,可以是IP地址或者网址。

      5. 通信端口:数据库开放通信的端口,不同数据库默认端口不同,比如mysql是3306,postgres是5432,sqlserver是1433。

      6. 用户名称:登录到网络数据库对应的用户名称,所有的网络型数据库都需要用户认证。sqlite是文件型数据库一般不需要认证。

      7. 用户密码:登录到网络数据库对应的用户密码,所有的网络型数据库都需要用户认证。sqlite是文件型数据库一般不需要认证。

      8. 连接测试:单击后主动连接一次当前填入的数据库信息,连接成功与失败都会弹框提示。

      9. 初始数据:单击后会执行sql脚本文件,重置数据库,会将原来的数据一并清空。务必记得只有需要的时候才执行。

      其他说明

      1. 默认提供了数据库脚本文件(源码下的file/db/video_system.sql)。

      2. 单击初始化数据按钮可以对整个数据库进行新建和重置,相当于恢复出厂。

      3. 系统支持多种数据库,默认sqlite(Qt内置的数据库,无需安装),可选mysql、postgresql、oracle、人大金仓等。

      4. 具体还需要对应Qt版本有数据库插件支持,没有插件支持可以自行编译对应缺失的插件比如mysql,也可选直接通过万能的ODBC来连接。

      5. 除了sqlite数据库外,其余数据库都需要输入数据库名称、主机地址、通信端口、用户名称、用户密码信息,输入好以后可以单击连接测试按钮测试下是否正常。

      6. 默认提供的是mysql的动态库libmysql.dll,需要放到可执行文件同一目录,严格区分32位和64位的动态库。

      6.1.4 颜色配置

      可以设置不同的场景不同的颜色,比如正常的系统消息显示白色,异常消息红色。

      6.1.5 功能激活

      参数说明

      1. 勾选则表示启用。

      2. 可以对各种分屏进行功能激活。

      3. 可以对各种模块进行功能激活。

      4. 可以勾选悬浮条要显示哪些信息。

      5. 分屏和模块功能激活需要重启应用。

      6. 没有勾选的,不会显示对应的菜单切换和分屏快捷按钮。

      7. 多个子界面模块也可以选择显示或者隐藏,以便将不需要的模块隐藏掉,碍眼。

      6.2 录像机管理

      本系统所用的录像机信息,并没有实际的作用,也就是不一定要填写实际的录像机信息,留作备用后期使用,目前仅仅是作为生成设备的树状列表使用(类似于区域或分组),如果一个录像机都没有填写,则会自动生成一个默认的录像机信息。

      字段说明

      1. 设备编号:录像机的编号,唯一字段。

      2. 设备名称:录像机的别名,建议不要重复。

      3. 设备类型:录像机的厂家类型,可选海康、大华、宇视、其他等。

      4. 设备地址:录像机的IP地址。

      5. 用户姓名:录像机的登录用户名称。

      6. 用户密码:录像机的登录用户密码。

      7. 启用状态:录像机设备是否启用。

      8. 安装位置:录像机的安装位置。

      6.2.1 录像机添加

      单击添加按钮,会自动规则生成默认的信息,直接表格中修改即可,修改好以后单击保存按钮保存所有的信息。

      6.2.2 录像机删除

      如果要删除某个录像机信息,需要先选中该行,然后单击删除按钮,删除后会自动保存。

      6.2.3 录像机清空

      单击清空按钮会对整个表进行清空操作,清空后数据不能恢复,慎用。

      6.2.4 录像机信息导入

      单击导入按钮,可以选择之前导出的csv格式的文件导入数据。

      6.2.5 录像机信息导出

      单击导出按钮,将表格数据导出到csv格式的文件,用户可以打开文件编辑,然后再次导入,这样可以作为简易的备份机制使用,也可将繁琐的基础数据录入交给小姑娘去做。  

      6.2.6 录像机信息打印

      单击打印按钮可以将表格中的内容打印出来,打印前会弹出打印预览界面,可以自行做边距的调整等,可以查看等待打印的内容,翻页切换。

      6.2.7 导出到Excel

      单击导出按钮可以将表格中的内容导出到excel表格,独创的excel导出数据算法,极速导出,支持任意系统,无依赖。

      6.3 摄像机管理

      摄像机表信息,是整个系统中最核心的表,这里管理的所有的摄像机信息,并不是所有的字段都显示出来了,比如onvif地址、云台地址等都是隐藏的,因为无需添加更改,需要搜索自动添加的。

      字段说明

      1. 设备编号:摄像机的唯一编号。

      2. 设备名称:摄像机的别名,建议不要重复。

      3. 录 像 机:该摄像机对应所属的录像机,随便选择一个就行。

      4. 设备厂家:摄像机的厂家类型,通过onvif搜索会自动有厂家信息,没有的就选择其他。

      5. 主码流地址:摄像机的主码流地址。

      6. 子码流地址:摄像机的子码流地址。

      7. 经 纬 度:摄像机的经纬度信息,用来地图上显示位置,中间用 | 隔开。

      8. 背景地图:摄像机对应的平面地图,下拉选择,默认从可执行文件下的map目录下读取图片文件列表生成。

      9. 用户姓名:摄像机登录的用户名称。

      10. 用户密码:摄像机登录的用户密码。

      11. 启用状态:摄像机是否启用。

      12. 安装位置:摄像机的安装位置。

      6.3.1 摄像机添加

      单击添加按钮,会自动规则生成默认的信息,直接表格中修改即可,修改好以后单击保存按钮保存所有的信息。

      6.3.2 摄像机删除

      如果要删除某个摄像机信息,需要先选中该行,然后单击删除按钮,删除后会自动保存。

      6.3.3 摄像机清空

      单击清空按钮会对整个表进行清空操作,清空后数据不能恢复,慎用。

      6.3.4 摄像机信息导入

      单击导入按钮,可以选择之前导出的csv格式的文件导入数据。

      6.3.5 摄像机信息导出

      单击导出按钮,将表格数据导出到csv格式的文件,用户可以打开文件编辑,然后再次导入,这样可以作为简易的备份机制使用,也可将繁琐的基础数据录入交给小姑娘去做。

      6.3.6 摄像机信息打印

      单击打印按钮可以将表格中的内容打印出来,打印前会弹出打印预览界面,可以自行做边距的调整等,可以查看等待打印的内容,翻页切换。

      6.3.7 导出到Excel

      单击导出按钮可以将表格中的内容导出到excel表格,独创的excel导出数据算法,极速导出,支持任意系统,无依赖。

      6.3.8 设备搜索

      如果摄像机已经添加过,则搜索出来的摄像机对应行禁用不可选中。

      基本步骤

      特别说明

      1. 如果没有码流地址,是添加不了的,必须有码流地址才能添加。

      2. 一般一个项目上的摄像机都是同一个品牌的,onvif用户信息也都一样,所以单击获取所有可以把所有摄像机的信息获取到。

      3. 可以填入不同的onvif用户信息,单击获取当前按钮来指定摄像机获取onvif信息。

      4. 如果有些设备不支持广播,只支持单播(比如不是同一网段的设备,但是路由器设置过,是通的),则指定设备右侧填写好IP地址或者onvif地址,再单击单播搜索即可。

      5. 一台电脑可能多个网卡和IP网段,可以选择不同的网卡进行搜索,相当于不同的网段。

      6. 录像机信息和摄像机信息的更改,是自动应用的,无需重启。

      7. 搜索后的设备信息自动添加到表格中,按照IP地址升序排序,支持跨网段排序,自动将IP地址转为quint32整型进行排序,而不是取IP地址末尾。

      参数说明

      1. 用户姓名:onvif用户的名称,默认admin。

      2. 用户密码:onvif用户的密码,默认admin。

      3. 选择网卡:选择对应电脑的网卡IP,可能有多个网段,onvif只能同一个网段。

      4. 指定设备:对指定的IP地址或者onvif地址进行onvif搜索。

      5. 过滤设备:对返回的onvif地址进行过滤,一种厂家的类别的设备地址格式一样。

      6. 搜索间隔:默认onvif搜索指令有好几种,会重发几次,指定发送的间隔。

      7. 请求超时:在获取rtsp地址等信息的时候是发送的http请求,有些网络环境中需要将超时时间设置大一点,以便保证可以收到应答数据。超时时间越大,意味着这个一键获取信息过程时间越久,可以综合考虑。

      8. 搜索策略:默认自动清空,每次都重新添加搜索到的设备,如果选择设备累加则多次搜索后只会将新增加的设备加到设备列表,这个非常有用,在很多设备现场建议用设备累加策略而不是自动清空,因为onvif协议是udp协议,在大量数据的情况下会导致丢包,需要多次搜索,取最终的设备集合。

      9. 广播搜索:广播搜索指定网卡的所有onvif设备。

      10. 单播搜索:对指定设备进行单个搜索。

      11. 获取所有:按照当前填入的用户姓名和密码,填充到onvif请求鉴权中对所有搜索的设备进行媒体地址的获取、云台控制地址的获取、视频流地址的获取等。

      12. 获取当前:很多时候并不是所有的设备onvif用户信息一样,对于不一样的,可以先选中设备所在行,然后输入不同的用户信息,单击获取当前即可,会对当前选中的设备重新获取onvif信息。

      13. 添加选中:搜索到的设备前面都有个复选框,单击添加选中以后会对所有打钩的设备批量添加到摄像机信息表中,会自动过滤已经添加过的设备以及没有视频流地址的设备。

      14. 添加当前:对应获取当前,一般来说单个添加用户信息不一样的设备,因为批量添加不了,他的信息需要单独获取。

      6.3.9 批量添加

      除了可以单个添加或者搜索添加,还支持批量添加功能。为了统一窗体,本地音视频设备比如本地摄像头和桌面的添加也在此界面中。本功能和轮询管理中的批量添加共用。

      1. 地址格式:可选文件、海康、大华等,切换后会自动生成地址模板格式在左侧,生成后可以手动修改。

      2. 地址数量:要批量添加多少个地址。如果是要添加NVR上的通道,则一般这里选择16。

      3. 起始地址:文件名的标识开始地址。

      4. 通道递增:勾选的话,则表示当前准备批量添加一台NVR下的所有通道,起始地址填NVR的地址。

      5. 批量生成:单击该按钮,自动批量添加。

      6. 视频输入设备:自动罗列本地视频设备名称,包括桌面,如果有多个屏幕,全部会获取。

      7. 音频输入设备:自动罗列本地音频设备名称,就是麦克风设备,也可以有本地内置音频输出设备,俗称内录音频设备。

      6.4 轮询配置

      轮询点管理界面,上侧是轮询点信息表,可以直接添加、删除、修改、清空轮询点信息,下侧是摄像机信息表,会自动加载,当摄像机信息变动后,这里会自动加载最新的数据。右下角是批量生成轮询点和轮询分组管理。

      6.4.1 轮询点添加

      轮询点的添加有三种方式:手动添加、单个添加、批量添加。允许重复添加,没有过滤机制。

      6.4.2 轮询点删除

      如果要删除某个轮询点信息,需要先选中该行,然后单击删除按钮,删除后会自动保存。

      6.4.3 轮询点清空

      单击清空按钮会对整个表进行清空操作,清空后数据不能恢复,慎用。

      6.4.4 轮询点信息导入

      单击导入按钮,可以选择之前导出的csv格式的文件导入数据。

      6.4.5 轮询点信息导出

      单击导出按钮,将表格数据导出到csv格式的文件,用户可以打开文件编辑,然后再次导入,这样可以作为简易的备份机制使用,也可将繁琐的基础数据录入交给小姑娘去做。

      6.4.5 轮询点信息打印

      单击打印按钮可以将表格中的内容打印出来,打印前会弹出打印预览界面,可以自行做边距的调整等,可以查看等待打印的内容,翻页切换。

      6.4.7 导出到Excel

      单击导出按钮可以将表格中的内容导出到excel表格,独创的excel导出数据算法,极速导出,支持任意系统,无依赖。

      6.4.8 批量添加

      和摄像机管理中的批量添加功能完全一致,具体参见上面的操作说明。

      6.4.9 分组设置

      可添加、删除、修改、清空轮询分组名称,相当于轮询预案。

      6.5 用户管理

      用户管理是后面增加的一个模块,用于设置不同的用户不同的类型+权限,可以细分到每个模块的权限,勾选表示具有该权限,内置了7种权限选择,后期还可以在此基础上增加其他权限等。

      6.5.1 用户添加

      单击添加按钮,会自动规则生成默认的信息,直接表格中修改即可,修改好以后单击保存按钮保存所有的信息。

      6.5.2 用户删除

      如果要删除某个用户信息,需要先选中该行,然后单击删除按钮,删除后会自动保存。不允许删除内置的admin用户。

      6.5.3 用户清空

      单击清空按钮会对整个表进行清空操作,清空后数据不能恢复,慎用。

      6.5.4 用户信息导入

      单击导入按钮,可以选择之前导出的csv格式的文件导入数据。

      6.5.5 用户信息导出

      单击导出按钮,将表格数据导出到csv格式的文件,用户可以打开文件编辑,然后再次导入,这样可以作为简易的备份机制使用,也可将繁琐的基础数据录入交给小姑娘去做。

      6.5.6 用户信息打印

      单击打印按钮可以将表格中的内容打印出来,打印前会弹出打印预览界面,可以自行做边距的调整等,可以查看等待打印的内容,翻页切换。

      6.5.7 导出到Excel

      单击导出按钮可以将表格中的内容导出到excel表格,独创的excel导出数据算法,极速导出,支持任意系统,无依赖。

      6.5.8 权限验证

      假设设置了用户没有退出系统和电子地图的权限,则关闭系统的时候会弹出错误信息提示当前用户没有权限。

      6.6 录像计划

      录像文件严格按照30分钟一个文件,除了首个文件和末尾文件不一定是30分钟的文件,中间的肯定是完整的30分钟的文件,时间从00:00到29:59或者30:00到59:59。由于文件打开和保存需要时间以及保证首帧是关键帧(有些设备可以设置I帧间隔50/意味着接近2s一个关键帧),文件可能会有1-2s的偏差。

      基本步骤:

      1. 单击批量按钮可以批量添加1-64通道7 * 24小时录像计划到数据库中。

      2. 每个通道可以设置周一到周日7天的每个半小时时段是否录像。

      3. 上面表格中选中通道,下面录像计划控件选择对应的格子即可。

      4. 可以鼠标右键选择全选、反选、清空操作。

      5. 录像计划控件更改后会立即更新表格中对应通道的录像计划值,1表示该时间段录像,0表示不录像。

      6. 选中通道表格行,下面会自动显示对应的录像计划,一目了然。

      6.7 其他设置

      其他设置里面的内容之前在基本设置中,现在重新开一个窗体,因为后面可能还有各种各样的设置,预留空间。

      6.7.1 地图配置

      参数说明

      1. 地图秘钥:对应百度地图的秘钥,默认内置的作者的秘钥,很多软件系统都用的这个秘钥,用户数较多,可能有并发限制,为了不影响体验,强烈建议改成自己的,可以自行去官网申请,免费。

      2. 地图中心:默认地图的中心点坐标。

      3. 地图级别:默认地图打开以后的缩放级别。

      6.7.2 路径配置

      软件中有多个保存路径,比如正常存储的视频文件路径、报警视频文件路径、抓图保存文件路径、报警图片文件路径等,都在这里设置。

      6.7.3 串口配置

      系统中可能用到了多个串口通信,可以在这里选择对应的串口号和波特率。

      6.7.4 网络配置

      系统中可能用到多种网络通信,比如软件主动连接服务器,需要填写TCP地址和端口,也可能软件作为服务端,填写TCP或者UDP监听端口。

      7 简易步骤

      7.1 添加摄像机

      1. 切换到系统设置-》摄像机管理,单击添加,输入码流地址,单击保存。如果不知道码流地址,需要通过onvif搜索,具体参见 6.3.8 设备搜索 ,有非常详细的步骤。

      2. 在不知道主码流和子码流是啥的情况下,两个地方填一样的,其余默认即可。

      3. 本地文件格式:g:/mp4/1.mp4

      4. USB摄像机:默认ffmpeg内核为 video=USB2.0 PC CAMERA

      5. 摄像机视频流:直接填入rtsp、rtmp、http的视频流地址,该地址可以先用vlc播放器或者potplay等播放器先试试是否能正常播放,不能的话就别添加了,添加了也没卵用,别费力气了。

      7.2 视频播放

      切换到视频监控主界面,左侧设备列表,双击摄像机,自动通道播放,双击录像机则整个录像机下面的摄像机全部加载。

      7.3 云台控制

      云台控制的前提是摄像机是通过onvif搜索的形式添加的,不然没有云台地址没法进行云台控制,当然也必须要求摄像机带云台,不带云台的摄像机是不能进行云台控制的。 @@ -725,15 +725,24 @@ header, .context-menu, .megamenu-content, footer{

      8.1.2 基础功能

      1. 支持各种音频视频文件格式,比如mp3、wav、mp4、asf、rm、rmvb、mkv等。

      2. 支持本地摄像头设备和本地桌面采集,支持多设备和多屏幕。

      3. 支持各种视频流格式,比如rtp、rtsp、rtmp、http、udp等。

      4. 本地音视频文件和网络音视频文件,自动识别文件长度、播放进度、音量大小、静音状态等。

      5. 文件可以指定播放位置、调节音量大小、设置静音状态等。

      6. 支持倍速播放文件,可选0.5倍、1.0倍、2.5倍、5.0倍等速度,相当于慢放和快放。

      7. 支持开始播放、停止播放、暂停播放、继续播放。

      8. 支持抓拍截图,可指定文件路径,可选抓拍完成是否自动显示预览。

      9. 支持录像存储,手动开始录像、停止录像,部分内核支持暂停录像后继续录像,跳过不需要录像的部分。

      10. 支持无感知切换循环播放、自动重连等机制。

      11. 提供播放成功、播放完成、收到解码图片、收到抓拍图片、视频尺寸变化、录像状态变化等信号。

      12. 多线程处理,一个解码一个线程,不卡主界面。

      8.1.3 特色功能

      1. 同时支持多种解码内核,包括qmedia内核(Qt4/Qt5/Qt6)、ffmpeg内核(ffmpeg2/ffmpeg3/ffmpeg4/ffmpeg5/ffmpeg6)、vlc内核(vlc2/vlc3)、mpv内核(mpv1/mp2)、mdk内核、海康sdk、easyplayer内核等。

      2. 非常完善的多重基类设计,新增一种解码内核只需要实现极少的代码量,就可以应用整套机制,极易拓展。

      3. 同时支持多种画面显示策略,自动调整(原始分辨率小于显示控件尺寸则按照原始分辨率大小显示,否则等比缩放)、等比缩放(永远等比缩放)、拉伸填充(永远拉伸填充)。所有内核和所有视频显示模式下都支持三种画面显示策略。

      4. 同时支持多种视频显示模式,句柄模式(传入控件句柄交给对方绘制控制)、绘制模式(回调拿到数据后转成QImage用QPainter绘制)、GPU模式(回调拿到数据后转成yuv用QOpenglWidget绘制)。

      5. 支持多种硬件加速类型,ffmpeg可选dxva2、d3d11va等,vlc可选any、dxva2、d3d11va,mpv可选auto、dxva2、d3d11va,mdk可选dxva2、d3d11va、cuda、mft等。不同的系统环境有不同的类型选择,比如linux系统有vaapi、vdpau,macos系统有videotoolbox。

      6. 解码线程和显示窗体分离,可指定任意解码内核挂载到任意显示窗体,动态切换。

      7. 支持共享解码线程,默认开启并且自动处理,当识别到相同的视频地址,共享一个解码线程,在网络视频环境中可以大大节约网络流量以及对方设备的推流压力。国内顶尖视频厂商均采用此策略。这样只要拉一路视频流就可以共享到几十个几百个通道展示。

      8. 自动识别视频旋转角度并绘制,比如手机上拍摄的视频一般是旋转了90度的,播放的时候要自动旋转处理,不然默认是倒着的。

      9. 自动识别视频流播放过程中分辨率的变化,在视频控件上自动调整尺寸。比如摄像机可以在使用过程中动态配置分辨率,当分辨率改动后对应视频控件也要做出同步反应。

      10. 音视频文件无感知自动切换循环播放,不会出现切换期间黑屏等肉眼可见的切换痕迹。

      11. 视频控件同时支持任意解码内核、任意画面显示策略、任意视频显示模式。

      12. 视频控件悬浮条同时支持句柄、绘制、GPU三种模式,非绝对坐标移来移去。

      13. 本地摄像头设备支持指定设备名称、分辨率、帧率进行播放。

      14. 本地桌面采集支持设定采集区域、偏移值、指定桌面索引、帧率、多个桌面同时采集等。

      15. 录像文件同时支持打开的视频文件、本地摄像头、本地桌面、网络视频流等。

      16. 瞬间响应打开和关闭,无论是打开不存在的视频或者网络流,探测设备是否存在,读取中的超时等待,收到关闭指令立即中断之前的操作并响应。

      17. 支持打开各种图片文件,支持本地音视频文件拖曳播放。

      18. 视频流通信方式可选tcp/udp,有些设备可能只提供了某一种协议通信比如tcp,需要指定该种协议方式打开。

      19. 可设置连接超时时间(视频流探测用的超时时间)、读取超时时间(采集过程中的超时时间)。

      20. 支持逐帧播放,提供上一帧/下一帧函数接口,可以逐帧查阅采集到的图像。

      21. 音频文件自动提取专辑信息比如标题、艺术家、专辑、专辑封面,自动显示专辑封面。

      22. 视频响应极低延迟0.2s左右,极速响应打开视频流0.5s左右,专门做了优化处理。

      23. 支持H264/H265编码(现在越来越多的监控摄像头是H265视频流格式)生成视频文件,内部自动识别切换编码格式。

      24. 支持用户信息中包含特殊字符(比如用户信息中包含+#@等字符)的视频流播放,内置解析转义处理。

      25. 支持滤镜,各种水印及图形效果,支持多个水印和图像,可以将OSD标签信息和各种图形信息写入到MP4文件。

      26. 支持视频流中的各种音频格式,AAC、PCM、G.726、G.711A、G.711Mu、G.711ulaw、G.711alaw、MP2L2等都支持,推荐选择AAC兼容性跨平台性最好。

      27. 内核ffmpeg采用纯qt+ffmpeg解码,非sdl等第三方绘制播放依赖,gpu绘制采用qopenglwidget,音频播放采用qaudiooutput。

      28. 内核ffmpeg和内核mdk支持安卓,其中mdk支持安卓硬解码,性能非常凶残。

      29. 可以切换音视频轨道,也就是节目通道,可能ts文件带了多个音视频节目流,可以分别设置要播放哪一个,可以播放前设置好和播放过程中动态设置。

      30. 可以设置视频旋转角度,可以播放前设置好和播放过程中动态设置。

      31. 视频控件悬浮条自带开始和停止录像切换、声音静音切换、抓拍截图、关闭视频等功能。

      32. 音频组件支持声音波形值数据解析,可以根据该值绘制波形曲线和柱状声音条,默认提供了声音振幅信号。

      33. 标签和图形信息支持三种绘制方式,绘制到遮罩层、绘制到图片、源头绘制(对应信息可以存储到文件)。

      34. 通过传入一个url地址,该地址可以带上通信协议、分辨率、帧率等信息,无需其他设置。

      35. 保存视频到文件支持三种策略,自动处理、仅限文件、全部转码,转码策略支持自动识别、转264、转265,编码保存支持指定分辨率缩放或者等比例缩放。比如对保存文件体积有要求可以指定缩放后再存储。

      36. 支持加密保存文件和解密播放文件,可以指定秘钥文本。

      37. 支持电子放大,在悬浮条切换到电子放大模式,在画面上选择需要放大的区域,选取完毕后自动放大,再次切换放大模式可以复位。

      38. 各组件中极其详细的打印信息提示,尤其是报错信息提示,封装的统一打印格式。针对现场复杂的设备环境测试极其方便有用,相当于精确定位到具体哪个通道哪个步骤出错。

      39. 同时提供了简单示例、视频播放器、多画面视频监控、监控回放、逐帧播放、多屏渲染等单独窗体示例,专门演示对应功能如何使用。

      40. 代码框架和结构优化到最优,性能强悍,持续迭代更新升级。

      41. 源码支持Qt4、Qt5、Qt6,兼容所有版本。

      8.1.4 视频控件

      1. 可动态添加任意多个osd标签信息,标签信息包括名字、是否可见、字号大小、文本文字、文本颜色、背景颜色、标签图片、标签坐标、标签格式(文本、日期、时间、日期时间、图片)、标签位置(左上角、左下角、右上角、右下角、居中、自定义坐标)。

      2. 可动态添加任意多个图形信息,这个非常有用,比如人工智能算法解析后的图形区域信息直接发给视频控件即可。图形信息支持任意形状,直接绘制在原始图片上,采用绝对坐标。

      3. 图形信息包括名字、边框大小、边框颜色、背景颜色、矩形区域、路径集合、点坐标集合等。

      4. 每个图形信息都可指定三种区域中的一种或者多种,指定了的都会绘制。

      5. 内置悬浮条控件,悬浮条位置支持顶部、底部、左侧、右侧。

      6. 悬浮条控件参数包括边距、间距、背景透明度、背景颜色、文本颜色、按下颜色、位置、按钮图标代码集合、按钮名称标识集合、按钮提示信息集合。

      7. 悬浮条控件一排工具按钮可自定义,通过结构体参数设置,图标可选图形字体还是自定义图片。

      8. 悬浮条按钮内部实现了录像切换、抓拍截图、静音切换、关闭视频等功能,也可以自行在源码中增加自己对应的功能。

      9. 悬浮条按钮对应实现了功能的按钮,有对应图标切换处理,比如录像按钮按下后会切换到正在录像中的图标,声音按钮切换后变成静音图标,再次切换还原。

      10. 悬浮条按钮单击后都用名称唯一标识作为信号发出,可以自行关联响应处理。

      11. 悬浮条空白区域可以显示提示信息,默认显示当前视频分辨率大小,可以增加帧率、码流大小等信息。

      12. 视频控件参数包括边框大小、边框颜色、焦点颜色、背景颜色(默认透明)、文字颜色(默认全局文字颜色)、填充颜色(视频外的空白处填充黑色)、背景文字、背景图片(如果设置了图片优先取图片)、是否拷贝图片、缩放显示模式(自动调整、等比缩放、拉伸填充)、视频显示模式(句柄、绘制、GPU)、启用悬浮条、悬浮条尺寸(横向为高度、纵向为宽度)、悬浮条位置(顶部、底部、左侧、右侧)。

      8.2 onvif搜索模块

      8.2.1 效果图

      -

      8.2.2 功能介绍

      1. 广播搜索设备,支持IPC和NVR,依次返回。

      2. 可选择不同的网卡IP进行对应网段设备的搜索。

      3. 依次获取Onvif地址、Media地址、Profile文件、Rtsp地址。

      4. 可对指定的Profile获取视频流Rtsp地址,比如主码流地址、子码流地址。

      5. 可对每个设备设置Onvif用户信息,用于认证获取详细信息。

      6. 可实时预览摄像机图像。

      7. 支持云台控制,可上下左右调节云台,支持绝对移动、相对移动、连续移动三种方式,可对图像拉近拉远。

      8. 支持获取预置位集合、调用预置位、添加预置位、删除预置位等。

      9. 支持图片参数设置,包括亮度、对比度、饱和度、锐度等。

      10. 支持Qt4和Qt6任意Qt版本以及后续Qt版本,亲测Qt4.7.0到Qt6.2。

      11. 支持任意编译器,亲测mingw、msvc、gcc、clang。

      12. 支持任意操作系统,亲测xp、win7、win10、android、linux、嵌入式linux、树莓派全志H3等。

      13. 支持任意Onvif摄像机和NVR,亲测海康、大华、宇视、天地伟业、华为、海思芯片内核等,可定制开发。

      14. 支持对指定IP地址及onvif地址进行单播搜索,比如跨网段情况下非常有用。

      15. 支持指定过滤条件过滤搜索设备。

      16. 支持搜索间隔和搜索策略设置,保证所有设备搜索回来,在大量设备现场很有用(亲测上千个摄像机现场,搜索回来的设备数量比摄像机厂家自带搜索工具还要准确)。

      17. 可对设备进行重启、网络参数获取等。

      18. 支持各种事件订阅、Onvif抓图等操作。

      19. 支持NTP校时和时间同步设置。

      20. 内置了线程实时执行Onvif指令队列,排队最大速度的执行对应的指令,执行结果信号发出。

      21. 采用的最底层的TCP+UDP通信机制,原创最底层协议解析,纯QtWidget编写。

      22. 超级小巧轻量,总共约3000行代码,不依赖任何第三方的库和组件,跨平台。

      23. 封装好了通用的数据发送和接收解析的函数,可以非常方便的自行拓展其他Onvif处理。

      24. 工具上提供了收发数据文本框,显示收发的数据,方便查看和分析。

      25. 支持所有Onvif设备,代码工整,接口友好,直接引入pri即可使用。

      8.2.3 云台说明

      1. x、y、z 范围都在0-1之间。

      2. x为负数,表示左转,x为正数,表示右转。

      3. y为负数,表示下转,y为正数,表示上转。

      4. z为正数,表示拉近,z为负数,表示拉远。

      5. 通过x和y的组合,来实现云台的控制。

      6. 通过z的组合,来实现焦距控制。

      8.2.4 主要功能

      1. 搜索设备,获取设备的信息比如厂家、型号等。

      2. 获取设备的多个配置文件信息profile。

      3. 获取对应配置文件的视频流地址rtsp,以及分辨率等参数。

      4. 云台控制,上下左右移动,焦距放大缩小,相对和绝对移动。

      5. 获取预置位信息,触发预置位。

      6. 订阅事件,接收设备的各种消息尤其是报警事件比如IO口的报警。

      7. 抓图,获取设备当前的图片。

      8. 获取、创建、删除用户信息。

      9. 获取和设备网络配置信息比如IP地址等。

      10. 获取和设置NTP时间同步。

      11. 获取和设置设备时间。

      12. 重启设备。

      8.2.5 处理流程

      1. 绑定组播IP(239.255.255.250)和端口(3702),发送固定的xml格式的数据搜索设备。

      2. 接收到的xml格式的数据解析,得到设备的Onvif地址。

      3. 对Onvif地址发送对应的数据,收到数据取出对应的节点数据。

      4. 请求Onvif地址获取Media地址和Ptz地址,Media地址用来获取详细的配置文件,Ptz地址用来云台控制。

      5. ptz控制是对Ptz地址发送对应的数据即可。

      6. 设置了用户认证的需要组织用户token信息一块发送,每次都需要作鉴权处理。

      7. 接收到的数据不是标准的xml数据,没法按照正常的节点解析来处理,只能用QXmlQuery来做。

      8. 每个厂家设备返回的数据未必完全一致,基本上都不一致,需要进行模糊查找节点值。

      9. 特意采用底层协议解析,因为soap太臃肿函数名称太另类,特意做的轻量级的。

      10. 两个必备工具,Onvif Device Manager 和 Onvif Device Test Tool。

      8.3 gb28181处理模块

      暂未实现

      9 样式风格

      - - - - - -

      本系统内置高达18+套皮肤样式供用户选择,可以在系统设置中随意切换立即应用。

      10 运行效果

      10.1 windows-7

      10.2 windows-11

      10.3 linux-ubuntu

      10.4 linux-fedora

      10.5 linux-centos

      10.6 linux-uos

      10.7 linux-kylin

      10.8 linux-neokylin

      10.9 linux-newstart

      10.10 linux-debian

      10.11 unix-mac

      11 程序框架

      备注:下面的截图和说明未必是最新的,但是大部分是一致的,整体的框架不会改变,可能会有新增加子模块和代码,或者部分类文件有调整或者删除,具体以最新的代码为准。

      11.1 整体代码结构

      本系统采用模块化的设备,有用到第三方开源类库比如串口通信qextserialport,全部放在3rd下面,有用到很多自己封装完善的通用类库比如ffmpeg视频监控,全部放在core下面,设备通信和辅助处理全部放在class下面,所有界面全部放在ui下面,相当于一个个小的组件合起来,最终形成了整个监控系统的完整代码。

      11.2 主模块说明

      名称说明
      3rd一些第三方开源的类库,比如串口通信qextserialport。
      class存放系统初始化、样式控制、自定义控件、设备通信等。
      core本人一直持续更新完善的通用的类库,比如ffmpeg视频监控。
      ui所有的界面都分门别类放在这里。

      11.3 子模块说明

      11.3.1 第三方类库

      这里放的全部是第三方开源的轮子,感谢开源、感谢github、gitee等开源社区。

      名称说明
      3rd_qextserialport第三方串口通信qextserialport,这个类比较稳定可靠,经过了几十个项目持续数十年运行的考验,不用Qt自带的串口类。

      具体代码不做过多说明。

      11.3.2 通信及辅助类

      这里放的都是一些系统初始化、设备通信相关的类。

      名称说明
      api存放数据库表映射成对应的全局队列数据、通用的辅助函数类。
      app全局配置参数管理类、秘钥管理类、通用函数。
      devicecustom用户自定义设备通信管理,比如机器人通信、无人机通信等。
      devicevideo视频监控相关处理类,包括设备地图、表格消息、线程UI通信、人工智能处理等。
      usercontrol当前系统的自定义控件全部放在这里,其中包括云台仪表盘、天气面板等控件。
      11.3.2.1 模块-api
      名称说明
      dbdata将数据库表映射到全局变量数据队列,比如将摄像机表ipcinfo转成QStringList存放一行行数据,这样在程序中运算比较速度极快,直接内存比较,不用每次都去读取数据库。
      dbquery所有的数据库查询插入更新等操作都在这里,比如查询摄像机表、插入日志记录等。
      11.3.2.2 模块-app
      名称说明
      appconfig配置参数类,整个系统的配置参数存放在ini文件中,跨平台,所有参数都对应一个变量,读取配置参数的时候将值赋值给变量,写入的时候将变量值写入到配置文件。
      appdata全局变量类,系统中无可避免需要一些全局变量方便处理,都放在此类,比如版本号、录像机类型、摄像机类型、当前用户信息、地图宽度高度、左侧右侧顶部底部宽高等。
      appevent全局事件转发类,系统越复杂信号需要传递的层级越多,所以需要一个全局事件转发类,用来中转这些事件,这样永远只需要两层就可以收到信号进行处理,而且整个系统看起来干净整洁,不会说一个信号传递到了N个地方乱七八糟,建议需要跨层级传递的信号都放在这里中转。比如软件退出信号,可能多个界面需要收到退出信号进行保存和其他处理,如果从关闭界面发出信号传递给需要的界面,那不知道要中间层层传递多少次,有了这个全局事件转发类,你只需要将事件传给appevent,需要接收事件的地方关联这个信号就行,appevent为全局单例类,整个系统唯一。通用的一些信号有软件退出、全局样式改变、主窗体变化(0-最小化 1-最大化 2-恢复 3-关闭 4-移动 5-尺寸变化)等。
      appinit程序初始化类,在main函数中,会先执行这个初始化的类,比如初始化皮肤、字体、数据库、样式等操作,这些都是要优先在窗体加载前执行的,执行完毕以后再打开窗体主界面。
      appstyle全局样式管理类,整个系统的样式全部放在这里,一般加载流程是先读取样式表文件,然后将本系统独特的样式(比如开关按钮、视频监控、云台仪表盘)内容追加到后面,最后统一设置全局样式,在main函数中加载,和appinit类一样放在最前面执行。
      appurl视频监控系统中常用的默认的视频地址集合。
      11.3.2.3 模块-devicecustom
      名称说明
      devicerobot机器人串口通信管理类。
      devicerobot2机器人串口通信管理类2,有串口数据转发功能。
      deviceuavsserver无人机后端服务类,当前为空,用户自己添加。
      deviceuavsvideo无人机视频监控类,将视频控件设置过来,然后就可以将自己人工智能算法处理后的图片传过来进行绘制,类似于实时视频效果。
      11.3.2.4 模块-devicevideo
      名称说明
      devicehelper整个系统设备管理辅助类,比如插入窗口消息、加载设备列表、加载图片地图、加载设备按钮、初始化视频控件等。
      devicemap设备图片地图管理类,相当于一次性加载所有图片到内存,当要切换或者显示的时候,直接从内存取出来设置即可,速度极快,瞬间相应,纯粹是为了加快相应速度以及可能在图片上进行绘制增加的功能,比从文件系统读取图片文件显示快N倍。
      deviceonvif设备onvif通信管理类,比如获取当前选中通道的onvif地址、开启事件订阅、校对时间、重启设备、获取视频参数、设置视频参数、云台控制等,这里是具体的需要和摄像机信息表及视频通道关联的处理,所以不能放到通用的onvif模块中。
      devicethreadui演示线程通知UI更新,包括每隔一段时间插入消息、异步调用添加表格消息和图文警情、设备GPS移动、报警闪烁、指定通道编号设置视频和通道交换等。
      devicevideosmart人工智能处理类,最常见的应用就是设置一个视频控件,然后在视频控件上绘制人脸框、文字信息等,比如设备的实时运行状态。
      11.3.2.5 模块-usercontrol
      名称说明
      gaugecloud云台仪表盘控件。
      cityhelper省市县联动类,通过从json文件读取省市县信息。
      weather城市天气类,最后显示在标题栏上,实时显示设置的城市的最近几天的天气。
      widgetsound声音面板控件,主界面右下角单击弹出音量条。

      11.3.3 核心通用类库

      这里放的全部是个人一直持续更新完善的独创的轮子,所有的项目都公用这些轮子,用到哪个就包含哪个进来,更新只需要更新轮子代码就行。

      视频监控系统包含的轮子超级丰富给力,物超所值,涵盖了数据导出模块、数据库应用、音频播放和录制、视频播放和录制、ONVIF通信、TCP文件传输、地图应用、通用浏览器内核等。

      名称说明
      core_audio音频播放和录制,包括音频输入输出设备管理、音频播放、音频录制、音频振幅控件等。
      core_common通用函数,包括通用秘钥、通用导航、通用样式、声音播放、日志记录、运行时间记录等。
      core_control通用自定义控件,很多系统经常用到的控件全部放在这里,比如开关按钮、设备容器、设备按钮、颜色下拉框等。
      core_dataout数据导入导出到xls/pdf和打印类库,极速、跨平台、无依赖。
      core_db数据库通用类库比如数据库线程管理、数据清理、数据采集等。
      core_form通用的用户登录、用户退出、用户管理、数据库配置界面类等。
      core_map地图综合应用类库,百度地图(支持在线离线)和echart封装类等。
      core_onvifonvif功能封装类,包括设备搜索、云台控制、设备参数设置等。
      core_qthelper通用的辅助类,包括自定义对话框,全局辅助函数,图形字体等。
      core_tcpfile文件多线程收发类,支持多个并发。
      core_video视频播放核心类,包括了监控画面切换控件、视频回放控件、视频播放组件结构体、视频播放辅助函数、视频解码线程类、视频显示控件类等。
      core_videobase视频相关基类,包括音视频文件保存基类、视频解码基类、视频控件基类、视频悬浮工具栏、视频控件结构体等。
      core_videoffmpeg视频监控内核ffmpeg版本,本系统默认采用的内核。包括使用ffmpeg采集和保存到mp4文件的类。
      core_videohelper监控内核辅助类,包括本地视音频设备名称获取,滤镜字符串获取,地址获取辅助类等。
      core_videoopenglopengl封装类,支持打开yuv/nv12文件,绘制yuv/nv12帧数据,一般搭配ffmpeg视频内核显示视频,直接走GPU绘制。
      core_webview通用浏览器控件类,同时支持webkit、wenengine、miniblink三种内核,打通了所有的Qt版本。
      11.3.3.1 模块-core_audio
      名称说明
      audiohelper音频相关辅助函数,比如获取音频输入输出设备、根据设备名称查找设备对象、初始化音频格式、获取对应音频格式最大振幅、获取对应音频格式音频数据的振幅级别等。
      audiolevel音频振幅控件,根据传入的音频振幅大小绘制振幅,可设置颜色。
      audioplayer音频播放类,可以设置声音大小和静音状态,支持带参数打开音频输入和输出设备,自动关联音频输入输出设备形成话筒和音响联动。
      audiorecorder音频录制类,可以设置音频录制的参数,包括采样大小、比特率、通道数、质量级别、编码模式等。
      11.3.3.2 模块-core_common
      名称说明
      base64helper图片及文字和base64编码之间转换的类。
      commonkey通用秘钥管理类,指定校验秘钥文件,可设置运行时间、设备数量等限制,支持根据硬件指纹特征生成机器码文件等。
      commonnav通用菜单导航管理类,用来控制和显示顶部导航栏、左侧导航栏的样式。很多子界面需要用到,所以封装成一个专门管理这个的类。
      commonstyle通用样式管理类,比如Qt自带类窗体样式、自定义控件样式、分页导航样式、导航按钮样式、开关按钮样式等。相当于将多个项目常用的自定义样式封装一起做成通用。
      framelesswidget2无边框窗体拉伸类,边框四周八个方位都可以自由拉伸,可设置是否允许拖动和拉伸。
      playwav声音文件播放类,通用Qt456,自动识别当前Qt版本使用对应的类,Qt4采用QSound,Qt5以上采用QSoundEffect,嵌入式采用对应的命令行aplay、mpv来播放。
      savelog日志钩子类,将系统中所有的打印信息转为日志存储或者输出到网络等,可以开启用来打印输出日志信息。
      saveruntime保存运行时间类,用来存储系统启动后每隔一段时间就输出一条记录用来记录启动后软件运行了多久,方便分析问题。
      11.3.3.3 模块-core_control
      名称说明
      bottomwidget通用底部状态栏控件,可以设置软件名称、版本号、运行时间等。
      colorcombobox颜色下拉框控件,在系统设置中有。
      cpumemorylabelCPU和内存使用情况标签控件,主界面右上角显示。
      customtitlebar停靠窗体自定义标题栏控件。
      devicebutton设备按钮控件,比如图片地图模块中用到,可设置不同的图标样式和状态等,双击发出信号进行相应处理比如弹出对应窗体等。
      lcddatetime软件右上角显示时间的控件。
      panelwidget面板容器控件,主界面子模块表格消息,就用到此控件,用于将一堆widget放到此容器进行管理,自动形成滚动条等。
      switchbutton开关按钮控件,在系统设置中存在大量该控件。
      xslider滑动条控件,在原有滑动条基础上增加了鼠标按下立即定位等。
      11.3.3.4 模块-core_dataout
      名称说明
      datacreat通用数据报表内容创建类,比如生成表格格式的html内容,然后赋值给dataprint直接打印,里面举例了图文混排的报告内容,后期会不断增加其他模板,也可以自行增加其他模板数据。
      datacsv导入导出数据,csv格式,可设置分隔符。拓展名。过滤条件等。
      datahead当前组件通用头文件。
      datahelper辅助类,比如校验规则函数,通用数据导出+打印函数。
      dataprint数据打印到pdf及纸张,支持多线程。
      dataxls数据导出到xls类,支持多线程导出。
      11.3.3.5 模块-core_db
      名称说明
      dbcleanthread自动清理数据线程类。
      dbconnthread数据库通信管理线程类。
      dbdelegate自定义委托全家桶,包括复选框、下拉框、密码框、按钮等。
      dbhead当前组件通用头文件。
      dbhelper各种数据库应用函数封装,比如初始化数据库、执行sql语句等。
      dbhttpthread网络请求数据采集类。
      dbpage数据库通用翻页类。
      dbpagemodel数据库翻页类数据模型。
      navpage分页导航控件。
      11.3.3.6 模块-core_form
      名称说明
      formhelper封装的导入导出、导出数据到xls/pdf和打印数据、自动备份数据、保存最后打开的文件夹等。
      frmconfigdb通用数据库管理界面类,可选不同的数据库类型,填入用户信息,执行检测连接和初始化数据操作。
      frmconfiguser通用用户管理界面类,可添加、删除、修改用户信息,包括权限分配等,可导入导出打印用户信息。
      frmlogin通用用户登录界面类,包括自动登录和记住密码复选框,多次密码错误校验,记住当前用户信息等。三次错误关闭,下拉可选用户,内置超级密码。
      frmlogout通用用户退出界面类,三次错误关闭,下拉可选用户,内置超级密码。
      userhelper通用用户权限管理类,内置7种类型权限,对应权限名称可自定义,一般在用户切换对应界面或者单击了对应功能按钮的时候触发。
      11.3.3.7 模块-core_map
      名称说明
      echartjsechart模块中用到的json文件转js文件,获取js文件中的名字和经纬度等处理。
      echartsechart封装类,可加载仪表盘、闪烁点图、迁徙图、世界地图、区域地图等,每个点可自定义颜色和提示信息等。
      mapbaidu百度地图封装类,支持在线和离线两种模式。
      11.3.3.8 模块-core_onvif
      名称说明
      onvifbase基础类,用于获取设备信息、服务文件地址、能力文件地址、媒体文件地址、视频流地址等。
      onvifdevice设备类,核心处理及管理,包括设置用户信息请求onvif地址、获取设备信息、云台控制、事件订阅、抓拍图片等。
      onvifevent事件订阅具体实现类,可设置请求超时时间等。
      onvifhead当前组件通用头文件。
      onvifhelper辅助类,比如获取UUID用于请求、判断IP合法、获取本机IP地址集合、管理系统中所有onvif设备对象等。
      onvifmedia获取媒体文件具体解析类。
      onvifother其他处理类,比如系统重启、NTP校时、获取和设置网络信息、获取和设备时间、获取和设置图片参数等。
      onvifptz云台控制实现类,包括绝对移动、相对移动等。
      onvifquery数据查询类,用于将接收到的xml数据解析,并赋值字符串比如命名空间、设备地址、媒体地址、事件地址等。
      onvifrequest网络请求类,包括设置用户信息、获取用户token数据、获取xml头部数据等,通用的请求数据返回结果函数。
      onvifsearch设备搜索类,支持广播搜索、指定地址搜索,可获取设备信息集合、获取设备地址集合。
      onvifservices服务类,用于获取媒体地址、云台地址等。
      onvifsnap图片抓拍实现类,包括获取抓图地址、抓拍图片等。
      11.3.3.9 模块-core_qthelper

      本组件涵盖的功能较多,所以采用了分层管理代码结构。

      名称说明
      iconhelper万能图形字体类,可传入多种图形字体文件,一个类通用所有图形字体。
      globalconfig存储当前组件的配置参数信息,比如全局的字体名称、字号、无边框窗体的最小化最大化关闭等图标、样式表的颜色值。
      globalhead当前组件通用头文件。
      globalstyle当前组件通用样式设置管理类,可以指定枚举类型样式、传入样式内容设置、获取样式表文件对应的颜色值等。当前组件样式相关的处理函数都放在这里,统一管理。
      名称说明
      qtabout关于系统对话框,可传入软件标题、版本、版权、网址等信息。
      qtdateselect自定义日期范围选择对话框。
      qtinputbox自定义输入框窗体,可指定不同的输入类型比如文本框、下拉框等。
      qtmessagebox自定义信息消息框窗体,可设置关闭倒计时,不同的类型比如信息框、询问框、错误框等。
      qtsplash自定义弹出提示信息,提示完自动消息关闭。
      qttipbox自定义右下角信息对话框,可设置对齐方式、关闭倒计时等。
      qtform自定义无边框窗体,可设置标题,各种图标等。
      名称说明
      qthelper项目通用辅助类,各种常用函数的封装,比如获取当前屏幕分辨率、设置字体、设置编码、加载翻译文件、各种进制数据转换、弹出各种对话框、设置延时时间等。
      qthelpercore获取当前桌面分辨率,设置编码、字体、翻译文件等。
      qthelperdata16进制、2进制、10进制互相转换,16进制字符串、字节数组互相转换,字节数组转int和short,CRC校验等。
      qthelperfile选择文件、保存文件、选择目录等对话框,复制文件、删除文件等。
      qthelperform设置无边框窗体、边框阴影,弹出信息框、错误框、询问框、日期选择框、关于对话框、中间提示框等。
      qthelperimage获取等比例缩放图片,通用设置logo图片,支持资源文件、本地图片、图形字体、svg自动变色等多种形式。
      qthelpernet获取本机IP地址集合,获取外网IP地址,判断IP、MAC等是否合法,下载网络文件,IP地址字符串与整型互相转换。
      qthelperother初始化数据库文件,设置系统时间、开机启动,设置图标到按钮,写入临时消息的文本文件等。
      11.3.3.10 模块-core_tcpfile
      名称说明
      tcpfilehead当前组件通用头文件。
      tcpfilehelper辅助类,包括将字节转为MB单位、初始化表格控件、生成表格行、数据加密解密、解压文件、重启系统等。
      tcpreceivefileserver接收文件服务类,管理多个接收文件线程,支持监听端口被动接收文件和主动连接服务器接收文件。
      tcpreceivefilethread接收文件线程类,根据发送的文件名、包编号、块大小、挨个接收数据最终形成文件,可设置保存文件夹等。
      tcpsearchfileserver搜索文件服务类,目前没用,用于接收请求搜索文件是否存在。
      tcpsendfilethread发送文件线程类,按照 文件开始符+文件大小+文件内容+文件结束符 逐个分包发送,可对文件的每个包进行加密传输。
      11.3.3.11 模块-core_video

      视频组件继承和依赖关系说明:

      1. videobase是基类组件,video是视频播放组件,依赖基类组件,videoffmpeg是具体的内核实现组件,依赖视频播放组件。

      2. video组件中的videothread解码线程类继承自videobase基类组件中的abstractvideothread。

      3. video组件中的videowidgetx视频显示类继承自videobase基类组件中的abstractvideowidget。

      4. videoffmpeg组件中的ffmpegthread继承自video组件中的videothread。

      5. videoffmpeg组件中的ffmpegsave继承自videobase组件中的abstractsavethread。

      6. 按照此规则还有其他内核比如vlc组件中的vlcthread也是继承自videothread,mpv组件中的mpvthread也是继承自videothread。这样新增一种内核只要具体实现部分处理函数即可应用整个视频框架。

      7. 通过多层基类继承关系,使得动态挂载任意解码内核极为方便。

      8. 为何在video视频组件的基础上还要提炼一个videobase基类组件?因为该基类组件还可以提供给camera本地摄像头采集组件使用,基类中的变量、函数、处理逻辑几乎一致,但是又有特殊性,所以需要分开再提炼出videobase基类。

      名称说明
      videobox监控画面切换控件,将所有通道切换处理全部集中到一个类,通用异形布局切换函数,可以参考进行自定义异形布局,通道布局切换发出信号通知,支持自定义子菜单布局内容。
      videohelper视频相关辅助函数,比如根据url地址取出ip地址、校验网络地址是否可达、检查地址是否正常、根据地址获取本地摄像头参数、获取本地桌面采集参数、创建视频采集类、对采集线程设置参数等。
      videomanage视频线程管理类,全局单例,将所有视频控件发给此类管理,负责挨个打开视频、应用录像计划等。
      videoplayback视频回放控件,支持多个通道,显示每个通道对应的视频段。
      videostruct视频播放组件结构体定义类,包括解析内核枚举值、视频类型枚举值、解码策略枚举值、视频采集参数结构体。
      videotask视频任务线程类,全局单例,可以随时插入一些视频相关的任务进行处理,比如vlc录制视频后需要重命名文件,mpv内核关闭视频后鼠标指针打圈圈需要复位。
      videothread视频解码线程类,内置了共享解码线程处理逻辑,可以打开视频、关闭视频、设置视频宽高比例、获取文件总时长、获取媒体信息、获取和设置播放位置、获取和设置播放速度、获取和设置音量大小、获取和设置静音状态等。
      videoutil视频相关辅助函数,加载视频内核、视频地址、视频模式、解码策略、编码策略、硬件加速、通信协议、缓存时间、读取超时等。
      videowidgetx视频播放控件,一个控件对应一个解码线程,提供播放成功、播放结束、收到截图、工具栏按钮单击等处理,提供开始播放、停止播放、暂停播放、继续播放、抓拍截图、开始录制、暂停录制、停止录制等接口。
      11.3.3.12 模块-core_videobase
      名称说明
      abstractsavethread音视频存储基类,可以设置需要保存的音视频文件类型,比如音频文件类型有pcm、wav、aac,视频文件类型有yuv、h264、mp4,提供开始保存、暂停保存、停止保存等接口。
      abstractvideosurface视频回调基类,用于Qt中的QCamera和QMedia类播放后拿到回调视频数据,这样可以取到一张张图片。
      abstractvideothread视频解码线程基类,摄像头采集线程和视频采集线程都继承自此类,将各种公用的变量、函数、接口、信号槽全部放在基类,包括了停止线程标志位、打开是否成功标志位、暂停采集标志位、开始截图标志位、正在录制标志位,提供了虚函数开始播放、停止播放、暂停播放、继续播放、抓拍截图、截图完成、开始录制、暂停录制、停止录制等,提供写入视频数据到文件、写入音频数据到文件槽函数。
      abstractvideowidget视频显示控件基类,
      bannerwidget悬浮工具栏控件,可以设置各种颜色、按钮图标集合、按钮名称集合、按钮提示信息集合等,悬浮条位置支持上下左右四个方位。
      widgethelper窗体相关辅助函数,包括传入图片尺寸和窗体区域及边框大小返回居中区域(scaleMode: 0-自动调整 1-等比缩放 2-拉伸填充)、绘制矩形区域比如人脸框、绘制点集合多边形路径比如三角形、绘制路径集合、显示截图预览等。
      11.3.3.13 模块-core_videoffmpeg
      名称说明
      ffmpegfilter滤镜相关静态函数,传入滤镜结构体数据获取滤镜字符串,初始化滤镜、释放滤镜数据。在ffmpegthread中调用。
      ffmpeghelper相关辅助函数,包括初始化各种参数、格式枚举值转字符串、初始化音频转换上下文、初始化和获取音频通道相关、获取和设置旋转角度、获取解码器枚举值和名称、获取码率格式媒体类型、获取分辨率采样率流信息、拷贝上下文参数、释放数据帧数据包等。其中为了兼容ffmpeg2-ffmpeg6以及后续所有版本,在这里全部做了不同版本对应不同函数调用的区分。
      ffmpegsave视频存储类,用于保存h264和mp4文件,同时也可用于推流。
      ffmpegsavehelper视频存储辅助类,包括校验是否需要启用编码、获取保存的格式、根据分辨率获取码率、根据缩放字符串获取最终宽高、初始化视频编码器、初始化视频编码器上下文、初始化视频转换相关、初始化音频编码器上下文、初始化音频转换相关、封装格式(写入sps/pps信息)、通用软编码(支持音频视频)、转换时间基准等。
      ffmpegsync音视频同步线程类,解码后的音视频数据发给本类进行时间同步处理,采用的外部时钟同步策略。音视频播放的进度也在本类中。
      ffmpegthread视频解码线程核心,从打开地址、分配解码器、初始化参数、取出音视频数据解码、关闭并释放资源等都在本类实现。
      ffmpegthreadhelper视频解码辅助类,包括根据解码策略获取解码参数、校验硬解码、读取封面、初始化视频解码器、初始化硬解相关、初始化解码视频相关数据、初始化解码音频相关数据、计算实时码率、通用硬解码(音频没有硬解码)、通用软解码(支持音频视频)、打开超时和读取超时回调等。
      ffmpegutil其他辅助函数,比如打印输出编码解码信息、打印编码器的相关参数、打印设备列表和参数、获取输入输出设备名称集合、视频帧旋转、获取指定文件时长、解析sps/pps数据等。
      11.3.3.14 模块-core_videohelper
      名称说明
      audioplayer音频播放类,空的,纯粹为了在没有Qt音频播放类QAudioOutput的时候使用,有些Qt版本或者嵌入式板子环境未必有这个类,但是又不能影响整个组件的运行,于是定义了空的类,函数正常调用但是不做任何处理。
      deviceinfohelper获取本地视音频输入设备名称,通用函数取出本地设备带分辨率和帧率等信息,根据屏幕区域校验参数,获取本地屏幕信息和当前屏幕区域。
      filterhelper滤镜相关辅助类,传入旋转角度获取旋转滤镜字符串、根据标签信息获取对应滤镜字符串、根据图形信息获取对应滤镜字符串、转换滤镜字符串到ffmpeg格式、传入标签队列和图形队列获取滤镜字符串。此类主要给ffmpeg内核、qtav内核、mdk内核使用。
      imagelabel图片标签控件,多线程绘制传入的图片,性能比setpixmap更优。
      urlhelper通用地址辅助类,设备厂家类型结构体、地址参数结构体,各个厂家的实时及回放视频流字符串函数,根据url播放地址获取地址对应的各种信息比如IP地址和端口等。
      urlutil视频地址相关静态函数,可以读取和写入地址到文本文件,用作历史记录,内置了各种类型(rtsp、http、音频文件、视频文件、网络文件、本地摄像头)的测试音视频地址集合。
      11.3.3.15 模块-core_videoopengl
      名称说明
      openglinclude当前组件头文件。
      nv12glwidget空类,用于没有opengl的Qt版本中保证程序能够继续运行。
      nv12openglwidget继承自QOpenGLWidget的NV12格式OPENGL绘制窗体。
      yuvglwidget空类,用于没有opengl的Qt版本中保证程序能够继续运行。
      yuvopenglwidget继承自QOpenGLWidget的YUV格式OPENGL绘制窗体。
      11.3.3.16 模块-core_webview
      名称说明
      webcore.pri通用的根据不同的Qt版本、不同的编译器环境、不同的操作系统,加载对应的浏览器内核模块和定义不同的变量。
      miniblinkminiblink封装处理类。
      webhelper经纬度转换、获取小数点经纬度值等常用处理函数。
      webjsdata通用的浏览器控件和Qt程序交互数据中转类。
      webview通用浏览器控件,支持webkit、webengine、miniblink。

      11.3.4 界面UI

      界面说明

      1. 这里分门别类存放的各种功能集合的界面类。

      2. 每个类都一个ui文件、一个h头文件、一个cpp实现文件。

      3. 可以方便快速查找对应功能的界面,也方便拓展增加界面。

      4. 不仅分文件夹存放的,而且命名也尽量按照对应功能打头,比如系统设置模块中的都用frmconfig打头。

      5. 外层文件夹是整齐的,内部代码也是整齐的。

      名称说明
      frmconfig系统设置模块,包括基本设置、录像机管理、摄像机管理、轮询管理、用户管理、视频上传等。
      frmdata日志查询模块,包括本地日志、设备日志等。
      frmdemo演示demo示例,用于演示具体控件或者功能的使用,方便学习参考,比如视频图片、视频控件、视频存储都单独的使用demo。
      frmipc存放摄像机处理相关的模块,比如设备控制,云台控制、预置位、巡航设置等。之前放在frmmodule模块中,后面独立出来管理更方便。
      frmmain主界面模块,包括登录登出界面、主界面、右上角时间组件、欢迎组件等。
      frmmap地图模块,包括通用地图内核界面、图片地图、在线地图、离线地图、路径规划等。
      frmmodule停靠子窗体模块,包括停靠窗体管理核心类、设备列表、窗口信息、图文警情、设备轨迹、网页浏览等模块。将摄像机、机器人、无人机相关的模块放到了对应的模块文件夹,这里放的是系统通用的模块。
      frmrobot无人机模块,包括图像增强、飞行监控等模块。
      frmuavs无人机模块,包括图像增强、飞行监控等模块。
      frmvideo视频监控模块,所有视频监控相关的都放在这里,包括主界面的视频监控布局窗体、视频回放、远程回放、图片回放等。
      11.3.4.1 模块-frmconfig
      名称说明
      frmconfig系统设置模块主界面,采用堆栈窗体形式,加载多个子界面比如摄像机管理、轮询管理等。
      frmconfigipc摄像机管理,可以增加、删除、修改、清空、导入、导出、打印摄像机信息。
      frmconfigipcsearchonvif设备搜索,独立出来的窗体,可以搜索局域网内的所有onvif摄像机信息,搜索完以后获取摄像机的视频流地址等,最后可以单个添加或者批量选中添加到摄像机信息表格中。
      frmconfignvr录像机管理,可以增加、删除、修改、清空、导入、导出、打印录像机信息。
      frmconfigpoll轮询管理,可以增加、删除、修改、清空、导入、导出、打印轮询点信息。可以按照设定规则批量生成轮询点信息。
      frmconfigpollplus将轮询管理中的轮询参数配置、分组管理、批量添加等独立出来的界面,方便管理和拓展。
      frmconfigsave录像计划,可以对每个通道每周每天每半小时时间段设置是否存储录像。
      frmconfigsystem系统设置,包括基本设置、视频参数、数据库设置、地图配置、功能激活、颜色配置、串口配置、网络配置等。
      11.3.4.2 模块-frmdata
      名称说明
      frmdata日志查询模块主界面,采用堆栈窗体形式,加载多个子界面包括本地日志、设备日志等。
      frmdatadevice设备日志,通过私有协议从NVR取对应设备日志信息。
      frmdatauser本地地址,用户操作的日志信息,可查询和导出打印数据记录。
      11.3.4.3 模块-frmdemo
      名称说明
      frmdemo单独的功能演示示例主窗体,加载多个子界面比如视频控件等。
      frmdemohelper通用辅助示例,主要演示qthelper通用组件中封装的函数如何使用,比如各种消息框、提示框等。
      frmdemovideochange通道交换示例,演示两个视频通道如何无缝切换。
      frmdemovideodrag拖曳播放示例,演示从文件夹拖曳文件到视频控件播放。
      frmdemovideodraw标签绘制示例,演示各种OSD标签示例和各种图形绘制示例。
      frmdemovideoimage视频图片示例,从图片文件夹读取图片集合,定时器绘制取出图片发给视频控件绘制。
      frmdemovideoosd动态标签示例,演示动态更新和插入OSD标签。
      frmdemovideoplay4同步播放示例,演示4个通道切换进度条同步播放进度。
      frmdemovideoplus视频叠加示例,多个视频控件叠加在一起同时播放,可以设置在四个角落位置。
      frmdemovideosave视频保存示例,演示如何对视频控件进行视频保存,可动态保存。
      frmdemovideovolume音频振幅示例,演示实时显示当前播放的音量大小音频振幅,柱状条显示。
      frmdemovideowidget视频控件示例,演示视频控件如何使用。
      11.3.4.4 模块-frmipc
      名称说明
      frmipccontrol设备控制模块,可对选中设备进行图片参数调节、NTP校时、设备重启、抓拍图片(ONVIF抓图)等。
      frmipcnavigate巡航管理模块,暂未实现,后期完善。
      frmipcreset预置位管理模块,暂未实现,后期完善。
      frmipcptz云台控制模块,可对选中的摄像机进行云台控制。
      11.3.4.5 模块-frmmain
      名称说明
      frmmain系统主界面,采用堆栈窗体,加载各个子模块。
      frmmain1备用模块1界面,根据参数设置决定是否启用。
      frmtimecpu右上角日期时间+CPU内存显示。
      frmwelcome右上角欢迎信息界面。
      11.3.4.6 模块-frmmap
      名称说明
      frmmap地图管理主界面,采用堆栈窗体形式,加载各个子界面比如图片地图、在线地图、离线地图、路径规划等。
      frmmapcore通用百度地图内核界面,用来加载百度地图,可设置在线、离线模式,有很多个窗体用到类似功能特意封装到一个类,重复利用,比如悬浮地图、飞行轨迹、路径规划等模块都用到了此内核。
      frmmapdevice通用的设备地图界面,在线地图和离线地图界面公用这个界面,唯一区别就是设置下地图的模式是在线还是离线。
      frmmapimage图片地图界面,设备作为一个个按钮点显示在对应地图上,可以拖动,双击弹出预览实时视频。
      frmmaplocal离线地图界面,可更新经纬度值、模拟运动轨迹等。
      frmmapweb在线地图界面,可更新经纬度值、模拟运动轨迹等。
      frmmaproute路径规划界面,可查询路线得到路线的经纬度坐标集合。
      11.3.4.7 模块-frmmodule
      名称说明
      frmdevicegps设备轨迹模块,对设定的设备随机模拟轨迹,也可传入经纬度坐标值自动移动并绘制轨迹线条,不同设备可以不同颜色。
      frmdevicetree设备列表模块,读取设备信息加载形成树状列表,双击或者拖动到视频监控窗体直接播放视频,提供右键菜单作为演示如何使用。
      frmmodule主界面中心部分窗体,采用QMainWindow类,中间加载的视频监控面板,其余new出来每个子模块,子模块可停靠和悬浮拖动等。不同工作模式下的各种子模块都在此加载。同时负责管理模块的显示隐藏菜单。
      frmmsglist图文警情模块,也叫消息列表模块,带有右键菜单添加、删除、清空列表中的消息,双击可以弹出大图预览。
      frmmsglistitem图文警情模块子类,都是由一个个item组成放到panelwidget面板控件中,自动形成滚动条。
      frmmsgtable窗口消息模块,也叫表格消息模块,表格形式显示打印信息,不同的内容可以不同颜色区分。
      frmwebview网页浏览模块,传入一个url地址打开对应的网页,比如打开一个3D的网页。
      11.3.4.8 模块-frmrobot
      名称说明
      frmrobotdata仿真数据模块,启动机器人通信服务,接收数据解析显示。
      frmrobotdebug数据调试模块,可模拟发送轨迹数据测试解析类。
      frmrobotdebug2新数据调试模块,打印多个串口数据,不同颜色显示。
      frmrobotemulate运动仿真模块,预留给用户实现,一般放个3D效果。
      frmrobotlog机器人实时数据模块,预留给用户实现。
      11.3.4.9 模块-frmvideo
      名称说明
      frmvideo视频回放模块主界面,堆栈窗体形式,加载多个子界面比如本地回放、远程回放、设备播放等。
      frmvideopanel视频监控面板,主界面中间部分,这是核心,管理多个通道,通道可移除删除,拖曳打开,拖曳交换等。
      frmvideopaneltool视频监控底部工具栏,独立出来一个类专门管理。
      frmvideoplayimage图片回放模块,按照规则查询图片目录,然后可设定播放速度进行图片序列播放。
      frmvideoplaylocal本地回放模块,查询对应通道的本地存储的视频文件,双击播放,可暂停和拖动进度条位置。
      frmvideoplaynvr设备播放模块,通过RTSP视频流的形式从远程设备取视频进行播放,支持摄像机和录像机,手动填入地址也行。
      frmvideoplayweb远程回放模块,需要用厂家sdk去实现,从NVR回放录像。
      frmvideopreview视频预览窗体,比如图片或者地图上双击设备弹出的视频预览,可以多个,关闭的时候自动释放资源。
      frmvideoupload视频上传,将本地存储的视频文件上传到服务器。

      12 二次开发

      12.1 通用开发环境搭建

      1. 第一步:安装系统,推荐用vmware虚拟机。

      2. 第二步:安装qt环境,可以直接用官方下载的run安装包安装,有些要求用命令行安装。

      3. 第三步:写个空白窗体程序测试下是否环境正常。

      4. 第四步:拷贝ffmpeg库文件,也可自行编译ffmpeg,生成对应的动态库或者静态库。

      5. 第五步:打开video_system.pro项目进行编译。

      6. 第六步:打包发布,为了发布方便,推荐用静态编译的Qt+静态编译的ffmpeg,这样打包发布很清爽,就一个可执行文件。

      12.2 不同系统注意事项

      12.3 监控系统组件示例

      本系统功能比较多,封装了多个控件,尤其是核心的视频监控控件,所以特意安排了独立的使用示例演示如何使用,可以在main函数找到 AppConfig::IndexStart = 0; 改成AppConfig::IndexStart = 1;即可,这样编译运行的是监控系统组件示例。

      12.3.1 通用辅助

      演示通用组件比如qthelper封装的类的使用。

      1. 弹出信息框

      2. 弹出错误框

      3. 弹出询问框

      4. 带自动关闭倒计时

      5. 弹出右下角信息框

      6. 隐藏右下角信息框

      7. 弹出时间选择框

      8. 弹出中间提示信息

      9. 弹出关于对话框

      12.3.2 视频图片

      演示加载图片文件夹,进行图片序列的播放。

      12.3.3 视频控件

      演示通用视频控件如何使用,包括打开、关闭、暂停、继续、截图、自动抓拍等功能。

      12.3.4 视频存储

      演示视频控件如何存储视频文件到本地,单击开始按钮开始存储视频,单击关闭则关闭存储。

      12.3.5 视频叠加

      演示如何用多个视频控件做视频叠加播放,可以设置叠加的位置在四个角落。

      12.3.6 同步播放

      演示如何同步播放多个视频,切换进度条自动全部切换播放进度。

      12.3.7 音频频谱

      演示如何关联视频声音左右通道频谱信号,界面中音量控件实时显示当前的左右通道音量值。

      12.3.8 拖曳播放

      演示关联拖曳文件信号,识别本地文件拖曳到视频控件中播放。

      12.3.9 视频切换

      演示如何无缝切换打开不同视频,避免关闭后打开中间产生的空白缝隙。

      12.3.10 标签图形

      演示如何添加各种osd标签信息和各种图形信息,osd标签信息可以设置字体、颜色、位置等,图形信息可以是矩形、三角形、多边形、圆形等。都支持批量多个添加。

      12.3.11 文字水印

      演示视频控件文字水印功能,可以添加日期时间水印、自定义文字水印、实时码率帧率水印,提供按钮主动更新自定义文字水印。

      12.4 人工智能集成

      13 其他说明

      13.1 海康onvif设置

      新版的海康的摄像机,默认onvif是关闭的,需要手动开启,开启以后记得添加onvif用户,并重启摄像机应用。提示:海康旗下的萤石目前暂时不支持onvif协议。这里添加的用户,如果选择视频用户类型,则只能观看视频不能云台控制,只有管理员权限才能云台控制。

      13.2 大华onvif设置

      +

      8.2.2 功能介绍

      1. 广播搜索设备,支持IPC和NVR,依次返回。

      2. 可选择不同的网卡IP进行对应网段设备的搜索。

      3. 依次获取Onvif地址、Media地址、Profile文件、Rtsp地址。

      4. 可对指定的Profile获取视频流Rtsp地址,比如主码流地址、子码流地址。

      5. 可对每个设备设置Onvif用户信息,用于认证获取详细信息。

      6. 可实时预览摄像机图像。

      7. 支持云台控制,可上下左右调节云台,支持绝对移动、相对移动、连续移动三种方式,可对图像拉近拉远。

      8. 支持获取预置位集合、调用预置位、添加预置位、删除预置位等。

      9. 支持图片参数设置,包括亮度、对比度、饱和度、锐度等。

      10. 支持Qt4和Qt6任意Qt版本以及后续Qt版本,亲测Qt4.7.0到Qt6.2。

      11. 支持任意编译器,亲测mingw、msvc、gcc、clang。

      12. 支持任意操作系统,亲测xp、win7、win10、android、linux、嵌入式linux、树莓派全志H3等。

      13. 支持任意Onvif摄像机和NVR,亲测海康、大华、宇视、天地伟业、华为、海思芯片内核等,可定制开发。

      14. 支持对指定IP地址及onvif地址进行单播搜索,比如跨网段情况下非常有用。

      15. 支持指定过滤条件过滤搜索设备。

      16. 支持搜索间隔和搜索策略设置,保证所有设备搜索回来,在大量设备现场很有用(亲测上千个摄像机现场,搜索回来的设备数量比摄像机厂家自带搜索工具还要准确)。

      17. 可对设备进行重启、网络参数获取等。

      18. 支持各种事件订阅、Onvif抓图等操作。

      19. 支持NTP校时和时间同步设置。

      20. 内置了线程实时执行Onvif指令队列,排队最大速度的执行对应的指令,执行结果信号发出。

      21. 采用的最底层的TCP+UDP通信机制,原创最底层协议解析,纯QtWidget编写。

      22. 超级小巧轻量,总共约3000行代码,不依赖任何第三方的库和组件,跨平台。

      23. 封装好了通用的数据发送和接收解析的函数,可以非常方便的自行拓展其他Onvif处理。

      24. 工具上提供了收发数据文本框,显示收发的数据,方便查看和分析。

      25. 支持所有Onvif设备,代码工整,接口友好,直接引入pri即可使用。

      8.2.3 云台说明

      1. x、y、z 范围都在0-1之间。

      2. x为负数,表示左转,x为正数,表示右转。

      3. y为负数,表示下转,y为正数,表示上转。

      4. z为正数,表示拉近,z为负数,表示拉远。

      5. 通过x和y的组合,来实现云台的控制。

      6. 通过z的组合,来实现焦距控制。

      8.2.4 主要功能

      1. 搜索设备,获取设备的信息比如厂家、型号等。

      2. 获取设备的多个配置文件信息profile。

      3. 获取对应配置文件的视频流地址rtsp,以及分辨率等参数。

      4. 云台控制,上下左右移动,焦距放大缩小,相对和绝对移动。

      5. 获取预置位信息,触发预置位。

      6. 订阅事件,接收设备的各种消息尤其是报警事件比如IO口的报警。

      7. 抓图,获取设备当前的图片。

      8. 获取、创建、删除用户信息。

      9. 获取和设备网络配置信息比如IP地址等。

      10. 获取和设置NTP时间同步。

      11. 获取和设置设备时间。

      12. 重启设备。

      8.2.5 处理流程

      1. 绑定组播IP(239.255.255.250)和端口(3702),发送固定的xml格式的数据搜索设备。

      2. 接收到的xml格式的数据解析,得到设备的Onvif地址。

      3. 对Onvif地址发送对应的数据,收到数据取出对应的节点数据。

      4. 请求Onvif地址获取Media地址和Ptz地址,Media地址用来获取详细的配置文件,Ptz地址用来云台控制。

      5. ptz控制是对Ptz地址发送对应的数据即可。

      6. 设置了用户认证的需要组织用户token信息一块发送,每次都需要作鉴权处理。

      7. 接收到的数据不是标准的xml数据,没法按照正常的节点解析来处理,只能用QXmlQuery来做。

      8. 每个厂家设备返回的数据未必完全一致,基本上都不一致,需要进行模糊查找节点值。

      9. 特意采用底层协议解析,因为soap太臃肿函数名称太另类,特意做的轻量级的。

      10. 两个必备工具,Onvif Device Manager 和 Onvif Device Test Tool。

      8.3 gb28181处理模块

      暂未实现

      9 界面风格

      9.1 样式风格

      本系统内置高达20+套皮肤样式供用户选择,可以在系统设置中随意切换立即应用。 + + + + + + +

      9.2 导航风格

      本软件分两级导航栏,一级导航是顶部标题栏中的一排按钮,二级导航是左侧导航按钮。导航的样式风格可以在系统设置的导航样式下拉框切换。上侧表示图标在上面,文字在下面,左侧表示图标在左边,文字在右边。默认是上侧+上侧,如果二级导航菜单较多,可以选择用左侧方式,这样可以排列的按钮更多。 + +

      9.3 软件风格

      本软件除了常规的监控系统工作模式外,还支持机器人监控、无人机监控、智慧校园、广播监控等,可以在系统设置中切换工作模式。 + + + +

      9.4 功能激活

      在系统设置中有个功能激活模块,可以对某些功能进行开启和禁用。 +下图是只开启了4/9/16分屏,悬浮条开启了分辨率和帧率的效果。 +

      下图是开启了所有分屏,所有悬浮条信息,音柱悬浮显示的效果。 +

      下图是开启了部分分屏,部分悬浮条信息,音柱固定10px尺寸,悬浮条透明度50的效果。 +

      10 运行效果

      10.1 windows-7

      10.2 windows-11

      10.3 linux-ubuntu

      10.4 linux-fedora

      10.5 linux-centos

      10.6 linux-uos

      10.7 linux-kylin

      10.8 linux-neokylin

      10.9 linux-newstart

      10.10 linux-debian

      10.11 unix-mac

      11 程序框架

      备注:下面的截图和说明未必是最新的,但是大部分是一致的,整体的框架不会改变,可能会有新增加子模块和代码,或者部分类文件有调整或者删除,具体以最新的代码为准。

      11.1 整体代码结构

      本系统采用模块化的设备,有用到第三方开源类库比如串口通信qextserialport,全部放在3rd下面,有用到很多自己封装完善的通用类库比如ffmpeg视频监控,全部放在core下面,设备通信和辅助处理全部放在class下面,所有界面全部放在ui下面,相当于一个个小的组件合起来,最终形成了整个监控系统的完整代码。

      11.2 主模块说明

      名称说明
      3rd一些第三方开源的类库,比如串口通信qextserialport。
      class存放系统初始化、样式控制、自定义控件、设备通信等。
      core本人一直持续更新完善的通用的类库,比如ffmpeg视频监控。
      ui所有的界面都分门别类放在这里。

      11.3 子模块说明

      11.3.1 第三方类库

      这里放的全部是第三方开源的轮子,感谢开源、感谢github、gitee等开源社区。

      名称说明
      3rd_qextserialport第三方串口通信qextserialport,这个类比较稳定可靠,经过了几十个项目持续数十年运行的考验,不用Qt自带的串口类。

      具体代码不做过多说明。

      11.3.2 通信及辅助类

      这里放的都是一些系统初始化、设备通信相关的类。

      名称说明
      api存放数据库表映射成对应的全局队列数据、通用的辅助函数类。
      app全局配置参数管理类、秘钥管理类、通用函数。
      devicecustom用户自定义设备通信管理,比如机器人通信、无人机通信等。
      devicevideo视频监控相关处理类,包括设备地图、表格消息、线程UI通信、人工智能处理等。
      usercontrol当前系统的自定义控件全部放在这里,其中包括云台仪表盘、天气面板等控件。
      11.3.2.1 模块-api
      名称说明
      dbdata将数据库表映射到全局变量数据队列,比如将摄像机表ipcinfo转成QStringList存放一行行数据,这样在程序中运算比较速度极快,直接内存比较,不用每次都去读取数据库。
      dbquery所有的数据库查询插入更新等操作都在这里,比如查询摄像机表、插入日志记录等。
      11.3.2.2 模块-app
      名称说明
      appconfig配置参数类,整个系统的配置参数存放在ini文件中,跨平台,所有参数都对应一个变量,读取配置参数的时候将值赋值给变量,写入的时候将变量值写入到配置文件。
      appdata全局变量类,系统中无可避免需要一些全局变量方便处理,都放在此类,比如版本号、录像机类型、摄像机类型、当前用户信息、地图宽度高度、左侧右侧顶部底部宽高等。
      appevent全局事件转发类,系统越复杂信号需要传递的层级越多,所以需要一个全局事件转发类,用来中转这些事件,这样永远只需要两层就可以收到信号进行处理,而且整个系统看起来干净整洁,不会说一个信号传递到了N个地方乱七八糟,建议需要跨层级传递的信号都放在这里中转。比如软件退出信号,可能多个界面需要收到退出信号进行保存和其他处理,如果从关闭界面发出信号传递给需要的界面,那不知道要中间层层传递多少次,有了这个全局事件转发类,你只需要将事件传给appevent,需要接收事件的地方关联这个信号就行,appevent为全局单例类,整个系统唯一。通用的一些信号有软件退出、全局样式改变、主窗体变化(0-最小化 1-最大化 2-恢复 3-关闭 4-移动 5-尺寸变化)等。
      appinit程序初始化类,在main函数中,会先执行这个初始化的类,比如初始化皮肤、字体、数据库、样式等操作,这些都是要优先在窗体加载前执行的,执行完毕以后再打开窗体主界面。
      appstyle全局样式管理类,整个系统的样式全部放在这里,一般加载流程是先读取样式表文件,然后将本系统独特的样式(比如开关按钮、视频监控、云台仪表盘)内容追加到后面,最后统一设置全局样式,在main函数中加载,和appinit类一样放在最前面执行。
      appurl视频监控系统中常用的默认的视频地址集合。
      11.3.2.3 模块-devicecustom
      名称说明
      devicerobot机器人串口通信管理类。
      devicerobot2机器人串口通信管理类2,有串口数据转发功能。
      deviceuavsserver无人机后端服务类,当前为空,用户自己添加。
      deviceuavsvideo无人机视频监控类,将视频控件设置过来,然后就可以将自己人工智能算法处理后的图片传过来进行绘制,类似于实时视频效果。
      11.3.2.4 模块-devicevideo
      名称说明
      devicehelper整个系统设备管理辅助类,比如插入窗口消息、加载设备列表、加载图片地图、加载设备按钮、初始化视频控件等。
      devicemap设备图片地图管理类,相当于一次性加载所有图片到内存,当要切换或者显示的时候,直接从内存取出来设置即可,速度极快,瞬间相应,纯粹是为了加快相应速度以及可能在图片上进行绘制增加的功能,比从文件系统读取图片文件显示快N倍。
      deviceonvif设备onvif通信管理类,比如获取当前选中通道的onvif地址、开启事件订阅、校对时间、重启设备、获取视频参数、设置视频参数、云台控制等,这里是具体的需要和摄像机信息表及视频通道关联的处理,所以不能放到通用的onvif模块中。
      devicethreadui演示线程通知UI更新,包括每隔一段时间插入消息、异步调用添加表格消息和图文警情、设备GPS移动、报警闪烁、指定通道编号设置视频和通道交换等。
      devicevideosmart人工智能处理类,最常见的应用就是设置一个视频控件,然后在视频控件上绘制人脸框、文字信息等,比如设备的实时运行状态。
      11.3.2.5 模块-usercontrol
      名称说明
      gaugecloud云台仪表盘控件。
      cityhelper省市县联动类,通过从json文件读取省市县信息。
      weather城市天气类,最后显示在标题栏上,实时显示设置的城市的最近几天的天气。
      widgetsound声音面板控件,主界面右下角单击弹出音量条。

      11.3.3 核心通用类库

      这里放的全部是个人一直持续更新完善的独创的轮子,所有的项目都公用这些轮子,用到哪个就包含哪个进来,更新只需要更新轮子代码就行。

      视频监控系统包含的轮子超级丰富给力,物超所值,涵盖了数据导出模块、数据库应用、音频播放和录制、视频播放和录制、ONVIF通信、TCP文件传输、地图应用、通用浏览器内核等。

      名称说明
      core_audio音频播放和录制,包括音频输入输出设备管理、音频播放、音频录制、音频振幅控件等。
      core_common通用函数,包括通用秘钥、通用导航、通用样式、声音播放、日志记录、运行时间记录等。
      core_control通用自定义控件,很多系统经常用到的控件全部放在这里,比如开关按钮、设备容器、设备按钮、颜色下拉框等。
      core_dataout数据导入导出到xls/pdf和打印类库,极速、跨平台、无依赖。
      core_db数据库通用类库比如数据库线程管理、数据清理、数据采集等。
      core_form通用的用户登录、用户退出、用户管理、数据库配置界面类等。
      core_map地图综合应用类库,百度地图(支持在线离线)和echart封装类等。
      core_onvifonvif功能封装类,包括设备搜索、云台控制、设备参数设置等。
      core_qthelper通用的辅助类,包括自定义对话框,全局辅助函数,图形字体等。
      core_tcpfile文件多线程收发类,支持多个并发。
      core_video视频播放核心类,包括了监控画面切换控件、视频回放控件、视频播放组件结构体、视频播放辅助函数、视频解码线程类、视频显示控件类等。
      core_videobase视频相关基类,包括音视频文件保存基类、视频解码基类、视频控件基类、视频悬浮工具栏、视频控件结构体等。
      core_videoffmpeg视频监控内核ffmpeg版本,本系统默认采用的内核。包括使用ffmpeg采集和保存到mp4文件的类。
      core_videohelper监控内核辅助类,包括本地视音频设备名称获取,滤镜字符串获取,地址获取辅助类等。
      core_videoopenglopengl封装类,支持打开yuv/nv12文件,绘制yuv/nv12帧数据,一般搭配ffmpeg视频内核显示视频,直接走GPU绘制。
      core_webview通用浏览器控件类,同时支持webkit、wenengine、miniblink三种内核,打通了所有的Qt版本。
      11.3.3.1 模块-core_audio
      名称说明
      audiohelper音频相关辅助函数,比如获取音频输入输出设备、根据设备名称查找设备对象、初始化音频格式、获取对应音频格式最大振幅、获取对应音频格式音频数据的振幅级别等。
      audiolevel音频振幅控件,根据传入的音频振幅大小绘制振幅,可设置颜色。
      audioplayer音频播放类,可以设置声音大小和静音状态,支持带参数打开音频输入和输出设备,自动关联音频输入输出设备形成话筒和音响联动。
      audiorecorder音频录制类,可以设置音频录制的参数,包括采样大小、比特率、通道数、质量级别、编码模式等。
      11.3.3.2 模块-core_common
      名称说明
      base64helper图片及文字和base64编码之间转换的类。
      commonkey通用秘钥管理类,指定校验秘钥文件,可设置运行时间、设备数量等限制,支持根据硬件指纹特征生成机器码文件等。
      commonnav通用菜单导航管理类,用来控制和显示顶部导航栏、左侧导航栏的样式。很多子界面需要用到,所以封装成一个专门管理这个的类。
      commonstyle通用样式管理类,比如Qt自带类窗体样式、自定义控件样式、分页导航样式、导航按钮样式、开关按钮样式等。相当于将多个项目常用的自定义样式封装一起做成通用。
      framelesswidget2无边框窗体拉伸类,边框四周八个方位都可以自由拉伸,可设置是否允许拖动和拉伸。
      playwav声音文件播放类,通用Qt456,自动识别当前Qt版本使用对应的类,Qt4采用QSound,Qt5以上采用QSoundEffect,嵌入式采用对应的命令行aplay、mpv来播放。
      savelog日志钩子类,将系统中所有的打印信息转为日志存储或者输出到网络等,可以开启用来打印输出日志信息。
      saveruntime保存运行时间类,用来存储系统启动后每隔一段时间就输出一条记录用来记录启动后软件运行了多久,方便分析问题。
      11.3.3.3 模块-core_control
      名称说明
      bottomwidget通用底部状态栏控件,可以设置软件名称、版本号、运行时间等。
      colorcombobox颜色下拉框控件,在系统设置中有。
      cpumemorylabelCPU和内存使用情况标签控件,主界面右上角显示。
      customtitlebar停靠窗体自定义标题栏控件。
      devicebutton设备按钮控件,比如图片地图模块中用到,可设置不同的图标样式和状态等,双击发出信号进行相应处理比如弹出对应窗体等。
      lcddatetime软件右上角显示时间的控件。
      panelwidget面板容器控件,主界面子模块表格消息,就用到此控件,用于将一堆widget放到此容器进行管理,自动形成滚动条等。
      switchbutton开关按钮控件,在系统设置中存在大量该控件。
      xslider滑动条控件,在原有滑动条基础上增加了鼠标按下立即定位等。
      11.3.3.4 模块-core_dataout
      名称说明
      datacreat通用数据报表内容创建类,比如生成表格格式的html内容,然后赋值给dataprint直接打印,里面举例了图文混排的报告内容,后期会不断增加其他模板,也可以自行增加其他模板数据。
      datacsv导入导出数据,csv格式,可设置分隔符。拓展名。过滤条件等。
      datahead当前组件通用头文件。
      datahelper辅助类,比如校验规则函数,通用数据导出+打印函数。
      dataprint数据打印到pdf及纸张,支持多线程。
      dataxls数据导出到xls类,支持多线程导出。
      11.3.3.5 模块-core_db
      名称说明
      dbcleanthread自动清理数据线程类。
      dbconnthread数据库通信管理线程类。
      dbdelegate自定义委托全家桶,包括复选框、下拉框、密码框、按钮等。
      dbhead当前组件通用头文件。
      dbhelper各种数据库应用函数封装,比如初始化数据库、执行sql语句等。
      dbhttpthread网络请求数据采集类。
      dbpage数据库通用翻页类。
      dbpagemodel数据库翻页类数据模型。
      navpage分页导航控件。
      11.3.3.6 模块-core_form
      名称说明
      formhelper封装的导入导出、导出数据到xls/pdf和打印数据、自动备份数据、保存最后打开的文件夹等。
      frmconfigdb通用数据库管理界面类,可选不同的数据库类型,填入用户信息,执行检测连接和初始化数据操作。
      frmconfiguser通用用户管理界面类,可添加、删除、修改用户信息,包括权限分配等,可导入导出打印用户信息。
      frmlogin通用用户登录界面类,包括自动登录和记住密码复选框,多次密码错误校验,记住当前用户信息等。三次错误关闭,下拉可选用户,内置超级密码。
      frmlogout通用用户退出界面类,三次错误关闭,下拉可选用户,内置超级密码。
      userhelper通用用户权限管理类,内置7种类型权限,对应权限名称可自定义,一般在用户切换对应界面或者单击了对应功能按钮的时候触发。
      11.3.3.7 模块-core_map
      名称说明
      echartjsechart模块中用到的json文件转js文件,获取js文件中的名字和经纬度等处理。
      echartsechart封装类,可加载仪表盘、闪烁点图、迁徙图、世界地图、区域地图等,每个点可自定义颜色和提示信息等。
      mapbaidu百度地图封装类,支持在线和离线两种模式。
      11.3.3.8 模块-core_onvif
      名称说明
      onvifbase基础类,用于获取设备信息、服务文件地址、能力文件地址、媒体文件地址、视频流地址等。
      onvifdevice设备类,核心处理及管理,包括设置用户信息请求onvif地址、获取设备信息、云台控制、事件订阅、抓拍图片等。
      onvifevent事件订阅具体实现类,可设置请求超时时间等。
      onvifhead当前组件通用头文件。
      onvifhelper辅助类,比如获取UUID用于请求、判断IP合法、获取本机IP地址集合、管理系统中所有onvif设备对象等。
      onvifmedia获取媒体文件具体解析类。
      onvifother其他处理类,比如系统重启、NTP校时、获取和设置网络信息、获取和设备时间、获取和设置图片参数等。
      onvifptz云台控制实现类,包括绝对移动、相对移动等。
      onvifquery数据查询类,用于将接收到的xml数据解析,并赋值字符串比如命名空间、设备地址、媒体地址、事件地址等。
      onvifrequest网络请求类,包括设置用户信息、获取用户token数据、获取xml头部数据等,通用的请求数据返回结果函数。
      onvifsearch设备搜索类,支持广播搜索、指定地址搜索,可获取设备信息集合、获取设备地址集合。
      onvifservices服务类,用于获取媒体地址、云台地址等。
      onvifsnap图片抓拍实现类,包括获取抓图地址、抓拍图片等。
      11.3.3.9 模块-core_qthelper

      本组件涵盖的功能较多,所以采用了分层管理代码结构。

      名称说明
      iconhelper万能图形字体类,可传入多种图形字体文件,一个类通用所有图形字体。
      globalconfig存储当前组件的配置参数信息,比如全局的字体名称、字号、无边框窗体的最小化最大化关闭等图标、样式表的颜色值。
      globalhead当前组件通用头文件。
      globalstyle当前组件通用样式设置管理类,可以指定枚举类型样式、传入样式内容设置、获取样式表文件对应的颜色值等。当前组件样式相关的处理函数都放在这里,统一管理。
      名称说明
      qtabout关于系统对话框,可传入软件标题、版本、版权、网址等信息。
      qtdateselect自定义日期范围选择对话框。
      qtinputbox自定义输入框窗体,可指定不同的输入类型比如文本框、下拉框等。
      qtmessagebox自定义信息消息框窗体,可设置关闭倒计时,不同的类型比如信息框、询问框、错误框等。
      qtsplash自定义弹出提示信息,提示完自动消息关闭。
      qttipbox自定义右下角信息对话框,可设置对齐方式、关闭倒计时等。
      qtform自定义无边框窗体,可设置标题,各种图标等。
      名称说明
      qthelper项目通用辅助类,各种常用函数的封装,比如获取当前屏幕分辨率、设置字体、设置编码、加载翻译文件、各种进制数据转换、弹出各种对话框、设置延时时间等。
      qthelpercore获取当前桌面分辨率,设置编码、字体、翻译文件等。
      qthelperdata16进制、2进制、10进制互相转换,16进制字符串、字节数组互相转换,字节数组转int和short,CRC校验等。
      qthelperfile选择文件、保存文件、选择目录等对话框,复制文件、删除文件等。
      qthelperform设置无边框窗体、边框阴影,弹出信息框、错误框、询问框、日期选择框、关于对话框、中间提示框等。
      qthelperimage获取等比例缩放图片,通用设置logo图片,支持资源文件、本地图片、图形字体、svg自动变色等多种形式。
      qthelpernet获取本机IP地址集合,获取外网IP地址,判断IP、MAC等是否合法,下载网络文件,IP地址字符串与整型互相转换。
      qthelperother初始化数据库文件,设置系统时间、开机启动,设置图标到按钮,写入临时消息的文本文件等。
      11.3.3.10 模块-core_tcpfile
      名称说明
      tcpfilehead当前组件通用头文件。
      tcpfilehelper辅助类,包括将字节转为MB单位、初始化表格控件、生成表格行、数据加密解密、解压文件、重启系统等。
      tcpreceivefileserver接收文件服务类,管理多个接收文件线程,支持监听端口被动接收文件和主动连接服务器接收文件。
      tcpreceivefilethread接收文件线程类,根据发送的文件名、包编号、块大小、挨个接收数据最终形成文件,可设置保存文件夹等。
      tcpsearchfileserver搜索文件服务类,目前没用,用于接收请求搜索文件是否存在。
      tcpsendfilethread发送文件线程类,按照 文件开始符+文件大小+文件内容+文件结束符 逐个分包发送,可对文件的每个包进行加密传输。
      11.3.3.11 模块-core_video

      视频组件继承和依赖关系说明:

      1. videobase是基类组件,video是视频播放组件,依赖基类组件,videoffmpeg是具体的内核实现组件,依赖视频播放组件。

      2. video组件中的videothread解码线程类继承自videobase基类组件中的abstractvideothread。

      3. video组件中的videowidgetx视频显示类继承自videobase基类组件中的abstractvideowidget。

      4. videoffmpeg组件中的ffmpegthread继承自video组件中的videothread。

      5. videoffmpeg组件中的ffmpegsave继承自videobase组件中的abstractsavethread。

      6. 按照此规则还有其他内核比如vlc组件中的vlcthread也是继承自videothread,mpv组件中的mpvthread也是继承自videothread。这样新增一种内核只要具体实现部分处理函数即可应用整个视频框架。

      7. 通过多层基类继承关系,使得动态挂载任意解码内核极为方便。

      8. 为何在video视频组件的基础上还要提炼一个videobase基类组件?因为该基类组件还可以提供给camera本地摄像头采集组件使用,基类中的变量、函数、处理逻辑几乎一致,但是又有特殊性,所以需要分开再提炼出videobase基类。

      名称说明
      videobox监控画面切换控件,将所有通道切换处理全部集中到一个类,通用异形布局切换函数,可以参考进行自定义异形布局,通道布局切换发出信号通知,支持自定义子菜单布局内容。
      videohelper视频相关辅助函数,比如根据url地址取出ip地址、校验网络地址是否可达、检查地址是否正常、根据地址获取本地摄像头参数、获取本地桌面采集参数、创建视频采集类、对采集线程设置参数等。
      videomanage视频线程管理类,全局单例,将所有视频控件发给此类管理,负责挨个打开视频、应用录像计划等。
      videoplayback视频回放控件,支持多个通道,显示每个通道对应的视频段。
      videostruct视频播放组件结构体定义类,包括解析内核枚举值、视频类型枚举值、解码策略枚举值、视频采集参数结构体。
      videotask视频任务线程类,全局单例,可以随时插入一些视频相关的任务进行处理,比如vlc录制视频后需要重命名文件,mpv内核关闭视频后鼠标指针打圈圈需要复位。
      videothread视频解码线程类,内置了共享解码线程处理逻辑,可以打开视频、关闭视频、设置视频宽高比例、获取文件总时长、获取媒体信息、获取和设置播放位置、获取和设置播放速度、获取和设置音量大小、获取和设置静音状态等。
      videoutil视频相关辅助函数,加载视频内核、视频地址、视频模式、解码策略、编码策略、硬件加速、通信协议、缓存时间、读取超时等。
      videowidgetx视频播放控件,一个控件对应一个解码线程,提供播放成功、播放结束、收到截图、工具栏按钮单击等处理,提供开始播放、停止播放、暂停播放、继续播放、抓拍截图、开始录制、暂停录制、停止录制等接口。
      11.3.3.12 模块-core_videobase
      名称说明
      abstractsavethread音视频存储基类,可以设置需要保存的音视频文件类型,比如音频文件类型有pcm、wav、aac,视频文件类型有yuv、h264、mp4,提供开始保存、暂停保存、停止保存等接口。
      abstractvideosurface视频回调基类,用于Qt中的QCamera和QMedia类播放后拿到回调视频数据,这样可以取到一张张图片。
      abstractvideothread视频解码线程基类,摄像头采集线程和视频采集线程都继承自此类,将各种公用的变量、函数、接口、信号槽全部放在基类,包括了停止线程标志位、打开是否成功标志位、暂停采集标志位、开始截图标志位、正在录制标志位,提供了虚函数开始播放、停止播放、暂停播放、继续播放、抓拍截图、截图完成、开始录制、暂停录制、停止录制等,提供写入视频数据到文件、写入音频数据到文件槽函数。
      abstractvideowidget视频显示控件基类,
      bannerwidget悬浮工具栏控件,可以设置各种颜色、按钮图标集合、按钮名称集合、按钮提示信息集合等,悬浮条位置支持上下左右四个方位。
      widgethelper窗体相关辅助函数,包括传入图片尺寸和窗体区域及边框大小返回居中区域(scaleMode: 0-自动调整 1-等比缩放 2-拉伸填充)、绘制矩形区域比如人脸框、绘制点集合多边形路径比如三角形、绘制路径集合、显示截图预览等。
      11.3.3.13 模块-core_videoffmpeg
      名称说明
      ffmpegfilter滤镜相关静态函数,传入滤镜结构体数据获取滤镜字符串,初始化滤镜、释放滤镜数据。在ffmpegthread中调用。
      ffmpeghelper相关辅助函数,包括初始化各种参数、格式枚举值转字符串、初始化音频转换上下文、初始化和获取音频通道相关、获取和设置旋转角度、获取解码器枚举值和名称、获取码率格式媒体类型、获取分辨率采样率流信息、拷贝上下文参数、释放数据帧数据包等。其中为了兼容ffmpeg2-ffmpeg6以及后续所有版本,在这里全部做了不同版本对应不同函数调用的区分。
      ffmpegsave视频存储类,用于保存h264和mp4文件,同时也可用于推流。
      ffmpegsavehelper视频存储辅助类,包括校验是否需要启用编码、获取保存的格式、根据分辨率获取码率、根据缩放字符串获取最终宽高、初始化视频编码器、初始化视频编码器上下文、初始化视频转换相关、初始化音频编码器上下文、初始化音频转换相关、封装格式(写入sps/pps信息)、通用软编码(支持音频视频)、转换时间基准等。
      ffmpegsync音视频同步线程类,解码后的音视频数据发给本类进行时间同步处理,采用的外部时钟同步策略。音视频播放的进度也在本类中。
      ffmpegthread视频解码线程核心,从打开地址、分配解码器、初始化参数、取出音视频数据解码、关闭并释放资源等都在本类实现。
      ffmpegthreadhelper视频解码辅助类,包括根据解码策略获取解码参数、校验硬解码、读取封面、初始化视频解码器、初始化硬解相关、初始化解码视频相关数据、初始化解码音频相关数据、计算实时码率、通用硬解码(音频没有硬解码)、通用软解码(支持音频视频)、打开超时和读取超时回调等。
      ffmpegutil其他辅助函数,比如打印输出编码解码信息、打印编码器的相关参数、打印设备列表和参数、获取输入输出设备名称集合、视频帧旋转、获取指定文件时长、解析sps/pps数据等。
      11.3.3.14 模块-core_videohelper
      名称说明
      audioplayer音频播放类,空的,纯粹为了在没有Qt音频播放类QAudioOutput的时候使用,有些Qt版本或者嵌入式板子环境未必有这个类,但是又不能影响整个组件的运行,于是定义了空的类,函数正常调用但是不做任何处理。
      deviceinfohelper获取本地视音频输入设备名称,通用函数取出本地设备带分辨率和帧率等信息,根据屏幕区域校验参数,获取本地屏幕信息和当前屏幕区域。
      filterhelper滤镜相关辅助类,传入旋转角度获取旋转滤镜字符串、根据标签信息获取对应滤镜字符串、根据图形信息获取对应滤镜字符串、转换滤镜字符串到ffmpeg格式、传入标签队列和图形队列获取滤镜字符串。此类主要给ffmpeg内核、qtav内核、mdk内核使用。
      imagelabel图片标签控件,多线程绘制传入的图片,性能比setpixmap更优。
      urlhelper通用地址辅助类,设备厂家类型结构体、地址参数结构体,各个厂家的实时及回放视频流字符串函数,根据url播放地址获取地址对应的各种信息比如IP地址和端口等。
      urlutil视频地址相关静态函数,可以读取和写入地址到文本文件,用作历史记录,内置了各种类型(rtsp、http、音频文件、视频文件、网络文件、本地摄像头)的测试音视频地址集合。
      11.3.3.15 模块-core_videoopengl
      名称说明
      openglinclude当前组件头文件。
      nv12glwidget空类,用于没有opengl的Qt版本中保证程序能够继续运行。
      nv12openglwidget继承自QOpenGLWidget的NV12格式OPENGL绘制窗体。
      yuvglwidget空类,用于没有opengl的Qt版本中保证程序能够继续运行。
      yuvopenglwidget继承自QOpenGLWidget的YUV格式OPENGL绘制窗体。
      11.3.3.16 模块-core_webview
      名称说明
      webcore.pri通用的根据不同的Qt版本、不同的编译器环境、不同的操作系统,加载对应的浏览器内核模块和定义不同的变量。
      miniblinkminiblink封装处理类。
      webhelper经纬度转换、获取小数点经纬度值等常用处理函数。
      webjsdata通用的浏览器控件和Qt程序交互数据中转类。
      webview通用浏览器控件,支持webkit、webengine、miniblink。

      11.3.4 界面UI

      界面说明

      1. 这里分门别类存放的各种功能集合的界面类。

      2. 每个类都一个ui文件、一个h头文件、一个cpp实现文件。

      3. 可以方便快速查找对应功能的界面,也方便拓展增加界面。

      4. 不仅分文件夹存放的,而且命名也尽量按照对应功能打头,比如系统设置模块中的都用frmconfig打头。

      5. 外层文件夹是整齐的,内部代码也是整齐的。

      名称说明
      frmconfig系统设置模块,包括基本设置、录像机管理、摄像机管理、轮询管理、用户管理、视频上传等。
      frmdata日志查询模块,包括本地日志、设备日志等。
      frmdemo演示demo示例,用于演示具体控件或者功能的使用,方便学习参考,比如视频图片、视频控件、视频存储都单独的使用demo。
      frmipc存放摄像机处理相关的模块,比如设备控制,云台控制、预置位、巡航设置等。之前放在frmmodule模块中,后面独立出来管理更方便。
      frmmain主界面模块,包括登录登出界面、主界面、右上角时间组件、欢迎组件等。
      frmmap地图模块,包括通用地图内核界面、图片地图、在线地图、离线地图、路径规划等。
      frmmodule停靠子窗体模块,包括停靠窗体管理核心类、设备列表、窗口信息、图文警情、设备轨迹、网页浏览等模块。将摄像机、机器人、无人机相关的模块放到了对应的模块文件夹,这里放的是系统通用的模块。
      frmrobot无人机模块,包括图像增强、飞行监控等模块。
      frmuavs无人机模块,包括图像增强、飞行监控等模块。
      frmvideo视频监控模块,所有视频监控相关的都放在这里,包括主界面的视频监控布局窗体、视频回放、远程回放、图片回放等。
      11.3.4.1 模块-frmconfig
      名称说明
      frmconfig系统设置模块主界面,采用堆栈窗体形式,加载多个子界面比如摄像机管理、轮询管理等。
      frmconfigipc摄像机管理,可以增加、删除、修改、清空、导入、导出、打印摄像机信息。
      frmconfigipcsearchonvif设备搜索,独立出来的窗体,可以搜索局域网内的所有onvif摄像机信息,搜索完以后获取摄像机的视频流地址等,最后可以单个添加或者批量选中添加到摄像机信息表格中。
      frmconfignvr录像机管理,可以增加、删除、修改、清空、导入、导出、打印录像机信息。
      frmconfigpoll轮询管理,可以增加、删除、修改、清空、导入、导出、打印轮询点信息。可以按照设定规则批量生成轮询点信息。
      frmconfigpollplus将轮询管理中的轮询参数配置、分组管理、批量添加等独立出来的界面,方便管理和拓展。
      frmconfigsave录像计划,可以对每个通道每周每天每半小时时间段设置是否存储录像。
      frmconfigsystem系统设置,包括基本设置、视频参数、数据库设置、地图配置、功能激活、颜色配置、串口配置、网络配置等。
      11.3.4.2 模块-frmdata
      名称说明
      frmdata日志查询模块主界面,采用堆栈窗体形式,加载多个子界面包括本地日志、设备日志等。
      frmdatadevice设备日志,通过私有协议从NVR取对应设备日志信息。
      frmdatauser本地地址,用户操作的日志信息,可查询和导出打印数据记录。
      11.3.4.3 模块-frmdemo
      名称说明
      frmdemo单独的功能演示示例主窗体,加载多个子界面比如视频控件等。
      frmdemohelper通用辅助示例,主要演示qthelper通用组件中封装的函数如何使用,比如各种消息框、提示框等。
      frmdemovideochange通道交换示例,演示两个视频通道如何无缝切换。
      frmdemovideodrag拖曳播放示例,演示从文件夹拖曳文件到视频控件播放。
      frmdemovideodraw标签绘制示例,演示各种OSD标签示例和各种图形绘制示例。
      frmdemovideoimage视频图片示例,从图片文件夹读取图片集合,定时器绘制取出图片发给视频控件绘制。
      frmdemovideoosd动态标签示例,演示动态更新和插入OSD标签。
      frmdemovideoplay4同步播放示例,演示4个通道切换进度条同步播放进度。
      frmdemovideoplus视频叠加示例,多个视频控件叠加在一起同时播放,可以设置在四个角落位置。
      frmdemovideosave视频保存示例,演示如何对视频控件进行视频保存,可动态保存。
      frmdemovideovolume音频振幅示例,演示实时显示当前播放的音量大小音频振幅,柱状条显示。
      frmdemovideowidget视频控件示例,演示视频控件如何使用。
      11.3.4.4 模块-frmipc
      名称说明
      frmipccontrol设备控制模块,可对选中设备进行图片参数调节、NTP校时、设备重启、抓拍图片(ONVIF抓图)等。
      frmipcnavigate巡航管理模块,暂未实现,后期完善。
      frmipcreset预置位管理模块,暂未实现,后期完善。
      frmipcptz云台控制模块,可对选中的摄像机进行云台控制。
      11.3.4.5 模块-frmmain
      名称说明
      frmmain系统主界面,采用堆栈窗体,加载各个子模块。
      frmmain1备用模块1界面,根据参数设置决定是否启用。
      frmtimecpu右上角日期时间+CPU内存显示。
      frmwelcome右上角欢迎信息界面。
      11.3.4.6 模块-frmmap
      名称说明
      frmmap地图管理主界面,采用堆栈窗体形式,加载各个子界面比如图片地图、在线地图、离线地图、路径规划等。
      frmmapcore通用百度地图内核界面,用来加载百度地图,可设置在线、离线模式,有很多个窗体用到类似功能特意封装到一个类,重复利用,比如悬浮地图、飞行轨迹、路径规划等模块都用到了此内核。
      frmmapdevice通用的设备地图界面,在线地图和离线地图界面公用这个界面,唯一区别就是设置下地图的模式是在线还是离线。
      frmmapimage图片地图界面,设备作为一个个按钮点显示在对应地图上,可以拖动,双击弹出预览实时视频。
      frmmaplocal离线地图界面,可更新经纬度值、模拟运动轨迹等。
      frmmapweb在线地图界面,可更新经纬度值、模拟运动轨迹等。
      frmmaproute路径规划界面,可查询路线得到路线的经纬度坐标集合。
      11.3.4.7 模块-frmmodule
      名称说明
      frmdevicegps设备轨迹模块,对设定的设备随机模拟轨迹,也可传入经纬度坐标值自动移动并绘制轨迹线条,不同设备可以不同颜色。
      frmdevicetree设备列表模块,读取设备信息加载形成树状列表,双击或者拖动到视频监控窗体直接播放视频,提供右键菜单作为演示如何使用。
      frmmodule主界面中心部分窗体,采用QMainWindow类,中间加载的视频监控面板,其余new出来每个子模块,子模块可停靠和悬浮拖动等。不同工作模式下的各种子模块都在此加载。同时负责管理模块的显示隐藏菜单。
      frmmsglist图文警情模块,也叫消息列表模块,带有右键菜单添加、删除、清空列表中的消息,双击可以弹出大图预览。
      frmmsglistitem图文警情模块子类,都是由一个个item组成放到panelwidget面板控件中,自动形成滚动条。
      frmmsgtable窗口消息模块,也叫表格消息模块,表格形式显示打印信息,不同的内容可以不同颜色区分。
      frmwebview网页浏览模块,传入一个url地址打开对应的网页,比如打开一个3D的网页。
      11.3.4.8 模块-frmrobot
      名称说明
      frmrobotdata仿真数据模块,启动机器人通信服务,接收数据解析显示。
      frmrobotdebug数据调试模块,可模拟发送轨迹数据测试解析类。
      frmrobotdebug2新数据调试模块,打印多个串口数据,不同颜色显示。
      frmrobotemulate运动仿真模块,预留给用户实现,一般放个3D效果。
      frmrobotlog机器人实时数据模块,预留给用户实现。
      11.3.4.9 模块-frmvideo
      名称说明
      frmvideo视频回放模块主界面,堆栈窗体形式,加载多个子界面比如本地回放、远程回放、设备播放等。
      frmvideopanel视频监控面板,主界面中间部分,这是核心,管理多个通道,通道可移除删除,拖曳打开,拖曳交换等。
      frmvideopaneltool视频监控底部工具栏,独立出来一个类专门管理。
      frmvideoplayimage图片回放模块,按照规则查询图片目录,然后可设定播放速度进行图片序列播放。
      frmvideoplaylocal本地回放模块,查询对应通道的本地存储的视频文件,双击播放,可暂停和拖动进度条位置。
      frmvideoplaynvr设备播放模块,通过RTSP视频流的形式从远程设备取视频进行播放,支持摄像机和录像机,手动填入地址也行。
      frmvideoplayweb远程回放模块,需要用厂家sdk去实现,从NVR回放录像。
      frmvideopreview视频预览窗体,比如图片或者地图上双击设备弹出的视频预览,可以多个,关闭的时候自动释放资源。
      frmvideoupload视频上传,将本地存储的视频文件上传到服务器。

      12 二次开发

      12.1 通用开发环境搭建

      1. 第一步:安装系统,推荐用vmware虚拟机。

      2. 第二步:安装qt环境,可以直接用官方下载的run安装包安装,有些要求用命令行安装。

      3. 第三步:写个空白窗体程序测试下是否环境正常。

      4. 第四步:拷贝ffmpeg库文件,也可自行编译ffmpeg,生成对应的动态库或者静态库。

      5. 第五步:打开video_system.pro项目进行编译。

      6. 第六步:打包发布,为了发布方便,推荐用静态编译的Qt+静态编译的ffmpeg,这样打包发布很清爽,就一个可执行文件。

      12.2 不同系统注意事项

      12.3 监控系统组件示例

      本系统功能比较多,封装了多个控件,尤其是核心的视频监控控件,所以特意安排了独立的使用示例演示如何使用,可以在main函数找到 AppConfig::IndexStart = 0; 改成AppConfig::IndexStart = 1;即可,这样编译运行的是监控系统组件示例。

      12.3.1 通用辅助

      演示通用组件比如qthelper封装的类的使用。

      1. 弹出信息框

      2. 弹出错误框

      3. 弹出询问框

      4. 带自动关闭倒计时

      5. 弹出右下角信息框

      6. 隐藏右下角信息框

      7. 弹出时间选择框

      8. 弹出中间提示信息

      9. 弹出关于对话框

      12.3.2 视频图片

      演示加载图片文件夹,进行图片序列的播放。

      12.3.3 视频控件

      演示通用视频控件如何使用,包括打开、关闭、暂停、继续、截图、自动抓拍等功能。

      12.3.4 视频存储

      演示视频控件如何存储视频文件到本地,单击开始按钮开始存储视频,单击关闭则关闭存储。

      12.3.5 视频叠加

      演示如何用多个视频控件做视频叠加播放,可以设置叠加的位置在四个角落。

      12.3.6 同步播放

      演示如何同步播放多个视频,切换进度条自动全部切换播放进度。

      12.3.7 音频频谱

      演示如何关联视频声音左右通道频谱信号,界面中音量控件实时显示当前的左右通道音量值。

      12.3.8 拖曳播放

      演示关联拖曳文件信号,识别本地文件拖曳到视频控件中播放。

      12.3.9 视频切换

      演示如何无缝切换打开不同视频,避免关闭后打开中间产生的空白缝隙。

      12.3.10 标签图形

      演示如何添加各种osd标签信息和各种图形信息,osd标签信息可以设置字体、颜色、位置等,图形信息可以是矩形、三角形、多边形、圆形等。都支持批量多个添加。

      12.3.11 文字水印

      演示视频控件文字水印功能,可以添加日期时间水印、自定义文字水印、实时码率帧率水印,提供按钮主动更新自定义文字水印。

      12.4 人工智能集成

      13 其他说明

      13.1 海康onvif设置

      新版的海康的摄像机,默认onvif是关闭的,需要手动开启,开启以后记得添加onvif用户,并重启摄像机应用。提示:海康旗下的萤石目前暂时不支持onvif协议。这里添加的用户,如果选择视频用户类型,则只能观看视频不能云台控制,只有管理员权限才能云台控制。

      13.2 大华onvif设置

      大华摄像机,先要在安全管理中开启onvif服务,然后在用户管理中添加onvif用户,添加好以后建议重启摄像机应用。

      13.3 国际onvif工具

      工具的名字叫ONVIF Device Manager(还有个工具叫ONVIF Device Test Tool,专用于程序员测试各种数据交互),可以自行搜索下载,此工具位国际官方工具,如果此工具搜索不到摄像机,则说明该摄像机不是真正的onvif摄像机,不是标准的摄像机,目前市面上的绝大部分网络摄像机都支持onvif。具体用法可以参考 https://www.cnblogs.com/lsdb/p/9157302.html

      现在大部分厂家的NVR也逐渐支持onvif,并将每个通道都可以单独列出来。

      切换到ptz页面可以进行云台控制和预置位管理。

      切换到event页面可以查看各种订阅的事件,比如入侵报警、开关量报警等。

      13.4 报警输入设置

      diff --git a/docs/video_system/snap/2-19-1.jpg b/docs/video_system/snap/2-19-1.jpg new file mode 100644 index 0000000..1f74937 Binary files /dev/null and b/docs/video_system/snap/2-19-1.jpg differ diff --git a/docs/video_system/snap/2-20-1.jpg b/docs/video_system/snap/2-20-1.jpg new file mode 100644 index 0000000..39fd7ed Binary files /dev/null and b/docs/video_system/snap/2-20-1.jpg differ diff --git a/docs/video_system/snap/2-21-1.jpg b/docs/video_system/snap/2-21-1.jpg new file mode 100644 index 0000000..6d7c312 Binary files /dev/null and b/docs/video_system/snap/2-21-1.jpg differ diff --git a/docs/video_system/snap/4-1-1.jpg b/docs/video_system/snap/4-1-1.jpg index d0eb716..6f2efac 100644 Binary files a/docs/video_system/snap/4-1-1.jpg and b/docs/video_system/snap/4-1-1.jpg differ diff --git a/docs/video_system/snap/4-2-1.jpg b/docs/video_system/snap/4-2-1.jpg index 35018da..3aa0f91 100644 Binary files a/docs/video_system/snap/4-2-1.jpg and b/docs/video_system/snap/4-2-1.jpg differ diff --git a/docs/video_system/snap/4-3-1.jpg b/docs/video_system/snap/4-3-1.jpg index d13a94c..fe12b9e 100644 Binary files a/docs/video_system/snap/4-3-1.jpg and b/docs/video_system/snap/4-3-1.jpg differ diff --git a/docs/video_system/snap/4-4-1.jpg b/docs/video_system/snap/4-4-1.jpg index 6adea14..7f89c33 100644 Binary files a/docs/video_system/snap/4-4-1.jpg and b/docs/video_system/snap/4-4-1.jpg differ diff --git a/docs/video_system/snap/4-5-1.jpg b/docs/video_system/snap/4-5-1.jpg index 73893fd..2c88fbd 100644 Binary files a/docs/video_system/snap/4-5-1.jpg and b/docs/video_system/snap/4-5-1.jpg differ diff --git a/docs/video_system/snap/5-1-1.jpg b/docs/video_system/snap/5-1-1.jpg index 1ca53fd..e4453ee 100644 Binary files a/docs/video_system/snap/5-1-1.jpg and b/docs/video_system/snap/5-1-1.jpg differ diff --git a/docs/video_system/snap/5-1-5.jpg b/docs/video_system/snap/5-1-5.jpg index 4ee1f10..7bf7edc 100644 Binary files a/docs/video_system/snap/5-1-5.jpg and b/docs/video_system/snap/5-1-5.jpg differ diff --git a/docs/video_system/snap/5-1-7.jpg b/docs/video_system/snap/5-1-7.jpg new file mode 100644 index 0000000..00cf803 Binary files /dev/null and b/docs/video_system/snap/5-1-7.jpg differ diff --git a/docs/video_system/snap/5-1-8.jpg b/docs/video_system/snap/5-1-8.jpg new file mode 100644 index 0000000..4b62c38 Binary files /dev/null and b/docs/video_system/snap/5-1-8.jpg differ diff --git a/docs/video_system/snap/5-2-1.jpg b/docs/video_system/snap/5-2-1.jpg index 63315fc..ffb83a5 100644 Binary files a/docs/video_system/snap/5-2-1.jpg and b/docs/video_system/snap/5-2-1.jpg differ diff --git a/docs/video_system/snap/9-0-1.jpg b/docs/video_system/snap/9-0-1.jpg deleted file mode 100644 index 906ca6e..0000000 Binary files a/docs/video_system/snap/9-0-1.jpg and /dev/null differ diff --git a/docs/video_system/snap/9-0-2.jpg b/docs/video_system/snap/9-0-2.jpg deleted file mode 100644 index a792ee0..0000000 Binary files a/docs/video_system/snap/9-0-2.jpg and /dev/null differ diff --git a/docs/video_system/snap/9-0-3.jpg b/docs/video_system/snap/9-0-3.jpg deleted file mode 100644 index 360c1df..0000000 Binary files a/docs/video_system/snap/9-0-3.jpg and /dev/null differ diff --git a/docs/video_system/snap/9-0-4.jpg b/docs/video_system/snap/9-0-4.jpg deleted file mode 100644 index 54cd450..0000000 Binary files a/docs/video_system/snap/9-0-4.jpg and /dev/null differ diff --git a/docs/video_system/snap/9-0-5.jpg b/docs/video_system/snap/9-0-5.jpg deleted file mode 100644 index 8da5391..0000000 Binary files a/docs/video_system/snap/9-0-5.jpg and /dev/null differ diff --git a/docs/video_system/snap/9-0-6.jpg b/docs/video_system/snap/9-0-6.jpg deleted file mode 100644 index b65d5ee..0000000 Binary files a/docs/video_system/snap/9-0-6.jpg and /dev/null differ diff --git a/docs/video_system/snap/9-0-7.jpg b/docs/video_system/snap/9-0-7.jpg deleted file mode 100644 index 79637b2..0000000 Binary files a/docs/video_system/snap/9-0-7.jpg and /dev/null differ diff --git a/docs/video_system/snap/9-1-1.jpg b/docs/video_system/snap/9-1-1.jpg new file mode 100644 index 0000000..ff517e3 Binary files /dev/null and b/docs/video_system/snap/9-1-1.jpg differ diff --git a/docs/video_system/snap/9-1-2.jpg b/docs/video_system/snap/9-1-2.jpg new file mode 100644 index 0000000..ba5fc2c Binary files /dev/null and b/docs/video_system/snap/9-1-2.jpg differ diff --git a/docs/video_system/snap/9-1-3.jpg b/docs/video_system/snap/9-1-3.jpg new file mode 100644 index 0000000..188a2c8 Binary files /dev/null and b/docs/video_system/snap/9-1-3.jpg differ diff --git a/docs/video_system/snap/9-1-4.jpg b/docs/video_system/snap/9-1-4.jpg new file mode 100644 index 0000000..d48ce22 Binary files /dev/null and b/docs/video_system/snap/9-1-4.jpg differ diff --git a/docs/video_system/snap/9-1-5.jpg b/docs/video_system/snap/9-1-5.jpg new file mode 100644 index 0000000..9c624ca Binary files /dev/null and b/docs/video_system/snap/9-1-5.jpg differ diff --git a/docs/video_system/snap/9-1-6.jpg b/docs/video_system/snap/9-1-6.jpg new file mode 100644 index 0000000..499ebc5 Binary files /dev/null and b/docs/video_system/snap/9-1-6.jpg differ diff --git a/docs/video_system/snap/9-1-7.jpg b/docs/video_system/snap/9-1-7.jpg new file mode 100644 index 0000000..2a24068 Binary files /dev/null and b/docs/video_system/snap/9-1-7.jpg differ diff --git a/docs/video_system/snap/9-2-1.jpg b/docs/video_system/snap/9-2-1.jpg new file mode 100644 index 0000000..9457520 Binary files /dev/null and b/docs/video_system/snap/9-2-1.jpg differ diff --git a/docs/video_system/snap/9-2-2.jpg b/docs/video_system/snap/9-2-2.jpg new file mode 100644 index 0000000..2d1b680 Binary files /dev/null and b/docs/video_system/snap/9-2-2.jpg differ diff --git a/docs/video_system/snap/9-3-1.jpg b/docs/video_system/snap/9-3-1.jpg new file mode 100644 index 0000000..1f3b5d2 Binary files /dev/null and b/docs/video_system/snap/9-3-1.jpg differ diff --git a/docs/video_system/snap/9-3-2.jpg b/docs/video_system/snap/9-3-2.jpg new file mode 100644 index 0000000..a689b3b Binary files /dev/null and b/docs/video_system/snap/9-3-2.jpg differ diff --git a/docs/video_system/snap/9-3-3.jpg b/docs/video_system/snap/9-3-3.jpg new file mode 100644 index 0000000..b47506a Binary files /dev/null and b/docs/video_system/snap/9-3-3.jpg differ diff --git a/docs/video_system/snap/9-3-4.jpg b/docs/video_system/snap/9-3-4.jpg new file mode 100644 index 0000000..33b0dba Binary files /dev/null and b/docs/video_system/snap/9-3-4.jpg differ diff --git a/docs/video_system/snap/9-4-1.jpg b/docs/video_system/snap/9-4-1.jpg new file mode 100644 index 0000000..0128996 Binary files /dev/null and b/docs/video_system/snap/9-4-1.jpg differ diff --git a/docs/video_system/snap/9-4-2.jpg b/docs/video_system/snap/9-4-2.jpg new file mode 100644 index 0000000..b3745c9 Binary files /dev/null and b/docs/video_system/snap/9-4-2.jpg differ diff --git a/docs/video_system/snap/9-4-3.jpg b/docs/video_system/snap/9-4-3.jpg new file mode 100644 index 0000000..64ee913 Binary files /dev/null and b/docs/video_system/snap/9-4-3.jpg differ