diff --git a/docs/video_system/index.html b/docs/video_system/index.html index ec7b332..58c4d68 100644 --- a/docs/video_system/index.html +++ b/docs/video_system/index.html @@ -3,7 +3,7 @@
-本视频监控系统做的是通用的系统,主要偏重整体框架和UI交互等。
主要功能包括摄像机管理,实时视频显示,视频轮询、视频存储、设备地图显示,各种画面切换,各种悬停子模块、onvif搜索设备和云台控制及预置位,通用的NVR视频流播放(比如海康的NVR支持直接取流回放),录像计划、用户管理等功能。
如果是依赖SDK去实现的功能(雨刷、去雾等)都没有做,那个破坏了兼容性,无法通用其他摄像机设备以及其他操作系统。
每个厂家SDK和定制的功能都不一样,如果有这方面的需要都是买过去自己加上SDK的功能和自己定制需要的功能。
整个项目源代码行数大概30W行(项目代码本身除去第三方库以后约7W行,就是自己写的部分),其中代码13.5W行(占比45%),注释12.7W行(占比42%),空行3.5W行。分层设计注释详细。
本程序会一直持续迭代更新,包括项目源码、整体框架、使用说明等,一次购买终生售后。
程序本身是个客户端(直接从摄像机或者NVR等设备取rtsp视频流)并不是服务器程序。
摄像机管理没有限制摄像机的数量,理论上10000路肯定没有问题,就是个数据库记录。
实时显示具体能支持多少路,和具体的电脑配置有关(亲测1.8G主频8G内存I5子码流64路,总之比海康大华客户端要更优秀)。
程序实时显示界面最大可以到64路,每个通道都是打开的时候才会去建立连接取视频流,而不是一开始就建立了连接。
系统采用onvif协议+rtsp视频流机制,并不限定支持哪家的摄像机,只要符合这两种协议的都支持,市面上99%的网络摄像机都支持这两种基础协议,包括但不限于海康、大华、宇视、天地伟业、华为等各种安防厂家的摄像机。
本系统没有内置人脸识别等任何相关算法,提供的是相关的接口,比如自己的算法识别到人脸区域后,将区域坐标传入视频控件自动绘制。
系统采用纯QtWidget(非qml)编写,解码采用ffmpeg,搜索采用onvif协议,视频播放采用rtsp协议,所有源码开放,没有封装的库。
同时集成了数据库、多线程、串口通信、网络通信、音视频解码/同步/存储、网页地图、界面美化、UI布局等众多知识点。
未经本人许可不可将本项目源码扩散,如有发现本人将追究法律责任,谢谢配合。
产品主页:https://blog.csdn.net/feiyangqingyun/article/details/97565652
在线文档:https://feiyangqingyun.gitee.io/qwidgetdemo/video_system/
体验地址:https://pan.baidu.com/s/1d7TH_GEYl5nOecuNlWJJ7g 提取码:01jf 文件名:bin_video_system.zip。
文章导航:https://qtchina.blog.csdn.net/article/details/121327495
视频监控模块,各种停靠小窗体子模块,包括设备列表、图文警情、窗口信息、云台控制、预置位、巡航设置、设备控制、悬浮地图、网页浏览等。
视频回放模块,包括本地回放、远程回放、设备播放、图片回放、视频上传等。
电子地图模块,包括图片地图、在线地图、离线地图、路径规划等。
日志查询模块,包括本地日志、设备日志等。
系统设置模块,包括系统设置(基本设置、视频参数、数据库设置、地图配置、串口配置等)、录像机管理、摄像机管理、轮询配置、录像计划、用户管理等。
支持各种视频流(rtsp、rtmp、http等)、视频文件(mp4、rmvb、avi等)、本地USB摄像机播放。
支持多画面切换,包括1、4、6、8、9、13、16、25、36、64画面切换。
支持全屏切换,多种切换方式包括鼠标右键菜单、工具栏按钮、快捷键(alt+enter全屏,esc退出全屏)。
支持视频轮询,包括1、4、9、16画面轮询,可设置轮询分组(轮询预案)、轮询间隔、码流类型等。
支持onvif协议,包括设备搜索、云台控制、预置位、设备控制(图片参数、校对时间、系统重启,抓拍图片等)。
支持权限管理,不同的用户可以对应不同的模块权限,比如删除日志、关闭系统等。
数据库支持多种,包括sqlite、mysql、sqlserver、postgresql、oracle、人大金仓等。
本地USB摄像机支持设置分辨率、帧率等参数。
所有停靠模块都自动生成对应的菜单用来控制显示和隐藏,在标题栏右键可以弹出。
支持显示所有模块、隐藏所有模块、复位普通布局、复位全屏布局。
双击设备弹出实时预览视频,支持图片地图、在线地图、离线地图等。
摄像机节点拖曳到对应窗体播放视频,同时支持拖曳本地文件直接播放。
删除视频支持鼠标右键删除、悬浮条关闭删除、拖曳到视频监控面板外删除等多种方式。
图片地图上设备按钮可自由拖动,自动保存位置信息。百度地图上可以鼠标单击获取经纬度信息,用来更新设备位置。
视频监控面板窗体中任意通道支持拖曳交换,瞬间响应。
封装了百度地图,视图切换,运动轨迹,设备点位,鼠标按下获取经纬度等。
双击节点、拖曳节点、拖曳窗体交换位置等操作,均自动更新保存最后的播放地址,下次软件打开自动应用。
右下角音量条控件,失去焦点自动隐藏,音量条带静音图标。
支持视频截图,可指定单个或者对所有通道截图,底部小工具栏也有截图按钮。
支持超时自动隐藏鼠标指针、自动全屏机制。
支持onvif云台控制,可上下左右移动云台摄像机,包括复位和焦距调整等。
支持onvif预置位,可以添加、删除、修改预置位,可以调用起始位。
支持onvif图像参数设置,包括明亮度、对比度、饱和度、尖锐度等。
支持onvif其他操作,包括抓图、网络设置、校时、重启、事件订阅等。
支持任意onvif摄像机,包括但不限于海康、大华、宇视、天地伟业、华为等。
可保存视频,可选定时存储或者单文件存储,可选存储间隔时间。
可设置视频流通信方式tcp+udp,可设置视频解码是速度优先、质量优先、均衡等。
可设置软件中文名称、英文名称、LOGO图标等。
存储的视频文件支持导出到指定目录,支持批量上传到服务器。
完善的录像计划设置,支持每个通道7 * 24小时每半小时设置是否存储录像。
主界面采用停靠窗体模式,各种组件以小模块的形式加入,可自定义任意模块加入。
停靠模块可拖动任意位置嵌入和悬浮,支持最大化全屏,支持多屏幕。
双重布局文件存储机制,正常模式、全屏模式都对应不同的布局方案,自动切换和保存,比如全屏模式可以突出几个模块透明显示在指定位置,更具科幻感现代化。
原创onvif协议机制,采用底层协议解析(udp广播搜索+http请求执行命令)更轻量易懂易学习拓展,不依赖任何第三方组件比如gsoap。
原创数据导入、导出、打印机制,跨平台不依赖任何组件,瞬间导出数据。
内置多个原创组件,宇宙超值超级牛逼,包括数据导入导出组件(导出到xls、pdf、打印)、数据库组件(数据库管理线程、自动清理数据线程、万能分页、数据请求等)、地图组件、视频监控组件、文件多线程收发组件、onvif通信组件、通用浏览器内核组件等。
自定义信息框+错误框+询问框+右下角提示框(包含多种格式)等。
精美换肤,高达17套皮肤样式随意更换,所有样式全部统一,包括菜单等。
视频控件悬浮条可以自行增加多个按钮,监控界面底部小工具栏也可自行增加按钮。
双击摄像机节点自动播放视频,双击节点自动依次添加视频,会自动跳到下一个,双击父节点自动添加该节点下的所有视频。可选主码流、子码流。
录像机管理、摄像机管理,可添加删除修改导入导出打印信息,立即应用新的设备信息生成树状列表,不需重启。
可选多种内核自由切换,ffmpeg、vlc、mpv等,均可在pro中设置。推荐用ffmpeg,跨平台最多,默认提供好了linux和mac平台上编译好的库。
支持硬解码,可设置硬解码类型(qsv、dxva2、d3d11va等)。
默认采用opengl绘制视频,超低的CPU资源占用,支持yuyv和nv12两种格式绘制,性能爆表。
标签和图形信息支持三种绘制方式,绘制到遮罩层、绘制到图片、源头绘制(对应信息可以存储到文件)。
高度可定制化,用户可以很方便的在此基础上衍生自己的功能,比如增加自定义模块,增加运行模式、机器人监控、无人机监控、挖掘机监控等。
支持xp、win7、win10、win11、linux、mac、各种国产系统(UOS、中标麒麟、银河麒麟等)、嵌入式linux等系统。
注释完整,项目结构清晰,超级详细完整的使用开发手册,精确到每个代码文件的功能说明,不断持续迭代版本。
本源码项目文件中对编译生成的临时文件和可执行文件做了重定向,可执行文件并不在build开头的目录下,而是在源码同级目录的bin目录下。
config目录放的是软件的配置文件、地图模块需要的图片资源等。
db目录一般有三个文件,key.db是秘钥文件、video_system.db是对应sqlite的数据库文件、video_system.sql是对应数据库脚本(可以在系统设置中数据库管理部分执行脚本用来切换到mysql等其他数据库)。
logo目录存放的各种左上角软件LOGO图片,可以在系统设置中下拉选择。
map目录存放的图片地图模块所用的地图图片文件,可以手动拷贝到此。
sound目录存放的本系统所用的声音文件。
layout目录存放的不同工作模式不同界面对应的布局方案配置文件。
本系统没有说基于哪个Qt版本,由于系统中电子地图模块用到了浏览器模块,所以理论上要求你电脑的Qt版本也有浏览器模块才行
如果没有则电子地图模块不可用,但是其余功能全部可用没有任何影响。
本人亲测Qt4.7到Qt6.4之间的所有版本(理论上支持后续所有版本),亲测msvc、mingw、gcc、clang、armgcc各种编译器,亲测xp、win7、win10、linux、mac、树莓派、香橙派、全志H3、cotex-A9、imx6等。
2021-1-6开始集成了miniblink浏览器内核,意味着mingw版本的qt5.6以上版本也全部支持,这样就所有系统都有浏览器模块不需要担心没有电子地图的问题。
部分构建套件可能不支持预编译头,预编译头仅仅是为了加快编译速度,和程序本身无关。比如在win+Qt5.5 5.6就发现不支持,也可能是支持的不够全面,如果编译发生错误可以试着打开pro文件注释掉PRECOMPILED_HEADER = head.h 这行。
Qt6.2的mingw版本的multimedia模块不可用,msvc版本的正常。
开启视频存储后默认存储的MP4格式的文件,如果想要调整体积大小,可以找到core/core_videoffmpeg/ffmpegsave.cpp videoCodecCtx->bit_rate = FFmpegHelper::getBitRate(videoWidth, videoHeight); 将这个码率调小即可,比如 videoCodecCtx->bit_rate = FFmpegHelper::getBitRate(videoWidth, videoHeight)/2; 可以将体积减少一半,相应的画质也会差一些。
推荐用64位的Qt搭配64位的ffmpeg,目前绝大部分系统都是64位的,能获得最大性能提升,本人亲自对比测试32位和64位,64位无论资源占用和操作响应等体验都更优。尤其是开启硬解码后,如果64个通道都需要硬解码,32位的测试下来貌似资源不够用。
可执行文件在源码同级目录的bin目录下。
编译完成后记得将源码下的file目录下(切记是file目录下而不是file目录)的所有文件复制到可执行文件同一目录。
如果开启了视频监控(默认开启),则记得将对应的动态库文件复制到可执行文件同一目录。比如采用ffmpeg内核(默认就是ffmpeg)的话,则将下载到的dll_ffmpeg4下的所有文件复制到可执行文件同一目录。
各个操作系统的ffmpeg和vlc编译好的动态库以及miniblink的动态库下载地址。 -https://pan.baidu.com/s/13LDRu6mXC6gaADtrGprNVA 提取码: ujm7。
如果是64位的qt则对应的dll时候拷贝dll_ffmpeg4_64目录下的。
如果使用的ffmpeg3则对应dll目录就是dll_ffmpeg3,在core_videoffmpeg.pri文件中可以看到具体启用的是ffmpeg3(支持XP)还是ffmpeg4(不支持XP),默认是ffmpeg4。
如果编译运行提示miniblink文件不存在请先拷贝,则说明你当前用的Qt版本没有浏览器模块,要么没安装,要么不支持,你也不用担心啥,此时自动切换用的miniblink浏览器内核,你还需要将ffmpeg库下载的网盘的地方找到dll_miniblink.zip下载解压到可执行文件同一目录即可。
系统中所有的图标,都采用的图形字体,对照表在doc目录下的FontAwesome.png、FontAliBaBa.png,对应图形字体类IconHelper中加载的图形字体,后期如果还有增加的其他图形字体也是放在这里,一个类支持多种图形字体,通过不同的值范围自动设置。
如果发现地图打不开或者提示秘钥文件丢失,请先确认file目录下的所有文件有没有拷贝过去。
如果是用vs+qt可能报错 error LNK2026,解决办法详细见本文档中13其他说明/13.5环境使用qt+vs。
默认用户名admin 密码admin。
系统配置参数在加载的时候会对节点值进行过滤判断,如果为空会自动用初始值生成新的配置文件,如果不想要显示版权所有公司,可以填xxx而不是删掉整个值。
如果是用vlc推流的rtsp地址,比如 rtsp://:8554/aabb,由于vlc推流默认写死的采用的udp协议,所以监控系统也必须在系统设置中通信方式选择udp才行(默认tcp)。
离线地图可以用网上的瓦片地图下载器下载百度的离线地图放到对应目录即可。
也可以直接下载网盘中已经下载好的上海市的离线地图。
下载地址:https://pan.baidu.com/s/1ZxG-oyUKe286LPMPxOrO2A 提取码:o05q 文件名称:bin_map_tiles.tar.xz
使用说明
将压缩包下的两个文件夹复制到对应可执行文件下的config文件夹下,和map.js文件同一级目录。
tiles文件夹是街道图,tiles_hybrid文件夹是卫星图,tiles_self是路网图,路网图和卫星图合并就是混合图。
默认提供的是上海市徐汇区的瓦片地图,如果自己用万能地图下载器下载的百度地图的瓦片文件,也可以对应替换就行。
要注意的是格式,默认是jpg,如果下载的瓦片地图格式是png则需要打开config文件夹下的map_load.js文件,将.jpg改成.png保存即可。
下面假定USB摄像头的设备名为 USB2.0 PC CAMERA。
win系统如何查看设备名见本文档中13其他说明/13.7打开USB摄像头。
linux系统查看设备名直接执行命令 ls /dev/video * 即可,一般对应的设备名是 /dev/video0。
写法1:video=USB2.0 PC CAMERA,这种写法默认按照640x480分辨率打开摄像头。
写法2:video=USB2.0 PC CAMERA|1280x720|30,这种写法按照指定的分辨率1280x720以及采集帧率30来打开摄像头。
写法3:video=/dev/video0,这种是对应linux系统,程序内部会自动过滤和调整填入的地址。
如果指定了分辨率和帧率则需要硬件支持才行,比如摄像头的最大分辨率是640x480,而指定了1280x720则会打开失败。
中央综合:http://39.135.138.60:18890/PLTV/88888910/224/3221225618/index.m3u8
中央新闻:http://39.135.138.60:18890/PLTV/88888910/224/3221225638/index.m3u8
中央音乐:http://39.135.138.60:18890/PLTV/88888910/224/3221225641/index.m3u8
中央电视:http://39.135.138.60:18890/PLTV/88888910/224/3221225635/index.m3u8
中央记录:http://39.135.138.60:18890/PLTV/88888910/224/3221225646/index.m3u8
中央少儿:http://39.135.138.60:18890/PLTV/88888910/224/3221225639/index.m3u8
湖南卫视:http://39.135.138.60:18890/PLTV/88888910/224/3221225745/index.m3u8
深圳卫视:http://39.135.138.60:18890/PLTV/88888910/224/3221225741/index.m3u8
上海纪实:http://39.135.138.60:18890/PLTV/88888910/224/3221225654/index.m3u8
天津卫视:http://39.135.138.60:18890/PLTV/88888910/224/3221225739/index.m3u8
万能办法,用谷歌或者谷歌内核的浏览器,打开时光网 http://www.mtime.com/ ,随便打开个视频,这里一般是预告片,按F12切换到审查元素,顶部切换到网络,选中媒体,刷新网页,按照尺寸排列,最大的那个MP4文件就是,鼠标右键复制地址,这个地址就是完整的网络地址。
http://vfx.mtime.cn/Video/2021/11/16/mp4/211116131456748178.mp4
http://vfx.mtime.cn/Video/2019/03/19/mp4/190319212559089721.mp4
http://vfx.mtime.cn/Video/2019/03/17/mp4/190317150237409904.mp4
http://vfx.mtime.cn/Video/2019/03/14/mp4/190314223540373995.mp4
http://vfx.mtime.cn/Video/2023/03/09/mp4/230309152143524121.mp4
http://vfx.mtime.cn/Video/2023/03/07/mp4/230307085324679124.mp4
http://vfx.mtime.cn/Video/2022/07/18/mp4/220718132929585151.mp4
http://vfx.mtime.cn/Video/2022/12/17/mp4/221217153424902164.mp4
http://vfx.mtime.cn/Video/2022/07/04/mp4/220704110656040153.mp4
http://vfx.mtime.cn/Video/2021/02/08/mp4/210208150307073134.mp4
http://vfx.mtime.cn/Video/2021/05/11/mp4/210511114524329144.mp4
http://vfx.mtime.cn/Video/2021/04/20/mp4/210420113022586184.mp4
http://vfx.mtime.cn/Video/2021/03/13/mp4/210313111010421158.mp4
http://vfx.mtime.cn/Video/2020/01/15/mp4/200115125943120574.mp4
http://vfx.mtime.cn/Video/2019/09/19/mp4/190919093845618674.mp4
rtmp://live.yihtc.com:10935/hls/stream_3
rtmp://live.yihtc.com:10935/hls/stream_13
rtmp://218.3.205.46/live/ggpd_sd
rtmp://hls.hsrtv.cn/hls/hstv2
rtmp://hls.hsrtv.cn/hls/hstv1
rtmp://222.173.22.119:1935/live/jnyd_sd
rtmp://222.173.22.119:1935/live/xwhd_hd
rtmp://livetv.dhtv.cn:1935/live/peoples
rtmp://livetv.dhtv.cn:1935/live/citylife
rtmp://livetv.dhtv.cn:1935/live/financial
rtmp://livetv.dhtv.cn:1935/live/news
下面列出的是一些常用厂家的格式,不同厂家格式不一样,具体什么格式请咨询厂家索要对应的视频流格式,或者设备支持onvif的话,通过onvif工具搜索可以拿到视频流格式。
实时预览格式:rtsp://admin:12345@192.168.1.128:554/Streaming/Channels/101?transportmode=unicast
视频回放格式:rtsp://admin:12345@192.168.1.128:554/Streaming/tracks/101?starttime=20120802t063812z&endtime=20120802t064816z
流媒体视频流:rtsp://172.6.24.15:554/Devicehc8://172.6.22.106:8000:0:0?username=admin&password=12345
日期时间格式:ISO 8601 表示Zulu(GMT) 时间 YYYYMMDD”T”HHmmSS.fraction”Z”,
单播多播说明:unicast表示单播,multicast表示多播,默认单播,可以省略。
通道码流说明:101,1是通道号,01是通道的码流编号,也可以是02、03,第2通道主码流=201,第16通道子码流=1602,依次类推。
实时预览格式:rtsp://192.168.1.128:554/cam/realmonitor?channel=1&subtype=0&unicast=true&proto=Onvif
视频回放格式:rtsp://admin:12345@192.168.1.128:554/cam/playback?channel=1&subtype=0&starttime=2021_03_18_11_36_01&endtime=2021_03_18_12_05_01
格式内容说明:channel表示通道,subtype表示码流编号,日期时间字符串非常明确。
实时预览格式:rtsp://admin:12345@192.168.1.128:554/live?channel=1&stream=1
视频回放格式:rtsp://admin:12345@192.168.1.128:554/file?channel=1&start=1494485280&stop=1494485480
其他通用格式:rtsp://admin:12345@192.168.1.128:554/0 0-主码流 1-子码流
日期时间说明:先转换时间戳,1970年到该时间经过的秒数。
后期规划
摄像机信息表的用户信息字段用起来,视频流地址不带用户信息,主动加入用户信息构建最终地址应用。
用户密码密文存储,防止泄露。
V20230510
增加文字水印单独示例,专门演示如何添加日期时间标签,文字标签,指定标签更新内容,以及显示实时码率文字水印。
内核ffmpeg增加实时码率计算,发出结果信号。
增加了OSD标签格式日期时间带毫秒枚举值。
增加统计实时码率开关,开启后,在人工智能开关开启状态下,会将实时码率信息以文字水印OSD的方式贴到视频上。
文字水印演示字体大小改成了以视频宽度比例为准,以便保证字体足够大能够看清。
V20230416
新增桌面录屏的支持,包括ffmpeg、vlc、qtav、easyplayer等内核。
桌面录屏可指定录屏区域位置。
完善easyplayer内核对各种视频流的支持。
重新优化视频类型的判断,http开头的地址可能是文件也可能是视频流,以最终时长作为判断依据。
增加了H264裸流视频文件倍速播放。
内核ffmpeg增加发送packet帧信号,一般用于推流的同时保存视频文件需要。
模块onvif增加osd相关处理,可以获取所有osd,并执行添加、删除、修改操作。
增加OSD管理悬停模块,可以增删改查OSD相关信息。
V20230323
onvif模块增加获取mac地址。
所有监控内核增加矫正视频类型,比如http开头的有文件长度的则强制设置为filehttp类型,方便后期其他判断处理。
新增主动设置文件时长和播放进度的函数,以便事件回调那边主动设置。
修复ffmpeg内核部分视频文件当分辨率不是常规分辨率时(比如分辨率426x240)回调取出图片不正确的BUG,转换需要做字节对齐设置,现在约定统一用4字节对齐,这样兼容了所有可能的分辨率。
修复ffmpeg内核在高倍速比如5倍速播放情况下,如果解码来不及导致播放进度计算不正确的BUG。
增加对http开头的地址对应视频类型的判断,有些是视频文件(有时长并且可以切换播放进度),有些是实时视频,尽管地址格式都是 http://xxxxxx/xx.m3u8 这种。
V20230201
新增天气预报模块开关。
海康内核增加手动指定端口解析。
更新onvif相关处理,支持内网摄像头通过路由器端口映射公开到外网,以外网的IP地址形式访问。
设备搜索模块在单播的时候增加厂家为空则先获取设备信息获取到制造商名称并自动填入。
内核vlc增加图片和文字水印功能,从源头处理。
内核mpv增加文字水印功能。
内核ffmpeg增加网络访问视频文件头部消息user_agent=Mozilla,有些视频网站根据这个头部消息过滤不让ffmpeg访问。
onvif单播搜索增加指定地址不存在的过滤。
增加对显卡禁用环境的识别,自动切换采用Qt::AA_UseOpenGLES,否则在禁用显卡环境中无法正常使用opengl。
增加当处于OpenGLES绘制下自动将硬解码改成none,防止无法正常显示视频画面。
onvif组件搜索功能增加错误提示,比如绑定组播失败、单播地址不通等提示。
无人机移动演示模块增加过滤,还没有初始化好就不触发js交互。
增加对虚拟机环境的识别,自动切换采用Qt::AA_UseOpenGLES,否则在虚拟机中硬解码下无法使用AA_UseDesktopOpenGL。
录像计划批量按钮增加先清空再批量,否则通道数不一致。
本地回放等界面增加全选、全不选按钮,用于对查询出来的视频文件全部选中和不选中。
打包文件增加了wenquanyi.ttf字体文件,由于ffmpeg用到了滤镜,为了支持中文正确显示,依赖指定的中文字体文件,放到可执行文件同一目录即可。
V20230108
内核ffmpeg实现了各种OSD标签和图形直接绘制到帧上,保存也带了对应的标签信息,之前是绘制在遮罩层上。
内核ffmpeg带旋转角度的视频旋转采用滤镜实现,之前是通过算法转换。
修复图文警情在清空后重新添加警情的时候最底部一个item可能高度不对的BUG。
批量添加NVR通道改进编号和摄像头名称策略,编号为NVR地址的后两个网段的值加上3位通道字符串,名称为通道001/通道002依次下去。这样符合现场跨网段的场景,一般现场有N多摄像机和NVR,很多都是跨网段的场景。
地图上设备单击弹出视频预览增加过滤,限制双击只允许单击。
增加配置参数控制设备树是否显示主码流子码流节点。
增加配置参数双击打开分组最大数量,0-最大通道数量 1-当前通道数量 2-自动调整数量。
增加配置参数记录最后展开的设备节点,下次打开自动应用。
V20221212
改进实时监测设备在线情况逻辑,之前是一次性所有的处理,改成了排队处理,每次间隔0.1s,同时处理完一个来回后休息5s,这样在设备数据很多的时候尤其有效。
视频参数设置中新增离线检测开关和报警视频存储时间下拉框选择。
设备播放模块增加添加完一个通道后自动切换到下一个通道。
将批量添加单独做成窗体,通用于轮询管理和摄像机管理,可以很方便的批量添加摄像机,录像机通道递增等各种智能规则。
打开弹窗视频增加在线判断,没有开启在线检测则先检测再判断是否需要弹窗。
纠正图片参数调节中饱和度和对比度界面上名称标识写反了的BUG。
V20221207
报警事件抓图后添加到图文警情,改成线程排队处理,之前在主线程处理,如果有多个同时,很可能卡主界面,而且还要等待抓图的文件生成才能正确显示图片。
新增警情字典表config/event.txt,格式 1,IsMotion,移动报警,移动结束 ,分别表示 事件等级/唯一标识/报警字样/解除字样 ,这样大大增强灵活性,每个不同厂家的设备可能有不同的关键字表示不同的警情,用户只需要在字典表中编辑好即可。
内核vlc彻底解决回调模式下视频流需要手动指定的问题,改成了在播放后拿到分辨率后去设置回调数据,完美解决。
修复内核vlc中打开视频流后多次触发读取媒体信息的BUG,包括中途视频流发生变化也会多次触发。
修复悬停模块透明度值应用不及时的BUG。
图文警情双击显示原图增加自适应图片大小策略,并限定最大分辨率。
增加了左右通道音频振幅分别计算,之前混在一起计算。单通道的则左右一样。
视频预览窗体增加自适应视频大小策略,并限定最大分辨率。
新增将选择的软件图标作为全局的左上角图标,选择后立即应用。
修复在共享解码线程中再次打开弹出的视频窗体声音大小和静音状态不一致的BUG,改成了和原共享解码线程一致。
弹出窗体自适应最大尺寸,如果视频尺寸超过了最大尺寸则等比例缩放到合适尺寸。
报警事件抓图按照日期文件夹存放,之前存放在image_alarm目录下挤在一起,多了就很难看。
新增每个视频控件都有共享解码属性,每个控件都可以控制是否需要共享解码,之前是统一全局的属性,有时候需要单独弹出的报警视频独立处理以及存储录像,此时就需要指定该控件不共享解码,极大的增加了自由度。
修复清空录像机信息后,设备列表无法正常加载的BUG,改成了自动生成一个默认的分组。
新增半透明轮询分组提示标签窗体,在轮询启动后显示停止轮询后隐藏,可以拖动到合适位置,自动记忆最后的位置。方便在全屏轮询阶段告知用户当前轮询到哪里。
增加开关量报警弹出报警视频,并录像存储,可在视频回放中查询对应的报警视频并回放。
报警视频弹窗窗体标题栏,如果指定了存储报警录像,则显示关闭倒计时字样。
修复在打开了未连接的视频通道,通道处于不断重连中,单击轮询崩溃的BUG。
onvif组件增加唯一标识,打印信息更清晰,带上唯一标识和设备IP地址。
V20221125
onvif搜索增加超时时间参数,经过大量的现场应用反馈,少部分厂家的设备,在极端的网络环境中,返回的数据要慢,需要把之前写死在代码中的超时时间放出来作为参数设置可调节。
视频参数增加悬浮工具栏位置参数,可以设置视频控件的悬浮条位置在顶部、底部、左侧、右侧四个位置。
解决Qt6.4及以后版本比如Qt6.5上minibink和opengl冲突导致opengl黑屏的bug,此问题找了很久发现原来是和miniblink冲突了,改成了异步加载miniblink浏览器控件即可,代码 QMetaObject::invokeMethod(this, "initWebView", Qt::QueuedConnection);
对不启用任何解码内核增加过滤,没有指定内核则不用启动解码线程。
测试发现Qt6.4.1版本音频播放有问题,会打印 qt.multimedia.audiooutput: Failed to setup resampler ,确认过是官方新增的bug(https://forum.qt.io/topic/140523/qt-6-x-error-message-qt-multimedia-audiooutput-failed-to-setup-resampler/5),用最新的6.5版本即可,总之不要用6.4.1。
使用示例增加音频频谱示例。
使用示例增加拖曳播放示例。
系统设置增加音频振幅开关,开启后视频右侧都会显示左右通道额音量条。
初始化结构体参数增加过滤机制,地址为空的不处理。
新增了视频通道拖动配置参数,可控是否允许拖动交换通道,防止误操作。
增加根据视频控件的高度自动调整音量条格子数量,比如4通道60个格子,64通道20个格子,保证音量条自适应。
音量条的圆角角度、格子高度、边距、间距等参数可自由设置。
静音状态约定只是声音不发送给音频输出设备播放,音频数据正常解析,包括音频频谱正常显示。
增加根据视频控件的宽度自动调整音量条的宽度,比如4通道的时候音量条可以宽一些,64通道音量条可以窄一些。以便留出更多的空间给视频显示而不会显得很拥挤。
增加根据视频控件的宽度自动设置悬浮条提示信息是否需要显示,宽度不够则不显示,比如悬浮条设定显示在左侧右侧由于宽度不够也不显示提示文字信息。
增加报警事件抓图显示在图文警情中。
增加udp://开头的视频流强制采用udp协议解析。
修复重连后默认的音量大小以及静音状态不正确的BUG。
V20221121
新增图形字体文件可编辑,可以根据需要添加自己的图标到iconfont.ttf字体文件,需要借助fontcreator工具。
新增部分图标,把底部通道1-通道64的图标换成了数字模样的,整齐统一容易拓展。
修复ffmpeg内核声音播放的时候遇到标题栏或者UI按下卡住停顿0.5s的BUG,改成了线程中播放音频,无论UI如何卡丝毫不影响。
视频回放增加手动停止按钮以及静音切换按钮。
增加ffmpeg内核声音解码过滤,部分摄像机的音频流如果是48000采样会导致转换失败,增加过滤处理。
修复应用最后的音量大小和静音状态时候在ffmpeg内核下有时候不成功的BUG。
实时检测摄像机是否在线,增加其他端口的识别,默认554端口,也可能有其他端口。
改进默认音量大小和静音状态设置逻辑,如果采用QAudioOutput播放音频则初始化的时候传入对应参数,如果是内核自带声音静音接口的则在打开成功以后主动去设置默认的音量大小和静音状态。
本地回放增加停止播放和静音切换图标按钮,并优化对应的处理逻辑。
修复qmedia内核静音切换对应标志位没有改变的BUG。
对视频监控控件新增获取是否暂停状态、音量大小、静音状态等函数。
本地回放新增当用户按下播放按钮右侧又选择了对应的文件则自动触发双击播放。
修复本地回放中停止播放后当还不是末尾一个视频文件时还会自动播放下一个的BUG,因为有自动播放机制,需要增加标志位判断,只要按下过停止按钮则无需自动播放。
修复ffmpeg内核在快速拖动进度条期间切换播放进度后小概率出现播放暂停的BUG。之前复用的暂停标志位,由于很多地方用到并且可能修改了暂停标志位导致恰时间点的不正确,新增了切换进度标志位,专用于切换进度判断,完美解决。
增加onvif指令过滤重复机制,当队列中有相同的onvif地址和指令的时候,不需要加入队列。
内核ffmpeg增加了实时码率的计算,统计的一个周期内(帧率25就统计25个包)所有视频数据包的总大小。
重新更新全部说明书,包括截图和文字说明。
V20221116
每个视频控件都可以手动开启和停止录像,开启的时候传入文件名即可。
修正视频控件边框大小计算当尺寸为奇数的时候不准确的情况,增加了偏移1个像素处理非常完美。
修复ffmpeg内核打开视频流中途分辨率变化后计算不正确的BUG,中途分辨率调整后策略改成重新打开。
修复ffmpeg内核在暂停阶段切换播放进度后会继续播放的BUG,应该是要继续处于暂停播放。
解码线程基类、保存线程基类都增加全局静态变量控制是否打印消息,由于解码线程等类中要打印的信息特别多,可以在需要的时候开启,几乎每一个重要的步骤或者可能出错的地方都会有对应打印信息,方便跟踪查找问题。有时候想关注其他地方的打印信息,为了避免给解码线程的打印信息冲掉,尤其是通道数量多的时候,信息类似涌过来,此时可以关闭解码线程的打印信息,专注于其他打印信息。
视频配置参数这块很多参数的设置改成了立即应用,比如边框大小、图片显示策略等,不能立即应用的也可以通过主界面中的停靠窗体设备控制单击刷新通道来应用。
录像计划改成了立即应用,添加、删除、修改后都会立即更新录像计划到视频管理线程类。
视频回放中的日期选择范围,改成了精确到分,无需精确到秒。
视频回放增加了倍速选项,可选0.5/1.0/2.0/4.0/8.0等倍速。设置完立即应用,下一个自动播放的也会立即应用该倍速。
视频管理线程类对切换保存文件的时间的精准度做了调整,比如30分钟一个文件,文件的时间是12:00:00到12:29:59,12:30:00到12:59:59,整半点开始,59秒结束。
目前的视频存储策略是中间存储的保证是30分钟的一个文件,头部和尾部,因为开启录像或者结束录像的时间未必是整半点,所以可能产生的录像文件的时间不一定的30分钟一个。
经过详细测试对比,如果是视频流,开启了变码流则视频大小未必一样,如果是定码流则几乎一样,变码流则文件大小相差比较大,视频中动静变化比较大或者颜色比较多的文件体积更大。
同样分辨率的视频流,用H265编码生成的视频文件体积比H264小很多(同一个摄像头同样主码流分辨率切换到H265存储体积大概是普通H264的40%,还有其他H264H/H264B之类的没有具体对比测试),本系统中的策略是源头是H264的就采用H264编码,源头是H265的就用H265编码存储。这样可以不用转码大大减轻CPU运算压力。
录像文件存储以本地时间为准,如果设备的时间和本地时间不一致,可能会看到摄像头视频文件上显示的时间和要求的时间不一致,在开启了onvif校时的情况下,大概会有3s左右的偏差,也就是说录像文件上显示的时间可能是走到10:30:03才结束,如果时间完全一致则应该是10:29:59。
增加目标秒数核对以便尽量保持录像时间以59秒结束,可以自行更改该目标秒数值保持一致。
所有下拉框中的通道字符串为了整齐统一改成了两位字符串比如 通道01、通道05、通道16,除了主界面通道文字是 通道1、通道5、通道16字样,其余全部两位。
V20221111
新增录像计划,增加录像任务计划控件,支持星期一到星期日每天24小时勾选是否录像,精确到30分钟间隔。
任务策略表格支持直接右键菜单全部选中、反向选中、清空选中操作。
新增录像计划表RecordInfo,对应字段RecordCh表示通道0-64,RecordWeek1-RecordWeek7表示星期一到星期日的录像计划字符串表示,通过占位符表示该30分钟时间内是否录像,每天有48个小格式。
通道唯一标识统一ch01到ch64字样,录像文件以及截图都按照这个作为文件的前缀,方便查找。
调整了一个设备多路通道(比如NVR或者部分相机)搜索的结果组合的策略,以便配置成多个不同的通道。大部分厂家的规则是每个通道一路主码流一路子码流,依次顺序存放。
录像计划新增批量一键添加64通道7 * 24小时录像,绝大部分时候都是这个情况所以可以一键添加,添加好以后有特殊的可以自行调整。
演示示例demo新增了配置参数保存对应选择的视频地址。
视频参数设置做了重大调整,按照新的解码内核来设计,更合理更贴切,把一些不需要的删除了。
V20220918
构思和编码及测试花了一年时间,将所有视频监控内核重新架构重写,抽象视频解码线程类和视频窗体展示类,着重解决了视频解码线程复用。具体可参见文档中的内核模块说明。
视频复用技术难点
通道1打开视频流A,通道2也打开视频流A,通道3也打开视频流A,此时通道1负责打开视频流A,其他两个通道公用通道1的视频流数据。
通道1关闭视频流A(仅仅是关闭映射,不能关闭视频流),通道2关闭视频流A(仅仅是关闭映射,不能关闭视频流),通道3关闭视频流A(关闭映射+关闭视频流)。
首次打开视频流地址的通道负责打开视频流。
末次关闭视频流地址的通道负责关闭视频流。
主要改进功能点
共享解码线程,相同地址的已经打开过的,直接复用,大大减轻网络流量和推流设备的压力。
动态内核挂载,解码和展示分离,通过基类的公共接口设计,视频控件可以任意动态挂载任意的解码内核,在打开的时候指定即可,内部会根据指定的内核自动实例化对应解码线程解码。
悬浮工具栏控件,各种颜色设置,包括透明度,位置可以上下左右,内容可以自定义。单击事件发信号,常用的录像、抓图、静音、关闭等按钮内置了实现,其余自定义按钮可以自行拿到信号做处理。空白处显示对应通道的分辨率、录像状态等信息,提供接口设置对应提示信息。
自定义标签OSD,任意多个,有多种类型和属性参数。
自定义图形,任意多个,直接绘制到原图上,有多种类型和属性参数。
视频控件基类,参数极其丰富,包括边框大小、边框颜色、焦点颜色、背景颜色、文字颜色、填充颜色、背景文字、背景图片、是否拷贝图片、缩放显示模式、视频显示模式等。
解码线程基类,参数极其丰富,包括解析内核、视频地址、缓存分辨率、解码策略、硬件加速、通信协议、缓存时间、循环播放、读取超时时间、连接超时时间等。
除了常规的视频文件、网络文件、视频流,还支持本地摄像头、旋转了90度的手机视频文件、非H264的文件自动转码显示。
对ffmpeg内核做了极度优化,支持音频视频文件保存,之前只支持rtsp视频流,而且生成的文件不标准没有文件属性分辨率信息等。
统一的打印格式,完整的信号通知,友好的接口设计。
V20220625
在之前支持NVR所有通道批量添加基础上,增加自动添加NVR信息到表,这样每个NVR都会自动添加,如果有手动添加好的则取添加好的,以IP地址为准。
修复设备在线状态处理,在同一个NVR下IP地址相同的不同通道视频,不会处理在线状态的BUG。
修复在postgresql数据库和oracle数据库下,QSqlTableModel对应setTable设置表名严格区分大小写的BUG。
测试发现有些很老的设备支持的是onvif1.0,云台地址需要用getCapabilities才能拿到,改进这个处理,兼容任意版本。
V20220612
修复qss中分组框QGroupBox标题位移的BUG,在linux系统表现不统一。
改进同样的内容导出到pdf和打印显示效果不一致的情况,统一设置分辨率为96。
摄像机管理增加多选删除,删除的时候除了删除摄像机表中对应记录,也同时删除轮询信息表中的记录。
初始化数据库按钮增加弹框确认,由于这个操作安全级别非常高,增加弹框确认很有必要。
所有QTableView+QSqlTableModel对应的保存按钮代码增加主动设置焦点,避免mac系统中当单元格处于编辑状态,再去单击保存按钮,数据依然是之前的数据的BUG。
样式表全局颜色增加悬停背景颜色QUIConfig::HoverBgColor和选中背景颜色QUIConfig::SelectBgColor用于自定义委托。
对于加深的样式,重新设置单元格等item选中和悬停颜色 默认悬停-DarkColorEnd 选中-NormalColorEnd,加深颜色设置为相反。
增加全局参数控制是悬停颜色覆盖选中颜色还是选中颜色优先,默认选中颜色优先,这样选中的item鼠标移上去不会改变掉颜色。
增加过滤同名的NVR,之前会重复加载,现在限定同名的只加载一个,要求整个系统中NVR的名字必须唯一。
轮询管理中增加摄像机表的过滤条件,启用了的才显示在表格中。
增加播放记录开关,用于软件启动后,是否从播放记录url.txt读取历史记录进行播放。
增加播放记录url.txt过滤机制,只有摄像机表中存在且启用过的才可以播放。也可以改成只对rtsp开头的进行过滤。
增加选择列表通道的时候自动选中视频通道,高亮显示,这样很明确知道选择的哪个,同理,选中视频通道也高亮选中列表通道。相当于通道选中和列表选中联动。
增加设备列表在线离线不同图标显示,目前只对rtsp地址开头的进行实时监测上线离线状态,其他全部永远当做在线。离线图标颜色取系统设置中的报警图标颜色。
增加设备在线状态字段列表,实时监测设备状态期间先判断状态是否发生变化,只有发生变化了才需要去调用对应函数处理,大大减少无效的多余的处理。
修复设备列表双击空白处崩溃的BUG,需要过滤空节点item。
增加表格策略,单选按下编辑、多选双击编辑,有些用户需要多选摄像机列表删除。
V20220515
将用户退出中的退出系统权限验证去掉,理论上对退出系统这个限制没啥意义,还可以通过任务管理器强制关闭进程。
将退出系统的权限名称改成调整布局,没有调整布局权限则不能调整拖动停靠窗体位置等。
视频面板窗体对象指针放到了全局静态变量,这样很多地方可以直接使用,比如声音控制、布局调整、视频轮询等。这样就不用繁琐的信号槽切换,可以省略很多不必要的代码,性能更高。
修复静音状态下调整音量可能不正确的BUG,静音状态下只改变音量值变量而不是正常改变音量。
实现右下角音量面板静音切换、音量值调整,全局视频控件应用。
改进默认地图算法,取第一个有背景地图的设备的图片作为默认图片,可能默认图片不存在则取图片列表中的第一张。
修复ffmpeg内核回调模式自动重连崩溃的BUG,此时图片不存在应该置为空。
增加识别秘钥有限制后限定标题栏带试用字样。
重写通用的视频地址类videourl,将通道改成0开始,分隔符改成英文逗号,视频地址集合通过指定枚举值选择不同类型添加。
增加自动插入临时消息到数据库用户操作记录,增加参数控制是否需要显示临时消息的时候插入。
V20220413
修复视频控件设置自定义背景颜色的时候,没有考虑边框的范围问题。
选项卡样式去掉悬停样式,经过观察对比Qt自带的样式都是没有悬停样式,直接是选中样式。
修复自定义委托复选框不居中的问题,之前计算不准确会有细微偏差。
自定义委托增加悬停颜色。
重写自定义委托禁用列,支持文字颜色、背景颜色、字体等特性。
修复用户登录、用户退出界面标题栏字体被放大的BUG,因为样式冲突了。
将NvrInfo和IpcInfo中的地址字段改名为mark备注字段,涵盖内容更广。
地图模块默认卫星图增加了叠加层,更符合实际需求,对应地图综合应用示例做了极大升级改善,比如下载离线地图改成了最新的地址,可以下载到和在线地图一样的瓦片图片文件,离线地图下载改成了多线程,速度提升10倍以上。
自定义委托增加quistyle标记,有该标记则自动代码内部引用换肤全局颜色变量,这样删除了大量的设置自定义委托背景颜色的代码。
修复Qt6中msvc编译器下,强制指定miniblink浏览器内核的时候编译通不过的BUG,其实这个操作有点吃饱了撑着,因为msvc下有webengine浏览器内核。但是就是因为有极个别人有这个需求,客户就是上帝。
增加用户管理权限。
将用户权限和用户信息相关类合并到通用的类userhelper中,做成通用的权限组件。
修复Qt6中自定义复选框委托,在设置了全局样式的情况下,会不断切换选中的BUG。
效果图重新截图,用最新的运行界面。
组件示例增加4通道视频同时播放,进度条控制。
V20220106
彻底修复全屏模式+webengine同时存在的情况下鼠标右键菜单无法弹出以及视频可能黑屏的BUG,这是Qt的BUG。
同时测试多屏幕下正常状态和全屏状态的情况,多屏幕不同分辨率。
增加其他设置界面,将串口设置、网络设置等移动到其他设置。随着功能越来越多,也很有必要单独拆分设置。
修复打印预览看不到文字的BUG,原来是设置了QGraphicsView的前景色导致的,把前景色和背景色设置成一样的了,其实是有文字的,鬼想得到QPrintPreviewDialog里面的预览原来用的是QGraphicsView绘制的。
修复qchart图表控件鼠标按下松开后会跟随窗体移动的BUG,因为qchart鼠标按下是UngrabMouse事件而不是MouseButtonRelease。
修复表格行按下后自定义委托颜色在部分样式方案下设置不正确的BUG。
增加视频弹窗按钮,封装的统一的视频弹窗静态函数,直接传入url地址即可。
修复鼠标按下视频预览底部工具栏也能拖曳视频的BUG。
海康内核解析增加对通道的解析,比如可能是一个摄像机有多个通道,或者NVR多个通道。同时完善主码流子码流的解析,可以解析多个码流,之前只能解析主码流子码流两个。
海康内核句柄模式下增加等比例缩放自适应。
onvif模块修复部分厂家摄像机比如天地伟业,搜索返回的媒体地址等一系列请求地址,没有加onvif节点的BUG。
V20211220
重新梳理整个onvif模块,调整对应的结构,删除多余的变量和设置等,对应云台控制等操作需要指定profile,通过参数传入。
对应图片参数操作需要指定videosource,通过参数传入。
去除数据库字段mediaurl、ptzurl,因为这两个数据每次都是更新重新获取的,通过getServices获取,这两个字段改成了videosource、profiletoken,用来从数据库读取出来,每次使用的时候自动下发。
预置位表格中的按钮样式调整,去掉圆角,增加边距,效果更完美。
新增nvr多个通道onvif支持,改动onvif模块代码和数据库结构。
搜索设备后判断是否多个videosource,多个表示有多个视频源,一般是NVR,也有部分IPC自带多个视频源。
有多个则根据不同厂家不同规则,找出对应的每个通道的videosource、profiletoken、rtspmain、rtspsub用分隔符 | 插入到临时表格中。
摄像机管理界面接收到添加设备的时候,在addDevice槽函数中,判断发过来的数据,带了 | 要分别取出来作为通道添加到数据库中。
重新定义搜索的摄像机设备命名规则,按照摄像机#ip地址末尾数字的方式。
如果是NVR过来的摄像机,增加自动查找NVR的名称插入数据库。
获取预置位增加立即清空所有行,之前是先清空内容再根据读取到的预置位个数设置行数。
增加双击打开NVR(也叫分组)对应策略 0-最后空白通道 1-从头清空通道。
增加双击打开IPC(也叫设备)对应策略 0-最后空白通道 1-最后按下通道。
改进在分辨率不同缩放比例保持一致的UI体验,不受缩放比例的影响。
修正异或加密,增加对@String开头的密文进行过滤,防止高版本产生的配置文件到低版本的Qt程序不能正确解析的BUG。
如果打开视频流出错提示 Server returned 5XX Server Error reply 表示摄像机的码流满了,可能多个地方在拉取码流导致摄像机输出的视频流被占满,已经没有更多资源。
V20211205
地图内核增加了海量点接口。
路径规划模块彻底重写,支持重新绘制、沿线移动等模式,数据表格显示。
设备轨迹模块改成从gps点集合文本文件加载进行循环动态模拟移动,默认飞机图标,以便转动角度。
设备播放增加保存视频开关配置参数,可以直接在界面上开启,开启后,通过rtsp从nvr取流比如回放视频,可以将回放的视频保存MP4文件到本地。
修正Qt6通过属性设置标签labtip不能居中对齐的BUG。
封装通用的设置一堆按钮比如添加、删除、保存、导入、导出等按钮图形字体的函数,直接传入父面板即可,自动查找对应的objname设置图标,省去一堆重复代码。
新增飞行轨迹模块frmDeviceGps2,之前的frmDeviceGps作为通过外部函数调用移动。
样式统一整理规范,分类6大类:normal、black、light、dark、flat、other。
xxxxxxxxxx
261void QUIStyle::getStyle(QStringList &styleNames, QStringList &styleFiles)
2{
3 static QStringList names;
4 if (names.count() == 0) {
5 names << "黑蓝色" << "软件黑" << "视频黑";
6 names << "深黑色" << "深蓝色" << "深灰色";
7 names << "扁平黑" << "扁平蓝" << "扁平灰";
8 names << "浅黑色" << "浅蓝色" << "浅灰色";
9 names << "普通黑" << "普通蓝" << "普通灰";
10 names << "大蓝色" << "大紫色" << "大银色";
11 }
12
+0 前言说明
0.1 系统说明
本视频监控系统做的是通用的系统,主要偏重整体框架和UI交互等。
主要功能包括摄像机管理,实时视频显示,视频轮询、视频存储、设备地图显示,各种画面切换,各种悬停子模块、onvif搜索设备和云台控制及预置位,通用的NVR视频流播放(比如海康的NVR支持直接取流回放),录像计划、用户管理等功能。
如果是依赖SDK去实现的功能(雨刷、去雾等)都没有做,那个破坏了兼容性,无法通用其他摄像机设备以及其他操作系统。
每个厂家SDK和定制的功能都不一样,如果有这方面的需要都是买过去自己加上SDK的功能和自己定制需要的功能。
整个项目源代码行数大概30W行(项目代码本身除去第三方库以后约7W行,就是自己写的部分),其中代码13.5W行(占比45%),注释12.7W行(占比42%),空行3.5W行。分层设计注释详细。
本程序会一直持续迭代更新,包括项目源码、整体框架、使用说明等,一次购买终生售后。
0.2 特别说明
程序本身是个客户端(直接从摄像机或者NVR等设备取rtsp视频流)并不是服务器程序。
摄像机管理没有限制摄像机的数量,理论上10000路肯定没有问题,就是个数据库记录。
实时显示具体能支持多少路,和具体的电脑配置有关(亲测1.8G主频8G内存I5子码流64路,总之比海康大华客户端要更优秀)。
程序实时显示界面最大可以到64路,每个通道都是打开的时候才会去建立连接取视频流,而不是一开始就建立了连接。
系统采用onvif协议+rtsp视频流机制,并不限定支持哪家的摄像机,只要符合这两种协议的都支持,市面上99%的网络摄像机都支持这两种基础协议,包括但不限于海康、大华、宇视、天地伟业、华为等各种安防厂家的摄像机。
本系统没有内置人脸识别等任何相关算法,提供的是相关的接口,比如自己的算法识别到人脸区域后,将区域坐标传入视频控件自动绘制。
系统采用纯QtWidget(非qml)编写,解码采用ffmpeg,搜索采用onvif协议,视频播放采用rtsp协议,所有源码开放,没有封装的库。
同时集成了数据库、多线程、串口通信、网络通信、音视频解码/同步/存储、网页地图、界面美化、UI布局等众多知识点。
未经本人许可不可将本项目源码扩散,如有发现本人将追究法律责任,谢谢配合。
0.3 相关站点
产品主页:https://blog.csdn.net/feiyangqingyun/article/details/97565652
在线文档:https://feiyangqingyun.gitee.io/qwidgetdemo/video_system/
体验地址:https://pan.baidu.com/s/1d7TH_GEYl5nOecuNlWJJ7g 提取码:01jf 文件名:bin_video_system.zip。
文章导航:https://qtchina.blog.csdn.net/article/details/121327495
0.4 功能特点
0.4.1 软件模块
视频监控模块,各种停靠小窗体子模块,包括设备列表、图文警情、窗口信息、云台控制、预置位、巡航设置、设备控制、悬浮地图、网页浏览等。
视频回放模块,包括本地回放、远程回放、设备播放、图片回放、视频上传等。
电子地图模块,包括图片地图、在线地图、离线地图、路径规划等。
日志查询模块,包括本地日志、设备日志等。
系统设置模块,包括系统设置(基本设置、视频参数、数据库设置、地图配置、串口配置等)、录像机管理、摄像机管理、轮询配置、录像计划、用户管理等。
0.4.2 基础功能
支持各种视频流(rtsp、rtmp、http等)、视频文件(mp4、rmvb、avi等)、本地USB摄像机播放。
支持多画面切换,包括1、4、6、8、9、13、16、25、36、64画面切换。
支持全屏切换,多种切换方式包括鼠标右键菜单、工具栏按钮、快捷键(alt+enter全屏,esc退出全屏)。
支持视频轮询,包括1、4、9、16画面轮询,可设置轮询分组(轮询预案)、轮询间隔、码流类型等。
支持onvif协议,包括设备搜索、云台控制、预置位、设备控制(图片参数、校对时间、系统重启,抓拍图片等)。
支持权限管理,不同的用户可以对应不同的模块权限,比如删除日志、关闭系统等。
数据库支持多种,包括sqlite、mysql、sqlserver、postgresql、oracle、人大金仓等。
本地USB摄像机支持设置分辨率、帧率等参数。
所有停靠模块都自动生成对应的菜单用来控制显示和隐藏,在标题栏右键可以弹出。
支持显示所有模块、隐藏所有模块、复位普通布局、复位全屏布局。
双击设备弹出实时预览视频,支持图片地图、在线地图、离线地图等。
摄像机节点拖曳到对应窗体播放视频,同时支持拖曳本地文件直接播放。
删除视频支持鼠标右键删除、悬浮条关闭删除、拖曳到视频监控面板外删除等多种方式。
图片地图上设备按钮可自由拖动,自动保存位置信息。百度地图上可以鼠标单击获取经纬度信息,用来更新设备位置。
视频监控面板窗体中任意通道支持拖曳交换,瞬间响应。
封装了百度地图,视图切换,运动轨迹,设备点位,鼠标按下获取经纬度等。
双击节点、拖曳节点、拖曳窗体交换位置等操作,均自动更新保存最后的播放地址,下次软件打开自动应用。
右下角音量条控件,失去焦点自动隐藏,音量条带静音图标。
支持视频截图,可指定单个或者对所有通道截图,底部小工具栏也有截图按钮。
支持超时自动隐藏鼠标指针、自动全屏机制。
支持onvif云台控制,可上下左右移动云台摄像机,包括复位和焦距调整等。
支持onvif预置位,可以添加、删除、修改预置位,可以调用起始位。
支持onvif图像参数设置,包括明亮度、对比度、饱和度、尖锐度等。
支持onvif其他操作,包括抓图、网络设置、校时、重启、事件订阅等。
支持任意onvif摄像机,包括但不限于海康、大华、宇视、天地伟业、华为等。
可保存视频,可选定时存储或者单文件存储,可选存储间隔时间。
可设置视频流通信方式tcp+udp,可设置视频解码是速度优先、质量优先、均衡等。
可设置软件中文名称、英文名称、LOGO图标等。
存储的视频文件支持导出到指定目录,支持批量上传到服务器。
完善的录像计划设置,支持每个通道7 * 24小时每半小时设置是否存储录像。
0.4.3 特色功能
主界面采用停靠窗体模式,各种组件以小模块的形式加入,可自定义任意模块加入。
停靠模块可拖动任意位置嵌入和悬浮,支持最大化全屏,支持多屏幕。
双重布局文件存储机制,正常模式、全屏模式都对应不同的布局方案,自动切换和保存,比如全屏模式可以突出几个模块透明显示在指定位置,更具科幻感现代化。
原创onvif协议机制,采用底层协议解析(udp广播搜索+http请求执行命令)更轻量易懂易学习拓展,不依赖任何第三方组件比如gsoap。
原创数据导入、导出、打印机制,跨平台不依赖任何组件,瞬间导出数据。
内置多个原创组件,宇宙超值超级牛逼,包括数据导入导出组件(导出到xls、pdf、打印)、数据库组件(数据库管理线程、自动清理数据线程、万能分页、数据请求等)、地图组件、视频监控组件、文件多线程收发组件、onvif通信组件、通用浏览器内核组件等。
自定义信息框+错误框+询问框+右下角提示框(包含多种格式)等。
精美换肤,高达17套皮肤样式随意更换,所有样式全部统一,包括菜单等。
视频控件悬浮条可以自行增加多个按钮,监控界面底部小工具栏也可自行增加按钮。
双击摄像机节点自动播放视频,双击节点自动依次添加视频,会自动跳到下一个,双击父节点自动添加该节点下的所有视频。可选主码流、子码流。
录像机管理、摄像机管理,可添加删除修改导入导出打印信息,立即应用新的设备信息生成树状列表,不需重启。
可选多种内核自由切换,ffmpeg、vlc、mpv等,均可在pro中设置。推荐用ffmpeg,跨平台最多,默认提供好了linux和mac平台上编译好的库。
支持硬解码,可设置硬解码类型(qsv、dxva2、d3d11va等)。
默认采用opengl绘制视频,超低的CPU资源占用,支持yuyv和nv12两种格式绘制,性能爆表。
标签和图形信息支持三种绘制方式,绘制到遮罩层、绘制到图片、源头绘制(对应信息可以存储到文件)。
高度可定制化,用户可以很方便的在此基础上衍生自己的功能,比如增加自定义模块,增加运行模式、机器人监控、无人机监控、挖掘机监控等。
支持xp、win7、win10、win11、linux、mac、各种国产系统(UOS、中标麒麟、银河麒麟等)、嵌入式linux等系统。
注释完整,项目结构清晰,超级详细完整的使用开发手册,精确到每个代码文件的功能说明,不断持续迭代版本。
0.5 目录说明
本源码项目文件中对编译生成的临时文件和可执行文件做了重定向,可执行文件并不在build开头的目录下,而是在源码同级目录的bin目录下。
config目录放的是软件的配置文件、地图模块需要的图片资源等。
db目录一般有三个文件,key.db是秘钥文件、video_system.db是对应sqlite的数据库文件、video_system.sql是对应数据库脚本(可以在系统设置中数据库管理部分执行脚本用来切换到mysql等其他数据库)。
logo目录存放的各种左上角软件LOGO图片,可以在系统设置中下拉选择。
map目录存放的图片地图模块所用的地图图片文件,可以手动拷贝到此。
sound目录存放的本系统所用的声音文件。
layout目录存放的不同工作模式不同界面对应的布局方案配置文件。
0.6 编译说明
0.6.1 特别提示
本系统没有说基于哪个Qt版本,由于系统中电子地图模块用到了浏览器模块,所以理论上要求你电脑的Qt版本也有浏览器模块才行
如果没有则电子地图模块不可用,但是其余功能全部可用没有任何影响。
本人亲测Qt4.7到Qt6.4之间的所有版本(理论上支持后续所有版本),亲测msvc、mingw、gcc、clang、armgcc各种编译器,亲测xp、win7、win10、linux、mac、树莓派、香橙派、全志H3、cotex-A9、imx6等。
2021-1-6开始集成了miniblink浏览器内核,意味着mingw版本的qt5.6以上版本也全部支持,这样就所有系统都有浏览器模块不需要担心没有电子地图的问题。
部分构建套件可能不支持预编译头,预编译头仅仅是为了加快编译速度,和程序本身无关。比如在win+Qt5.5 5.6就发现不支持,也可能是支持的不够全面,如果编译发生错误可以试着打开pro文件注释掉PRECOMPILED_HEADER = head.h 这行。
Qt6.2的mingw版本的multimedia模块不可用,msvc版本的正常。
开启视频存储后默认存储的MP4格式的文件,如果想要调整体积大小,可以找到core/core_videoffmpeg/ffmpegsave.cpp videoCodecCtx->bit_rate = FFmpegHelper::getBitRate(videoWidth, videoHeight); 将这个码率调小即可,比如 videoCodecCtx->bit_rate = FFmpegHelper::getBitRate(videoWidth, videoHeight)/2; 可以将体积减少一半,相应的画质也会差一些。
推荐用64位的Qt搭配64位的ffmpeg,目前绝大部分系统都是64位的,能获得最大性能提升,本人亲自对比测试32位和64位,64位无论资源占用和操作响应等体验都更优。尤其是开启硬解码后,如果64个通道都需要硬解码,32位的测试下来貌似资源不够用。
如果更改appconfig.cpp中的值发现没有变化,那是因为里面的值是用来默认生成配置文件的值,如果配置文件已经存在,则对应变量是从配置文件读取的值,如果想要更改后的默认值生效,需要删除配置文件(config/video_system.ini)重新打开程序即可。
0.6.2 注意事项
可执行文件在源码同级目录的bin目录下。
编译完成后记得将源码下的file目录下(切记是file目录下而不是file目录)的所有文件复制到可执行文件同一目录。
如果开启了视频监控(默认开启),则记得将对应的动态库文件复制到可执行文件同一目录。比如采用ffmpeg内核(默认就是ffmpeg)的话,则将下载到的dll_ffmpeg4下的所有文件复制到可执行文件同一目录。
各个操作系统的ffmpeg和vlc编译好的动态库以及miniblink的动态库下载地址。
+https://pan.baidu.com/s/13LDRu6mXC6gaADtrGprNVA 提取码: ujm7。
如果是64位的qt则对应的dll时候拷贝dll_ffmpeg4_64目录下的。
如果使用的ffmpeg3则对应dll目录就是dll_ffmpeg3,在core_videoffmpeg.pri文件中可以看到具体启用的是ffmpeg3(支持XP)还是ffmpeg4(不支持XP),默认是ffmpeg4。
如果编译运行提示miniblink文件不存在请先拷贝,则说明你当前用的Qt版本没有浏览器模块,要么没安装,要么不支持,你也不用担心啥,此时自动切换用的miniblink浏览器内核,你还需要将ffmpeg库下载的网盘的地方找到dll_miniblink.zip下载解压到可执行文件同一目录即可。
系统中所有的图标,都采用的图形字体,对照表在doc目录下的FontAwesome.png、FontAliBaBa.png,对应图形字体类IconHelper中加载的图形字体,后期如果还有增加的其他图形字体也是放在这里,一个类支持多种图形字体,通过不同的值范围自动设置。
如果发现地图打不开或者提示秘钥文件丢失,请先确认file目录下的所有文件有没有拷贝过去。
如果是用vs+qt可能报错 error LNK2026,解决办法详细见本文档中13其他说明/13.5环境使用qt+vs。
默认用户名admin 密码admin。
系统配置参数在加载的时候会对节点值进行过滤判断,如果为空会自动用初始值生成新的配置文件,如果不想要显示版权所有公司,可以填xxx而不是删掉整个值。
如果是用vlc推流的rtsp地址,比如 rtsp://:8554/aabb,由于vlc推流默认写死的采用的udp协议,所以监控系统也必须在系统设置中通信方式选择udp才行(默认tcp)。
0.6.3 离线地图
离线地图可以用网上的瓦片地图下载器下载百度的离线地图放到对应目录即可。
也可以直接下载网盘中已经下载好的上海市的离线地图。
下载地址:https://pan.baidu.com/s/1ZxG-oyUKe286LPMPxOrO2A 提取码:o05q 文件名称:bin_map_tiles.tar.xz
使用说明
将压缩包下的两个文件夹复制到对应可执行文件下的config文件夹下,和map.js文件同一级目录。
tiles文件夹是街道图,tiles_hybrid文件夹是卫星图,tiles_self是路网图,路网图和卫星图合并就是混合图。
默认提供的是上海市徐汇区的瓦片地图,如果自己用万能地图下载器下载的百度地图的瓦片文件,也可以对应替换就行。
要注意的是格式,默认是jpg,如果下载的瓦片地图格式是png则需要打开config文件夹下的map_load.js文件,将.jpg改成.png保存即可。
0.7 视频格式
0.7.1 本地摄像头
下面假定本地摄像头的设备名为 USB2.0 PC CAMERA。
win系统如何查看设备名见本文档中13其他说明/13.7打开本地摄像头。
linux系统查看设备名直接执行命令 ls /dev/video * 即可,一般对应的设备名是 /dev/video0。
写法1:video=USB2.0 PC CAMERA,这种写法默认按照640x480分辨率打开摄像头。
写法2:video=USB2.0 PC CAMERA|1280x720|30,这种写法按照指定的分辨率1280x720以及采集帧率30来打开摄像头。
写法3:video=/dev/video0,这种是对应linux系统,程序内部会自动过滤和调整填入的地址。
如果指定了分辨率和帧率则需要硬件支持才行,比如摄像头的最大分辨率是640x480,而指定了1280x720则会打开失败。
0.7.2 电视频道
中央综合:http://39.135.138.60:18890/PLTV/88888910/224/3221225618/index.m3u8
中央新闻:http://39.135.138.60:18890/PLTV/88888910/224/3221225638/index.m3u8
中央音乐:http://39.135.138.60:18890/PLTV/88888910/224/3221225641/index.m3u8
中央电视:http://39.135.138.60:18890/PLTV/88888910/224/3221225635/index.m3u8
中央记录:http://39.135.138.60:18890/PLTV/88888910/224/3221225646/index.m3u8
中央少儿:http://39.135.138.60:18890/PLTV/88888910/224/3221225639/index.m3u8
湖南卫视:http://39.135.138.60:18890/PLTV/88888910/224/3221225745/index.m3u8
深圳卫视:http://39.135.138.60:18890/PLTV/88888910/224/3221225741/index.m3u8
上海纪实:http://39.135.138.60:18890/PLTV/88888910/224/3221225654/index.m3u8
天津卫视:http://39.135.138.60:18890/PLTV/88888910/224/3221225739/index.m3u8
0.7.3 视频文件
万能办法,用谷歌或者谷歌内核的浏览器,打开时光网 http://www.mtime.com/ ,随便打开个视频,这里一般是预告片,按F12切换到审查元素,顶部切换到网络,选中媒体,刷新网页,按照尺寸排列,最大的那个MP4文件就是,鼠标右键复制地址,这个地址就是完整的网络地址。
http://vfx.mtime.cn/Video/2021/11/16/mp4/211116131456748178.mp4
http://vfx.mtime.cn/Video/2023/03/09/mp4/230309152143524121.mp4
http://vfx.mtime.cn/Video/2023/03/07/mp4/230307085324679124.mp4
http://vfx.mtime.cn/Video/2022/07/18/mp4/220718132929585151.mp4
http://vfx.mtime.cn/Video/2022/12/17/mp4/221217153424902164.mp4
http://vfx.mtime.cn/Video/2022/07/04/mp4/220704110656040153.mp4
http://vfx.mtime.cn/Video/2021/02/08/mp4/210208150307073134.mp4
http://vfx.mtime.cn/Video/2021/05/11/mp4/210511114524329144.mp4
http://vfx.mtime.cn/Video/2021/04/20/mp4/210420113022586184.mp4
http://vfx.mtime.cn/Video/2021/03/13/mp4/210313111010421158.mp4
http://vfx.mtime.cn/Video/2020/01/15/mp4/200115125943120574.mp4
百度视频
https://vd2.bdstatic.com/mda-nhpqy7k8xamgiqw3/720p/h264/1661362621500413748/mda-nhpqy7k8xamgiqw3.mp4
https://vd2.bdstatic.com/mda-nhp9zvu4tiinsp7z/576p/h264/1661324637707658476/mda-nhp9zvu4tiinsp7z.mp4
https://vd4.bdstatic.com/mda-nhp77xn7fx3e0jgb/576p/h264/1661317610850513689/mda-nhp77xn7fx3e0jgb.mp4
https://vd2.bdstatic.com/mda-nhp72n8xvbtdcmcq/576p/h264/1661317214259599500/mda-nhp72n8xvbtdcmcq.mp4
https://vd2.bdstatic.com/mda-nhp6z0in87tvw77v/576p/h264/1661316943890074768/mda-nhp6z0in87tvw77v.mp4
http://vd3.bdstatic.com/mda-jennyc5ci1ugrxzi/mda-jennyc5ci1ugrxzi.mp4
时间很短的视频文件
https://highlight-video.cdn.bcebos.com/video/6s/95ae2066-ee02-11ed-9f01-6c92bf5ceb6f.mp4
https://highlight-video.cdn.bcebos.com/video/6s/1a74a352-d1fb-11ed-829b-6c92bf468c1f.mp4
https://highlight-video.cdn.bcebos.com/video/6s/e0d35168-edf5-11ed-8709-6c92bf3b0281.mp4
https://highlight-video.cdn.bcebos.com/video/6s/0757f6ec-ee03-11ed-85d3-6c92bf3b0af4.mp4
https://highlight-video.cdn.bcebos.com/video/6s/6ffb9cbe-ee01-11ed-916c-6c92bfb45e04.mp4
0.7.4 网友提供
下面的地址几乎都失效
rtmp://live.yihtc.com:10935/hls/stream_3
rtmp://live.yihtc.com:10935/hls/stream_13
rtmp://218.3.205.46/live/ggpd_sd
rtmp://hls.hsrtv.cn/hls/hstv2
rtmp://hls.hsrtv.cn/hls/hstv1
rtmp://222.173.22.119:1935/live/jnyd_sd
rtmp://222.173.22.119:1935/live/xwhd_hd
rtmp://livetv.dhtv.cn:1935/live/peoples
rtmp://livetv.dhtv.cn:1935/live/citylife
rtmp://livetv.dhtv.cn:1935/live/financial
rtmp://livetv.dhtv.cn:1935/live/news
0.7.5 监控设备
下面列出的是一些常用厂家的格式,不同厂家格式不一样,具体什么格式请咨询厂家索要对应的视频流格式,或者设备支持onvif的话,通过onvif工具搜索可以拿到视频流格式。
0.7.5.1 海康
实时预览格式:rtsp://admin:12345@192.168.1.128:554/Streaming/Channels/101?transportmode=unicast
视频回放格式:rtsp://admin:12345@192.168.1.128:554/Streaming/tracks/101?starttime=20120802t063812z&endtime=20120802t064816z
流媒体视频流:rtsp://172.6.24.15:554/Devicehc8://172.6.22.106:8000:0:0?username=admin&password=12345
日期时间格式:ISO 8601 表示Zulu(GMT) 时间 YYYYMMDD”T”HHmmSS.fraction”Z”,
单播多播说明:unicast表示单播,multicast表示多播,默认单播,可以省略。
通道码流说明:101,1是通道号,01是通道的码流编号,也可以是02、03,第2通道主码流=201,第16通道子码流=1602,依次类推。
0.7.5.2 大华
实时预览格式:rtsp://192.168.1.128:554/cam/realmonitor?channel=1&subtype=0&unicast=true&proto=Onvif
视频回放格式:rtsp://admin:12345@192.168.1.128:554/cam/playback?channel=1&subtype=0&starttime=2021_03_18_11_36_01&endtime=2021_03_18_12_05_01
格式内容说明:channel表示通道,subtype表示码流编号,日期时间字符串非常明确。
0.7.5.3 常规
实时预览格式:rtsp://admin:12345@192.168.1.128:554/live?channel=1&stream=1
视频回放格式:rtsp://admin:12345@192.168.1.128:554/file?channel=1&start=1494485280&stop=1494485480
其他通用格式:rtsp://admin:12345@192.168.1.128:554/0 0-主码流 1-子码流
日期时间说明:先转换时间戳,1970年到该时间经过的秒数。
0.8 版本说明
0.8.1 精益求精
后期规划
摄像机信息表的用户信息字段用起来,视频流地址不带用户信息,主动加入用户信息构建最终地址应用。
用户密码密文存储,防止泄露。
V20230611
增强解码的健壮性,比如在ffmpeg中未找到对应的解码器,取消对应视音频的处理,比如没找到G.722.1的音频解码器(AV_CODEC_ID_NONE),则不处理音频数据,直接保留处理视频数据即可。
V20230605
内核ffmpeg保存视频类增加超时判断。
内核ffmpeg所有类打印错误信息参数增加带上错误码和错误详情,方便分析问题。
内核ffmpeg改进硬解码格式的合法性检查。
修复默认传入静音状态除了ffmpeg内核外其他内核没有生效的BUG。
标签文字水印增加了图形字体的支持,极大的丰富了文字水印的内容,可以将各种图形图案以文字的形式绘制到原图中。文本绘制的性能比图片高很多,可以将方框等各种图形转换成图形字体再以水印加到原图中。
内核ffmpeg增加硬解码失败自动转软解码策略。
内核ffmpeg增加图片滤镜功能,和之前各种文字水印和其他滤镜一起(文字水印和图片水印叠加功能折腾很久)。
重写保存视频线程,支持音视频同步合并保存到MP4文件,保存线程可选是否强制编码还是源数据保存。强制编码会增加CPU占用,但是有些情况必须强制编码,比如非264格式需要推流,重新改变保存文件体积大小,将OSD标签和图形信息存入文件或推流等。
内核ffmpeg保存视频支持不编码(源头是h264/h265+aac)、部分编码(参数指定视频或者音频编码)、完全编码(所有格式不符合则强制编码)等三种组合。
修复如果文件名称为rtmp/rtsp/http开头的时候地址类型解析不正确的BUG,要用rtmp://这种开头判断。
内核ffmpeg增加编码策略选项,可选自动(非264/265/aac则转码)、仅限文件(文件类型则转码)、所有转码,默认选择自动处理,可以大大节约CPU资源占用。
改进策略当选择最快速度播放的时候,文件类型的也全力解码数据并显示,不做任何的同步和延时。这样可以测试本机最大的解码能力。
V20230522
组件onvif增加时间差值计算,有些设备在发送鉴权数据的时候需要以设备的时间为准,而不是以onvif客户端为准,很多设备可能时间在1970年或者2000年,意味着发送鉴权的时候对应时间要1970年或者2000年,不然会鉴权失败,所以在首次鉴权的时候需要获取设备的时间(主动设置时间后也需要获取一次),计算时间差值,下发鉴权的时候主动加上这个差值。
内核ffmpeg增加对指定窗口标题的窗口进行录屏,目前测试下来只支持英文的标题。
修复短时长(5s)视频文件播放在关闭的时候可能崩溃的BUG。
保存视频文件增加首帧必须关键帧的过滤,保证保存的视频文件在任何地方打开都不会绿屏。这个过滤机制会导致保存的视频文件缺少开始部分的帧,比如摄像头设置的I帧(关键帧)间隔是50则最大可能接近2s的帧丢失,这个丢失无法避免,因为开头部分的非关键帧无法正确计算得到完整的图片。
修复了开启了录像计划下,双击打开父节点视频后,录像计划线程停止后未开启的BUG。
视频回放查询功能增加过滤正在写入的文件,不要放入到文件列表。
修复部分265编码的视频流保存的时候时长不正确的BUG,因为视频流有平均帧率和基本帧率,保存的时候取基本帧率。
配置参数增加opengl类型选择,可选AA_UseOpenGLES防止有些电脑显卡驱动版本不够或者硬件显卡不支持的情况,启用AA_UseOpenGLES以后也可以正常使用opengl用来绘制视频数据。
增加用户没有填经纬度时自动以地图中心坐标为准的处理,防止没有经纬度坐标导致地图加载失败。
增加低分辨率下默认隐藏OSD标签管理悬停模块,该模块对界面高度有要求导致把整个界面撑起来而看不到底部。
V20230510
增加文字水印单独示例,专门演示如何添加日期时间标签,文字标签,指定标签更新内容,以及显示实时码率文字水印。
内核ffmpeg增加实时码率计算,发出结果信号。
增加了OSD标签格式日期时间带毫秒枚举值。
增加统计实时码率开关,开启后,在人工智能开关开启状态下,会将实时码率信息以文字水印OSD的方式贴到视频上。
文字水印演示字体大小改成了以视频宽度比例为准,以便保证字体足够大能够看清。
内核ffmpeg增加保存视频压缩比率参数,可根据网络带宽需求调整清晰度,包括保存的视频文件大小和推流占用带宽。
增加保存视频压缩比率参数,可控保存后视频文件体积大小(只针对需要重新编码的场景)。
增加多镜头多通道摄像机的支持,有些摄像机带了多个镜头,每个镜头对应一个通道。
内核ffmpeg增加只推流的情况下手动切换实时预览(需要解码才能预览/推流不需要解码也可以推流/以便最小占用CPU)。
V20230416
新增桌面录屏的支持,包括ffmpeg、vlc、qtav、easyplayer等内核。
桌面录屏可指定录屏区域位置。
完善easyplayer内核对各种视频流的支持。
重新优化视频类型的判断,http开头的地址可能是文件也可能是视频流,以最终时长作为判断依据。
增加了H264裸流视频文件倍速播放。
内核ffmpeg增加发送packet帧信号,一般用于推流的同时保存视频文件需要。
模块onvif增加osd相关处理,可以获取所有osd,并执行添加、删除、修改操作。
增加OSD管理悬停模块,可以增删改查OSD相关信息。
V20230323
onvif模块增加获取mac地址。
所有监控内核增加矫正视频类型,比如http开头的有文件长度的则强制设置为filehttp类型,方便后期其他判断处理。
新增主动设置文件时长和播放进度的函数,以便事件回调那边主动设置。
修复ffmpeg内核部分视频文件当分辨率不是常规分辨率时(比如分辨率426x240)回调取出图片不正确的BUG,转换需要做字节对齐设置,现在约定统一用4字节对齐,这样兼容了所有可能的分辨率。
修复ffmpeg内核在高倍速比如5倍速播放情况下,如果解码来不及导致播放进度计算不正确的BUG。
增加对http开头的地址对应视频类型的判断,有些是视频文件(有时长并且可以切换播放进度),有些是实时视频,尽管地址格式都是 http://xxxxxx/xx.m3u8 这种。
V20230201
新增天气预报模块开关。
海康内核增加手动指定端口解析。
更新onvif相关处理,支持内网摄像头通过路由器端口映射公开到外网,以外网的IP地址形式访问。
设备搜索模块在单播的时候增加厂家为空则先获取设备信息获取到制造商名称并自动填入。
内核vlc增加图片和文字水印功能,从源头处理。
内核mpv增加文字水印功能。
内核ffmpeg增加网络访问视频文件头部消息user_agent=Mozilla,有些视频网站根据这个头部消息过滤不让ffmpeg访问。
onvif单播搜索增加指定地址不存在的过滤。
增加对显卡禁用环境的识别,自动切换采用Qt::AA_UseOpenGLES,否则在禁用显卡环境中无法正常使用opengl。
增加当处于OpenGLES绘制下自动将硬解码改成none,防止无法正常显示视频画面。
onvif组件搜索功能增加错误提示,比如绑定组播失败、单播地址不通等提示。
无人机移动演示模块增加过滤,还没有初始化好就不触发js交互。
增加对虚拟机环境的识别,自动切换采用Qt::AA_UseOpenGLES,否则在虚拟机中硬解码下无法使用AA_UseDesktopOpenGL。
录像计划批量按钮增加先清空再批量,否则通道数不一致。
本地回放等界面增加全选、全不选按钮,用于对查询出来的视频文件全部选中和不选中。
打包文件增加了wenquanyi.ttf字体文件,由于ffmpeg用到了滤镜,为了支持中文正确显示,依赖指定的中文字体文件,放到可执行文件同一目录即可。
V20230108
内核ffmpeg实现了各种OSD标签和图形直接绘制到帧上,保存也带了对应的标签信息,之前是绘制在遮罩层上。
内核ffmpeg带旋转角度的视频旋转采用滤镜实现,之前是通过算法转换。
修复图文警情在清空后重新添加警情的时候最底部一个item可能高度不对的BUG。
批量添加NVR通道改进编号和摄像头名称策略,编号为NVR地址的后两个网段的值加上3位通道字符串,名称为通道001/通道002依次下去。这样符合现场跨网段的场景,一般现场有N多摄像机和NVR,很多都是跨网段的场景。
地图上设备单击弹出视频预览增加过滤,限制双击只允许单击。
增加配置参数控制设备树是否显示主码流子码流节点。
增加配置参数双击打开分组最大数量,0-最大通道数量 1-当前通道数量 2-自动调整数量。
增加配置参数记录最后展开的设备节点,下次打开自动应用。
V20221212
改进实时监测设备在线情况逻辑,之前是一次性所有的处理,改成了排队处理,每次间隔0.1s,同时处理完一个来回后休息5s,这样在设备数据很多的时候尤其有效。
视频参数设置中新增离线检测开关和报警视频存储时间下拉框选择。
设备播放模块增加添加完一个通道后自动切换到下一个通道。
将批量添加单独做成窗体,通用于轮询管理和摄像机管理,可以很方便的批量添加摄像机,录像机通道递增等各种智能规则。
打开弹窗视频增加在线判断,没有开启在线检测则先检测再判断是否需要弹窗。
纠正图片参数调节中饱和度和对比度界面上名称标识写反了的BUG。
V20221207
报警事件抓图后添加到图文警情,改成线程排队处理,之前在主线程处理,如果有多个同时,很可能卡主界面,而且还要等待抓图的文件生成才能正确显示图片。
新增警情字典表config/event.txt,格式 1,IsMotion,移动报警,移动结束 ,分别表示 事件等级/唯一标识/报警字样/解除字样 ,这样大大增强灵活性,每个不同厂家的设备可能有不同的关键字表示不同的警情,用户只需要在字典表中编辑好即可。
内核vlc彻底解决回调模式下视频流需要手动指定的问题,改成了在播放后拿到分辨率后去设置回调数据,完美解决。
修复内核vlc中打开视频流后多次触发读取媒体信息的BUG,包括中途视频流发生变化也会多次触发。
修复悬停模块透明度值应用不及时的BUG。
图文警情双击显示原图增加自适应图片大小策略,并限定最大分辨率。
增加了左右通道音频振幅分别计算,之前混在一起计算。单通道的则左右一样。
视频预览窗体增加自适应视频大小策略,并限定最大分辨率。
新增将选择的软件图标作为全局的左上角图标,选择后立即应用。
修复在共享解码线程中再次打开弹出的视频窗体声音大小和静音状态不一致的BUG,改成了和原共享解码线程一致。
弹出窗体自适应最大尺寸,如果视频尺寸超过了最大尺寸则等比例缩放到合适尺寸。
报警事件抓图按照日期文件夹存放,之前存放在image_alarm目录下挤在一起,多了就很难看。
新增每个视频控件都有共享解码属性,每个控件都可以控制是否需要共享解码,之前是统一全局的属性,有时候需要单独弹出的报警视频独立处理以及存储录像,此时就需要指定该控件不共享解码,极大的增加了自由度。
修复清空录像机信息后,设备列表无法正常加载的BUG,改成了自动生成一个默认的分组。
新增半透明轮询分组提示标签窗体,在轮询启动后显示停止轮询后隐藏,可以拖动到合适位置,自动记忆最后的位置。方便在全屏轮询阶段告知用户当前轮询到哪里。
增加开关量报警弹出报警视频,并录像存储,可在视频回放中查询对应的报警视频并回放。
报警视频弹窗窗体标题栏,如果指定了存储报警录像,则显示关闭倒计时字样。
修复在打开了未连接的视频通道,通道处于不断重连中,单击轮询崩溃的BUG。
onvif组件增加唯一标识,打印信息更清晰,带上唯一标识和设备IP地址。
V20221125
onvif搜索增加超时时间参数,经过大量的现场应用反馈,少部分厂家的设备,在极端的网络环境中,返回的数据要慢,需要把之前写死在代码中的超时时间放出来作为参数设置可调节。
视频参数增加悬浮工具栏位置参数,可以设置视频控件的悬浮条位置在顶部、底部、左侧、右侧四个位置。
解决Qt6.4及以后版本比如Qt6.5上minibink和opengl冲突导致opengl黑屏的bug,此问题找了很久发现原来是和miniblink冲突了,改成了异步加载miniblink浏览器控件即可,代码 QMetaObject::invokeMethod(this, "initWebView", Qt::QueuedConnection);
对不启用任何解码内核增加过滤,没有指定内核则不用启动解码线程。
测试发现Qt6.4.1版本音频播放有问题,会打印 qt.multimedia.audiooutput: Failed to setup resampler ,确认过是官方新增的bug(https://forum.qt.io/topic/140523/qt-6-x-error-message-qt-multimedia-audiooutput-failed-to-setup-resampler/5),用最新的6.5版本即可,总之不要用6.4.1。
使用示例增加音频频谱示例。
使用示例增加拖曳播放示例。
系统设置增加音频振幅开关,开启后视频右侧都会显示左右通道额音量条。
初始化结构体参数增加过滤机制,地址为空的不处理。
新增了视频通道拖动配置参数,可控是否允许拖动交换通道,防止误操作。
增加根据视频控件的高度自动调整音量条格子数量,比如4通道60个格子,64通道20个格子,保证音量条自适应。
音量条的圆角角度、格子高度、边距、间距等参数可自由设置。
静音状态约定只是声音不发送给音频输出设备播放,音频数据正常解析,包括音频频谱正常显示。
增加根据视频控件的宽度自动调整音量条的宽度,比如4通道的时候音量条可以宽一些,64通道音量条可以窄一些。以便留出更多的空间给视频显示而不会显得很拥挤。
增加根据视频控件的宽度自动设置悬浮条提示信息是否需要显示,宽度不够则不显示,比如悬浮条设定显示在左侧右侧由于宽度不够也不显示提示文字信息。
增加报警事件抓图显示在图文警情中。
增加udp://开头的视频流强制采用udp协议解析。
修复重连后默认的音量大小以及静音状态不正确的BUG。
V20221121
新增图形字体文件可编辑,可以根据需要添加自己的图标到iconfont.ttf字体文件,需要借助fontcreator工具。
新增部分图标,把底部通道1-通道64的图标换成了数字模样的,整齐统一容易拓展。
修复ffmpeg内核声音播放的时候遇到标题栏或者UI按下卡住停顿0.5s的BUG,改成了线程中播放音频,无论UI如何卡丝毫不影响。
视频回放增加手动停止按钮以及静音切换按钮。
增加ffmpeg内核声音解码过滤,部分摄像机的音频流如果是48000采样会导致转换失败,增加过滤处理。
修复应用最后的音量大小和静音状态时候在ffmpeg内核下有时候不成功的BUG。
实时检测摄像机是否在线,增加其他端口的识别,默认554端口,也可能有其他端口。
改进默认音量大小和静音状态设置逻辑,如果采用QAudioOutput播放音频则初始化的时候传入对应参数,如果是内核自带声音静音接口的则在打开成功以后主动去设置默认的音量大小和静音状态。
本地回放增加停止播放和静音切换图标按钮,并优化对应的处理逻辑。
修复qmedia内核静音切换对应标志位没有改变的BUG。
对视频监控控件新增获取是否暂停状态、音量大小、静音状态等函数。
本地回放新增当用户按下播放按钮右侧又选择了对应的文件则自动触发双击播放。
修复本地回放中停止播放后当还不是末尾一个视频文件时还会自动播放下一个的BUG,因为有自动播放机制,需要增加标志位判断,只要按下过停止按钮则无需自动播放。
修复ffmpeg内核在快速拖动进度条期间切换播放进度后小概率出现播放暂停的BUG。之前复用的暂停标志位,由于很多地方用到并且可能修改了暂停标志位导致恰时间点的不正确,新增了切换进度标志位,专用于切换进度判断,完美解决。
增加onvif指令过滤重复机制,当队列中有相同的onvif地址和指令的时候,不需要加入队列。
内核ffmpeg增加了实时码率的计算,统计的一个周期内(帧率25就统计25个包)所有视频数据包的总大小。
重新更新全部说明书,包括截图和文字说明。
V20221116
每个视频控件都可以手动开启和停止录像,开启的时候传入文件名即可。
修正视频控件边框大小计算当尺寸为奇数的时候不准确的情况,增加了偏移1个像素处理非常完美。
修复ffmpeg内核打开视频流中途分辨率变化后计算不正确的BUG,中途分辨率调整后策略改成重新打开。
修复ffmpeg内核在暂停阶段切换播放进度后会继续播放的BUG,应该是要继续处于暂停播放。
解码线程基类、保存线程基类都增加全局静态变量控制是否打印消息,由于解码线程等类中要打印的信息特别多,可以在需要的时候开启,几乎每一个重要的步骤或者可能出错的地方都会有对应打印信息,方便跟踪查找问题。有时候想关注其他地方的打印信息,为了避免给解码线程的打印信息冲掉,尤其是通道数量多的时候,信息类似涌过来,此时可以关闭解码线程的打印信息,专注于其他打印信息。
视频配置参数这块很多参数的设置改成了立即应用,比如边框大小、图片显示策略等,不能立即应用的也可以通过主界面中的停靠窗体设备控制单击刷新通道来应用。
录像计划改成了立即应用,添加、删除、修改后都会立即更新录像计划到视频管理线程类。
视频回放中的日期选择范围,改成了精确到分,无需精确到秒。
视频回放增加了倍速选项,可选0.5/1.0/2.0/4.0/8.0等倍速。设置完立即应用,下一个自动播放的也会立即应用该倍速。
视频管理线程类对切换保存文件的时间的精准度做了调整,比如30分钟一个文件,文件的时间是12:00:00到12:29:59,12:30:00到12:59:59,整半点开始,59秒结束。
目前的视频存储策略是中间存储的保证是30分钟的一个文件,头部和尾部,因为开启录像或者结束录像的时间未必是整半点,所以可能产生的录像文件的时间不一定的30分钟一个。
经过详细测试对比,如果是视频流,开启了变码流则视频大小未必一样,如果是定码流则几乎一样,变码流则文件大小相差比较大,视频中动静变化比较大或者颜色比较多的文件体积更大。
同样分辨率的视频流,用H265编码生成的视频文件体积比H264小很多(同一个摄像头同样主码流分辨率切换到H265存储体积大概是普通H264的40%,还有其他H264H/H264B之类的没有具体对比测试),本系统中的策略是源头是H264的就采用H264编码,源头是H265的就用H265编码存储。这样可以不用转码大大减轻CPU运算压力。
录像文件存储以本地时间为准,如果设备的时间和本地时间不一致,可能会看到摄像头视频文件上显示的时间和要求的时间不一致,在开启了onvif校时的情况下,大概会有3s左右的偏差,也就是说录像文件上显示的时间可能是走到10:30:03才结束,如果时间完全一致则应该是10:29:59。
增加目标秒数核对以便尽量保持录像时间以59秒结束,可以自行更改该目标秒数值保持一致。
所有下拉框中的通道字符串为了整齐统一改成了两位字符串比如 通道01、通道05、通道16,除了主界面通道文字是 通道1、通道5、通道16字样,其余全部两位。
V20221111
新增录像计划,增加录像任务计划控件,支持星期一到星期日每天24小时勾选是否录像,精确到30分钟间隔。
任务策略表格支持直接右键菜单全部选中、反向选中、清空选中操作。
新增录像计划表RecordInfo,对应字段RecordCh表示通道0-64,RecordWeek1-RecordWeek7表示星期一到星期日的录像计划字符串表示,通过占位符表示该30分钟时间内是否录像,每天有48个小格式。
通道唯一标识统一ch01到ch64字样,录像文件以及截图都按照这个作为文件的前缀,方便查找。
调整了一个设备多路通道(比如NVR或者部分相机)搜索的结果组合的策略,以便配置成多个不同的通道。大部分厂家的规则是每个通道一路主码流一路子码流,依次顺序存放。
录像计划新增批量一键添加64通道7 * 24小时录像,绝大部分时候都是这个情况所以可以一键添加,添加好以后有特殊的可以自行调整。
演示示例demo新增了配置参数保存对应选择的视频地址。
视频参数设置做了重大调整,按照新的解码内核来设计,更合理更贴切,把一些不需要的删除了。
V20220918
构思和编码及测试花了一年时间,将所有视频监控内核重新架构重写,抽象视频解码线程类和视频窗体展示类,着重解决了视频解码线程复用。具体可参见文档中的内核模块说明。
视频复用技术难点
通道1打开视频流A,通道2也打开视频流A,通道3也打开视频流A,此时通道1负责打开视频流A,其他两个通道公用通道1的视频流数据。
通道1关闭视频流A(仅仅是关闭映射,不能关闭视频流),通道2关闭视频流A(仅仅是关闭映射,不能关闭视频流),通道3关闭视频流A(关闭映射+关闭视频流)。
首次打开视频流地址的通道负责打开视频流。
末次关闭视频流地址的通道负责关闭视频流。
主要改进功能点
共享解码线程,相同地址的已经打开过的,直接复用,大大减轻网络流量和推流设备的压力。
动态内核挂载,解码和展示分离,通过基类的公共接口设计,视频控件可以任意动态挂载任意的解码内核,在打开的时候指定即可,内部会根据指定的内核自动实例化对应解码线程解码。
悬浮工具栏控件,各种颜色设置,包括透明度,位置可以上下左右,内容可以自定义。单击事件发信号,常用的录像、抓图、静音、关闭等按钮内置了实现,其余自定义按钮可以自行拿到信号做处理。空白处显示对应通道的分辨率、录像状态等信息,提供接口设置对应提示信息。
自定义标签OSD,任意多个,有多种类型和属性参数。
自定义图形,任意多个,直接绘制到原图上,有多种类型和属性参数。
视频控件基类,参数极其丰富,包括边框大小、边框颜色、焦点颜色、背景颜色、文字颜色、填充颜色、背景文字、背景图片、是否拷贝图片、缩放显示模式、视频显示模式等。
解码线程基类,参数极其丰富,包括解析内核、视频地址、缓存分辨率、解码策略、硬件加速、通信协议、缓存时间、循环播放、读取超时时间、连接超时时间等。
除了常规的视频文件、网络文件、视频流,还支持本地摄像头、旋转了90度的手机视频文件、非H264的文件自动转码显示。
对ffmpeg内核做了极度优化,支持音频视频文件保存,之前只支持rtsp视频流,而且生成的文件不标准没有文件属性分辨率信息等。
统一的打印格式,完整的信号通知,友好的接口设计。
0.8.2 破茧成蝶
V20220625
在之前支持NVR所有通道批量添加基础上,增加自动添加NVR信息到表,这样每个NVR都会自动添加,如果有手动添加好的则取添加好的,以IP地址为准。
修复设备在线状态处理,在同一个NVR下IP地址相同的不同通道视频,不会处理在线状态的BUG。
修复在postgresql数据库和oracle数据库下,QSqlTableModel对应setTable设置表名严格区分大小写的BUG。
测试发现有些很老的设备支持的是onvif1.0,云台地址需要用getCapabilities才能拿到,改进这个处理,兼容任意版本。
V20220612
修复qss中分组框QGroupBox标题位移的BUG,在linux系统表现不统一。
改进同样的内容导出到pdf和打印显示效果不一致的情况,统一设置分辨率为96。
摄像机管理增加多选删除,删除的时候除了删除摄像机表中对应记录,也同时删除轮询信息表中的记录。
初始化数据库按钮增加弹框确认,由于这个操作安全级别非常高,增加弹框确认很有必要。
所有QTableView+QSqlTableModel对应的保存按钮代码增加主动设置焦点,避免mac系统中当单元格处于编辑状态,再去单击保存按钮,数据依然是之前的数据的BUG。
样式表全局颜色增加悬停背景颜色QUIConfig::HoverBgColor和选中背景颜色QUIConfig::SelectBgColor用于自定义委托。
对于加深的样式,重新设置单元格等item选中和悬停颜色 默认悬停-DarkColorEnd 选中-NormalColorEnd,加深颜色设置为相反。
增加全局参数控制是悬停颜色覆盖选中颜色还是选中颜色优先,默认选中颜色优先,这样选中的item鼠标移上去不会改变掉颜色。
增加过滤同名的NVR,之前会重复加载,现在限定同名的只加载一个,要求整个系统中NVR的名字必须唯一。
轮询管理中增加摄像机表的过滤条件,启用了的才显示在表格中。
增加播放记录开关,用于软件启动后,是否从播放记录url.txt读取历史记录进行播放。
增加播放记录url.txt过滤机制,只有摄像机表中存在且启用过的才可以播放。也可以改成只对rtsp开头的进行过滤。
增加选择列表通道的时候自动选中视频通道,高亮显示,这样很明确知道选择的哪个,同理,选中视频通道也高亮选中列表通道。相当于通道选中和列表选中联动。
增加设备列表在线离线不同图标显示,目前只对rtsp地址开头的进行实时监测上线离线状态,其他全部永远当做在线。离线图标颜色取系统设置中的报警图标颜色。
增加设备在线状态字段列表,实时监测设备状态期间先判断状态是否发生变化,只有发生变化了才需要去调用对应函数处理,大大减少无效的多余的处理。
修复设备列表双击空白处崩溃的BUG,需要过滤空节点item。
增加表格策略,单选按下编辑、多选双击编辑,有些用户需要多选摄像机列表删除。
V20220515
将用户退出中的退出系统权限验证去掉,理论上对退出系统这个限制没啥意义,还可以通过任务管理器强制关闭进程。
将退出系统的权限名称改成调整布局,没有调整布局权限则不能调整拖动停靠窗体位置等。
视频面板窗体对象指针放到了全局静态变量,这样很多地方可以直接使用,比如声音控制、布局调整、视频轮询等。这样就不用繁琐的信号槽切换,可以省略很多不必要的代码,性能更高。
修复静音状态下调整音量可能不正确的BUG,静音状态下只改变音量值变量而不是正常改变音量。
实现右下角音量面板静音切换、音量值调整,全局视频控件应用。
改进默认地图算法,取第一个有背景地图的设备的图片作为默认图片,可能默认图片不存在则取图片列表中的第一张。
修复ffmpeg内核回调模式自动重连崩溃的BUG,此时图片不存在应该置为空。
增加识别秘钥有限制后限定标题栏带试用字样。
重写通用的视频地址类videourl,将通道改成0开始,分隔符改成英文逗号,视频地址集合通过指定枚举值选择不同类型添加。
增加自动插入临时消息到数据库用户操作记录,增加参数控制是否需要显示临时消息的时候插入。
V20220413
修复视频控件设置自定义背景颜色的时候,没有考虑边框的范围问题。
选项卡样式去掉悬停样式,经过观察对比Qt自带的样式都是没有悬停样式,直接是选中样式。
修复自定义委托复选框不居中的问题,之前计算不准确会有细微偏差。
自定义委托增加悬停颜色。
重写自定义委托禁用列,支持文字颜色、背景颜色、字体等特性。
修复用户登录、用户退出界面标题栏字体被放大的BUG,因为样式冲突了。
将NvrInfo和IpcInfo中的地址字段改名为mark备注字段,涵盖内容更广。
地图模块默认卫星图增加了叠加层,更符合实际需求,对应地图综合应用示例做了极大升级改善,比如下载离线地图改成了最新的地址,可以下载到和在线地图一样的瓦片图片文件,离线地图下载改成了多线程,速度提升10倍以上。
自定义委托增加quistyle标记,有该标记则自动代码内部引用换肤全局颜色变量,这样删除了大量的设置自定义委托背景颜色的代码。
修复Qt6中msvc编译器下,强制指定miniblink浏览器内核的时候编译通不过的BUG,其实这个操作有点吃饱了撑着,因为msvc下有webengine浏览器内核。但是就是因为有极个别人有这个需求,客户就是上帝。
增加用户管理权限。
将用户权限和用户信息相关类合并到通用的类userhelper中,做成通用的权限组件。
修复Qt6中自定义复选框委托,在设置了全局样式的情况下,会不断切换选中的BUG。
效果图重新截图,用最新的运行界面。
组件示例增加4通道视频同时播放,进度条控制。
V20220106
彻底修复全屏模式+webengine同时存在的情况下鼠标右键菜单无法弹出以及视频可能黑屏的BUG,这是Qt的BUG。
同时测试多屏幕下正常状态和全屏状态的情况,多屏幕不同分辨率。
增加其他设置界面,将串口设置、网络设置等移动到其他设置。随着功能越来越多,也很有必要单独拆分设置。
修复打印预览看不到文字的BUG,原来是设置了QGraphicsView的前景色导致的,把前景色和背景色设置成一样的了,其实是有文字的,鬼想得到QPrintPreviewDialog里面的预览原来用的是QGraphicsView绘制的。
修复qchart图表控件鼠标按下松开后会跟随窗体移动的BUG,因为qchart鼠标按下是UngrabMouse事件而不是MouseButtonRelease。
修复表格行按下后自定义委托颜色在部分样式方案下设置不正确的BUG。
增加视频弹窗按钮,封装的统一的视频弹窗静态函数,直接传入url地址即可。
修复鼠标按下视频预览底部工具栏也能拖曳视频的BUG。
海康内核解析增加对通道的解析,比如可能是一个摄像机有多个通道,或者NVR多个通道。同时完善主码流子码流的解析,可以解析多个码流,之前只能解析主码流子码流两个。
海康内核句柄模式下增加等比例缩放自适应。
onvif模块修复部分厂家摄像机比如天地伟业,搜索返回的媒体地址等一系列请求地址,没有加onvif节点的BUG。
V20211220
重新梳理整个onvif模块,调整对应的结构,删除多余的变量和设置等,对应云台控制等操作需要指定profile,通过参数传入。
对应图片参数操作需要指定videosource,通过参数传入。
去除数据库字段mediaurl、ptzurl,因为这两个数据每次都是更新重新获取的,通过getServices获取,这两个字段改成了videosource、profiletoken,用来从数据库读取出来,每次使用的时候自动下发。
预置位表格中的按钮样式调整,去掉圆角,增加边距,效果更完美。
新增nvr多个通道onvif支持,改动onvif模块代码和数据库结构。
搜索设备后判断是否多个videosource,多个表示有多个视频源,一般是NVR,也有部分IPC自带多个视频源。
有多个则根据不同厂家不同规则,找出对应的每个通道的videosource、profiletoken、rtspmain、rtspsub用分隔符 | 插入到临时表格中。
摄像机管理界面接收到添加设备的时候,在addDevice槽函数中,判断发过来的数据,带了 | 要分别取出来作为通道添加到数据库中。
重新定义搜索的摄像机设备命名规则,按照摄像机#ip地址末尾数字的方式。
如果是NVR过来的摄像机,增加自动查找NVR的名称插入数据库。
获取预置位增加立即清空所有行,之前是先清空内容再根据读取到的预置位个数设置行数。
增加双击打开NVR(也叫分组)对应策略 0-最后空白通道 1-从头清空通道。
增加双击打开IPC(也叫设备)对应策略 0-最后空白通道 1-最后按下通道。
改进在分辨率不同缩放比例保持一致的UI体验,不受缩放比例的影响。
修正异或加密,增加对@String开头的密文进行过滤,防止高版本产生的配置文件到低版本的Qt程序不能正确解析的BUG。
如果打开视频流出错提示 Server returned 5XX Server Error reply 表示摄像机的码流满了,可能多个地方在拉取码流导致摄像机输出的视频流被占满,已经没有更多资源。
V20211205
地图内核增加了海量点接口。
路径规划模块彻底重写,支持重新绘制、沿线移动等模式,数据表格显示。
设备轨迹模块改成从gps点集合文本文件加载进行循环动态模拟移动,默认飞机图标,以便转动角度。
设备播放增加保存视频开关配置参数,可以直接在界面上开启,开启后,通过rtsp从nvr取流比如回放视频,可以将回放的视频保存MP4文件到本地。
修正Qt6通过属性设置标签labtip不能居中对齐的BUG。
封装通用的设置一堆按钮比如添加、删除、保存、导入、导出等按钮图形字体的函数,直接传入父面板即可,自动查找对应的objname设置图标,省去一堆重复代码。
新增飞行轨迹模块frmDeviceGps2,之前的frmDeviceGps作为通过外部函数调用移动。
样式统一整理规范,分类6大类:normal、black、light、dark、flat、other。
x1void QUIStyle::getStyle(QStringList &styleNames, QStringList &styleFiles)
2{
3 static QStringList names;
4 if (names.count() == 0) {
5 names << "黑蓝色" << "软件黑" << "视频黑";
6 names << "深黑色" << "深蓝色" << "深灰色";
7 names << "扁平黑" << "扁平蓝" << "扁平灰";
8 names << "浅黑色" << "浅蓝色" << "浅灰色";
9 names << "普通黑" << "普通蓝" << "普通灰";
10 names << "大蓝色" << "大紫色" << "大银色";
11 }
12
13 //中文皮肤名称对应样式表文件
14 static QStringList files;
15 if (files.count() == 0) {
16 files << ":/qss/blackblue.css" << ":/qss/blacksoft.css" << ":/qss/blackvideo.css";
17 files << ":/qss/darkblack.css" << ":/qss/darkblue.css" << ":/qss/darkgray.css";
18 files << ":/qss/flatblack.css" << ":/qss/flatblue.css" << ":/qss/flatgray.css";
19 files << ":/qss/lightblack.css" << ":/qss/lightblue.css" << ":/qss/lightgray.css";
20 files << ":/qss/normalblack.css" << ":/qss/normalblue.css" << ":/qss/normalgray.css";
21 files << ":/qss/otherblue.css" << ":/qss/otherpurple.css" << ":/qss/othersilvery.css";
22 }
23
-
24 styleNames = names;
25 styleFiles = files;
26}
V20211111
ONVIF组件增加图片参数范围获取,之前默认0-255,有些设备是0-100 0-128之类的,获取后设置到滑动条范围。
ONVIF组件增加网络参数设置,比如IP地址,子网掩码、网关地址、DNS设置等。
ONVIF组件将结构体定义统一移到一个头文件onvifstruct.h,方便后期拓展管理。
预置位模块,调用、添加(调用)、删除三种功能,改成了以三个按钮的形式加到每个预置位信息的后面直接单击使用。之前是先选中预置位所在行,然后单击下面的按钮。
通道轮询全部移动单独的悬停的模块。
视频面板窗体指针改成了全局变量,多处需要引用。
修复1通道轮询后,再次启动程序无法正确加载通道面板布局的BUG。
修复底部通道切换,部分样式效果悬停时候颜色不正确的BUG。改成了取报警图标颜色和已处理颜色。
路径规划模块增加模拟轨迹设备自动旋转角度移动。
路径规划模块模拟轨迹增加移动间隔下拉框选择。
修复Qt4对应webkit模块不支持返回数组的问题,改成字符串拼接用 ; 符隔开。
修复Qt4对应webkit模块不支持路径规划的BUG,因为开启了实时路况属性。
路径规划增加绘制实时轨迹线条,不同颜色显示。
V20211101
修正开启轮询后关闭所有视频通道不弹出提示信息。
所有信息框增加阴影边框区分突出显示,并跟随系统换肤自动更新边框阴影。
修正视频轮询分隔符,将|改成;因为如果是竖杠遇到带有参数的url则会出错。
将设备图片统一存放到config/device目录,之前在config目录下,随着越来越多非常凌乱。
修复之前通过信号执行通道切换,对应文字显示反了的BUG(通道1交换到通道2,新的通道2应该显示之前通道1的文本)。
将鼠标按下两个通道交换的处理代码,复用信号槽切换通道的函数。
将视频监控布局切换部分单独提取类VideoBox,专门负责管理各种通道布局切换,复用代码并且方便后期拓展,这部分代码和具体的处理无关,一直以来就想要单独提取出来进行管理,后期可以方便的增加其他异形布局以及255通道布局等,很多项目都用到了这个切换逻辑。
同时增加了布局切换子菜单比如13画面子菜单切换到52_64通道。
修复Qt6中视频控件悬浮条无法显示的BUG,因为Qt6将void enterEvent(QEvent *);改成了void enterEvent(QEnterEvent *);也不打个招呼。这种改变编译也不会提示的。
数据库组件修正sqlserver数据库必须设置数据源的不足,改成了dsn字符串形式,不需要新建数据源也能直接通信。
数据库组件修正mysql数据库必须存在默认数据库mysql的不足,改成了不需要默认数据库也能正常通信。
数据库组件修正没有默认数据库也能在建立连接后新建数据库操作。
数据库脚本执行将DROP DATABASE IF EXIST改成了DROP DATABASE ,这样无论什么时候都能先删除原来的数据库然后再新建数据库CREATE DATABASE。有些数据库不支持IF EXIST。
V20211005
修正ffmpeg内核,在播放地址不存在的情况下,打开容易卡主引起崩溃的BUG,在打开回调函数中增加对线程停止标志位的判断,一旦在打开的回调中识别到需要停止线程则立即返回结束。
增加临时信息中间弹出框提示信息,比如一次性关闭所有通道的时候,界面会卡主的期间提示。
增加忙碌鼠标图标切换显示,忙完以后自动恢复鼠标样式。
修正ffmpeg内核,开始时间记录可能出现问题的BUG,会导致部分特殊MP4文件打不开。
应用程序关闭,增加全局退出信号关联到视频通道管理类,先关闭所有视频通道再彻底退出应用程序。不这样处理的话,发现vlc内核在开启了视频存储的时候,会关不掉程序。
修复在没有声音播放的情况下主动调用停止播放造成崩溃的BUG。
修复在linux系统上QUIWidget弹出的无边框窗体带系统标题栏的BUG。
修复ffmpeg内核关闭视频后opengl窗体来不及隐藏的BUG。
修复重复立即刷新打开所有通道,前一次还没执行后一次又来了的BUG,改成了定时器处理,在立即执行前将上一次还没来得及执行的先停止。
增加about关于对话框窗体,显示版本号、版权所有、网址、电话等信息。
所有弹出窗体都跟随软件主窗体默认居中,这个特性非常棒。
所有皮肤增加右键菜单选中图标样式、右键菜单二级子菜单右侧小三角箭头图标样式,单选框、复选框、禁用状态图标全部更新,从图形字体绘制,极其统一舒服。
着重对日志类savelog增加了最大行数、最大文件大小等参数设置,可以设置按照行数或者大小来自动分割日志文件。
日志类增加了可过滤不同的消息类型,不同消息类型增加消息头。
经过大量对比测试发现,使用miniblink浏览器内核,容易卡,说不定什么时候就失效了,问题集中在32位,64位的目前没有发现这个现象,webengine暂时没有这个现象,但是加载打开摄像机的网页配置,还是miniblink更优秀。
中文标题栏支持换行,既可以副标题写在英文标题上,也可以同等大小字体写在中文标题上。
V20210922
视频控件边框增加0像素选项,这样看起来没有边框,有些场景需要无缝拼接。
修复当采用NVR通道作为摄像机视频流显示的时候,ONVIF处理索引越界崩溃的情况,因为一台NVR同一个IP地址对应多个摄像机。
所有样式17套皮肤更新边框颜色。
系统信息增加对应的编译器名字、位数、版本等。
演示demo增加视频叠加演示功能,比如在主视频的左上角、右上角、左下角、右下角在增加一个视频缩略图显示。
新增天气预报模块,可设置城市、采集间隔、展示样式等。
增加了vlc内核下USB摄像头格式自动纠正,如果采用ffmpeg的格式video=USB2.0 PC CAMERA|1920x1080自动纠正。
纠正vlc内核下USB摄像头不自动拉伸的BUG。
修正vlc内核动态保存视频文件,文件命名不符合规范,重新按照设定的重命名。
修复vlc内核中USB摄像头会当做rtsp视频流的BUG。
天气预报模块新增城市显示,新增双击弹出天气预报设置,含打印信息。
系统信息,增加秘钥文件的内容,比如允许的设备数量、到期日期等。
修复配置文件一旦新增加节点,之前节点全部初始值运行的BUG,应该是存在的节点则读取节点值,不存在的节点以初始值运行。
V20210705
改进窗体居中显示算法,可设置参照窗体,默认基于当前屏幕中心,可设置参照主窗体则基于参照窗体,在大分辨率屏幕效果非常好,不然主窗体很小,弹个窗找不到还在很远的地方,还以为没有弹呢。
将登陆窗体、登出窗体、用户管理等公用界面,做成了通用库core_form。
修复MAC系统上无边框窗体无法最小化的BUG。
增加超级管理员密码A具有所有权限的机制,避免管理员误将系统设置权限取消后无法再次进去系统设置的问题。
图片参数增加锐度,图片参数设置滑块调节松开立即设置。
修复当没有启用图片地图的时候对应界面隐藏的时候保存设备坐标位置报错BUG,因为没有启用的情况下没有设置对应的对象指针。
V20210603
将onvif搜索的用户密码,设备播放界面的设备密码等配置参数全部改成了密文存储。
大量修改代码,全部支持Qt4-Qt6所有版本。
调整onvif代码执行机制,改成了异步执行。
云台协议增加了连续移动。
增加了预置位相关处理,包括获取预置位、调用预置位、添加预置位、删除预置位。
自动巡航按照预置位集合进行,采用定时器去调用预置位队列。
增加图文警情行数、窗口信息行数配置,0行表示自动处理。
做了大量的代码改进,比如onvif内核换成了QDom对象处理,之前是采用的QXmlQuery查询,由于XmlPatterns这个模块逐渐废弃了,而且在Qt6中不再有,所以彻底移除了XmlPatterns相关的代码,改用其他处理方式实现。
增加了预置位和自动巡航处理,其中包括获取预置位集合、调用预置位、添加预置位、删除预置位、设置起始位、调用起始位等。
ONVIF内核几乎全部重写,将数据改成了结构体,比如设备信息、预置位信息、事件信息等,可以存储更多的数据,拓展也非常灵活。
onvif处理部分增加了对非onvif设备的过滤,通过判断是否存在onvif地址。这样可以大大加快处理速度,打开视频的时候去实例化onvif通信,关闭视频的时候删除对应的onvif类,这样可以动态响应。
所有onvif指令改成了线程处理,处理完成一个立马处理下一个,排队处理。
V20210425
配置文件密码改成密文存储。
增加了无敌的牛逼的万能的完美入微级自动分页导航控件。
日志记录表增加索引,速度提升100倍以上。
新增多个设备轨迹 不同颜色+传入经纬度 单独示例。
对地图核心类所有覆盖物都增加颜色+粗细+透明度的参数,可动态传入对应值。
系统设置增加用户管理模块,可分别设置对应的权限。
万能权限管理算法,通过设置不同需要授权的模块名称,对应切换的按钮自动计算。
增加了appkey秘钥类,用于校验秘钥是否正确,运行时间等。
V20210403
增加全局变量AppData::LastLiveTime,记住程序最后的活动时间-包括键盘+鼠标活动,用于两个判断,一个是超过多久没有操作全屏下隐藏鼠标光标,一个是超过多久没有操作如果没有全屏则自动全屏。
增加App::TimeAutoFull配置参数用来判断比较超时自动全屏。
重命名为TimeHideCursor表示程序多久未操作自动隐藏光标,TimeAutoFull程序多久未操作自动全屏界面,下拉框选项值增加0,表示不启用此功能。
增加信息列表模块frmMsgList,用于图文列表显示信息,对应兄弟类frmMsgTable用于表格显示消息。
大改版,将中间部分全部改成了QMainWindow,子模块全部采用停靠窗体,可以悬浮半透明,自动记忆每个模块的最后的位置,启动后自动应用。
移除大改版后的所有不需要用的变量和配置参数,重新调整配置参数。
增加透明度参数用于停靠窗体独立出来后的透明度。
将摄像机控制部分比如云台+控制+预置位+巡航,单独分类到ipc模块,方便管理。
限定操作员不能移动停靠窗体等,需要管理员设计好。
修复系统设置中工作模式等切换造成的自动重启会弹出退出和登录两个窗体的BUG。
修复自动登录用户计算不正确的BUG,要以最后登录的用户为准。
V20210322
USB摄像头增加参数帧率,第二个参数是分辨率,第三个参数为帧率,不设置则采用默认的帧率,video=USB2.0 PC CAMERA|1920x1080|25。
增加独立的demo模块,专门用于测试监控系统中用到的组件和控件,演示如何使用,比如视频图片界面演示从文件夹读取图片绘制到窗体,视频窗体演示系统的核心组件视频控件的设置参数如何使用等。
增加了对其他数据库的支持,比如posgres、oracle、odbc、kingbase等数据库,理论上只要支持odbc数据源方式的都支持。
增加IndexStart启动窗体索引配置参数,0-主程序 1-演示示例。
V20210305
修复数据库有时候没加载到的BUG。
新增配置参数控制画面切换的菜单和快捷图标是否显示。
ffmpeg内核增加了可动态保存机制,点击开始保存按钮启动保存,单击结束则生成视频文件,如此往复。
海康内核判断主码流子码流改成了 /101? 和 /main/ 同时判断。
新增多屏幕的支持,自动在对应屏幕最大化全屏,对话框位置,右下角提示框等。
再次分类存放代码文件,分成core ui class三大类。
系统配置更改视频控件参数,统一一个函数设置,initCommonVideoWidget函数中做了过滤,必须关闭状态的视频控件设置才起作用。
设备播放模块增加大华NVR的远程回放地址,其他地址计算算法调整。
新增界面模块功能启用配置参数。
新增主界面顶部导航模块中间界面,用于不同的运行模式加载不同的模块。
0.8.3 快速迭代
V20201212
增加USB摄像机分辨率设置,直接url带掉。
所有地图内核公用一个,复用代码。
增加地图默认级别和中心点坐标设置参数。
主界面四个模块独立出来,做成了可配置,这样后期可以任意位置放置自定义模块。
四个模块标题栏自定义。
vlc内核和mpv内核的离线判断,当句柄模式下,统一为getLastTime,当调用该函数的时候自动查询播放状态,如果正在播放则自动更新时间为当前时间。
将各种在代码中define定义不同内核的代码全部优化,统一为一个类,很大减少代码量,统一为CommonVideoWidget和CommonVideoManage类。
V20201108
轮询点模块增加批量生成功能。
录像机、摄像机、轮询点,增加导入导出功能。
ffmpeg内核增加读取帧回调,超时识别,可以快速识别掉线。
20200828
增加了云台控制过滤,没有打开的视频禁用云台。
linux上全屏BUG修复,采用showfullscreen。
增加轮询点管理模块。
修正轮询的可能崩溃的BUG。
V20200730
系统设置增加了视频上传模块,用来将本地的视频文件传输到服务器,多线程并发。
视频监控内核新增MPV内核,修正了其他内核的部分函数和处理。
海康内核进行大改动,同时支持视频流和本地MP4文件播放,自动分析切换。
海康内核增加回调处理,可以拿到每一张图片。
海康内核进行了linux上的实验,可以正常播放。
ffmpeg内核增加保存到MP4。
本地文件回放vlc部分增加进度切换等。
悬浮条关闭按钮增加实际处理,之前只是打印消息。
改进了vlc和mpv的事件回调机制,使其同时支持qt4+qt5。
V20200620
增加了opengl显示实时视频,CPU占用极低。
增加了地图上设备点位置的调整。
设备点双击弹出实时视频预览。
增加GPS运动轨迹显示。
ffmpeg解码类增加了音频播放,采用的QAudioOutput。
V20191105
增加云台控制功能,可以上下左右等八个方位控制云台,默认采用相对移动,云台中间按下表示复位。
系统设置增加码流类型选择,默认子码流,切换完自动应用。
云台控制增加速度功能,值越大,速度越快。
增加焦距控制,可放大缩小,速度也可控制。
1 用户登录退出
1.1 用户登录
+
24 styleNames = names;
25 styleFiles = files;
26}
V20211111
ONVIF组件增加图片参数范围获取,之前默认0-255,有些设备是0-100 0-128之类的,获取后设置到滑动条范围。
ONVIF组件增加网络参数设置,比如IP地址,子网掩码、网关地址、DNS设置等。
ONVIF组件将结构体定义统一移到一个头文件onvifstruct.h,方便后期拓展管理。
预置位模块,调用、添加(调用)、删除三种功能,改成了以三个按钮的形式加到每个预置位信息的后面直接单击使用。之前是先选中预置位所在行,然后单击下面的按钮。
通道轮询全部移动单独的悬停的模块。
视频面板窗体指针改成了全局变量,多处需要引用。
修复1通道轮询后,再次启动程序无法正确加载通道面板布局的BUG。
修复底部通道切换,部分样式效果悬停时候颜色不正确的BUG。改成了取报警图标颜色和已处理颜色。
路径规划模块增加模拟轨迹设备自动旋转角度移动。
路径规划模块模拟轨迹增加移动间隔下拉框选择。
修复Qt4对应webkit模块不支持返回数组的问题,改成字符串拼接用 ; 符隔开。
修复Qt4对应webkit模块不支持路径规划的BUG,因为开启了实时路况属性。
路径规划增加绘制实时轨迹线条,不同颜色显示。
V20211101
修正开启轮询后关闭所有视频通道不弹出提示信息。
所有信息框增加阴影边框区分突出显示,并跟随系统换肤自动更新边框阴影。
修正视频轮询分隔符,将|改成;因为如果是竖杠遇到带有参数的url则会出错。
将设备图片统一存放到config/device目录,之前在config目录下,随着越来越多非常凌乱。
修复之前通过信号执行通道切换,对应文字显示反了的BUG(通道1交换到通道2,新的通道2应该显示之前通道1的文本)。
将鼠标按下两个通道交换的处理代码,复用信号槽切换通道的函数。
将视频监控布局切换部分单独提取类VideoBox,专门负责管理各种通道布局切换,复用代码并且方便后期拓展,这部分代码和具体的处理无关,一直以来就想要单独提取出来进行管理,后期可以方便的增加其他异形布局以及255通道布局等,很多项目都用到了这个切换逻辑。
同时增加了布局切换子菜单比如13画面子菜单切换到52_64通道。
修复Qt6中视频控件悬浮条无法显示的BUG,因为Qt6将void enterEvent(QEvent *);改成了void enterEvent(QEnterEvent *);也不打个招呼。这种改变编译也不会提示的。
数据库组件修正sqlserver数据库必须设置数据源的不足,改成了dsn字符串形式,不需要新建数据源也能直接通信。
数据库组件修正mysql数据库必须存在默认数据库mysql的不足,改成了不需要默认数据库也能正常通信。
数据库组件修正没有默认数据库也能在建立连接后新建数据库操作。
数据库脚本执行将DROP DATABASE IF EXIST改成了DROP DATABASE ,这样无论什么时候都能先删除原来的数据库然后再新建数据库CREATE DATABASE。有些数据库不支持IF EXIST。
V20211005
修正ffmpeg内核,在播放地址不存在的情况下,打开容易卡主引起崩溃的BUG,在打开回调函数中增加对线程停止标志位的判断,一旦在打开的回调中识别到需要停止线程则立即返回结束。
增加临时信息中间弹出框提示信息,比如一次性关闭所有通道的时候,界面会卡主的期间提示。
增加忙碌鼠标图标切换显示,忙完以后自动恢复鼠标样式。
修正ffmpeg内核,开始时间记录可能出现问题的BUG,会导致部分特殊MP4文件打不开。
应用程序关闭,增加全局退出信号关联到视频通道管理类,先关闭所有视频通道再彻底退出应用程序。不这样处理的话,发现vlc内核在开启了视频存储的时候,会关不掉程序。
修复在没有声音播放的情况下主动调用停止播放造成崩溃的BUG。
修复在linux系统上QUIWidget弹出的无边框窗体带系统标题栏的BUG。
修复ffmpeg内核关闭视频后opengl窗体来不及隐藏的BUG。
修复重复立即刷新打开所有通道,前一次还没执行后一次又来了的BUG,改成了定时器处理,在立即执行前将上一次还没来得及执行的先停止。
增加about关于对话框窗体,显示版本号、版权所有、网址、电话等信息。
所有弹出窗体都跟随软件主窗体默认居中,这个特性非常棒。
所有皮肤增加右键菜单选中图标样式、右键菜单二级子菜单右侧小三角箭头图标样式,单选框、复选框、禁用状态图标全部更新,从图形字体绘制,极其统一舒服。
着重对日志类savelog增加了最大行数、最大文件大小等参数设置,可以设置按照行数或者大小来自动分割日志文件。
日志类增加了可过滤不同的消息类型,不同消息类型增加消息头。
经过大量对比测试发现,使用miniblink浏览器内核,容易卡,说不定什么时候就失效了,问题集中在32位,64位的目前没有发现这个现象,webengine暂时没有这个现象,但是加载打开摄像机的网页配置,还是miniblink更优秀。
中文标题栏支持换行,既可以副标题写在英文标题上,也可以同等大小字体写在中文标题上。
V20210922
视频控件边框增加0像素选项,这样看起来没有边框,有些场景需要无缝拼接。
修复当采用NVR通道作为摄像机视频流显示的时候,ONVIF处理索引越界崩溃的情况,因为一台NVR同一个IP地址对应多个摄像机。
所有样式17套皮肤更新边框颜色。
系统信息增加对应的编译器名字、位数、版本等。
演示demo增加视频叠加演示功能,比如在主视频的左上角、右上角、左下角、右下角在增加一个视频缩略图显示。
新增天气预报模块,可设置城市、采集间隔、展示样式等。
增加了vlc内核下本地摄像头格式自动纠正,如果采用ffmpeg的格式video=USB2.0 PC CAMERA|1920x1080自动纠正。
纠正vlc内核下本地摄像头不自动拉伸的BUG。
修正vlc内核动态保存视频文件,文件命名不符合规范,重新按照设定的重命名。
修复vlc内核中本地摄像头会当做rtsp视频流的BUG。
天气预报模块新增城市显示,新增双击弹出天气预报设置,含打印信息。
系统信息,增加秘钥文件的内容,比如允许的设备数量、到期日期等。
修复配置文件一旦新增加节点,之前节点全部初始值运行的BUG,应该是存在的节点则读取节点值,不存在的节点以初始值运行。
V20210705
改进窗体居中显示算法,可设置参照窗体,默认基于当前屏幕中心,可设置参照主窗体则基于参照窗体,在大分辨率屏幕效果非常好,不然主窗体很小,弹个窗找不到还在很远的地方,还以为没有弹呢。
将登陆窗体、登出窗体、用户管理等公用界面,做成了通用库core_form。
修复MAC系统上无边框窗体无法最小化的BUG。
增加超级管理员密码A具有所有权限的机制,避免管理员误将系统设置权限取消后无法再次进去系统设置的问题。
图片参数增加锐度,图片参数设置滑块调节松开立即设置。
修复当没有启用图片地图的时候对应界面隐藏的时候保存设备坐标位置报错BUG,因为没有启用的情况下没有设置对应的对象指针。
V20210603
将onvif搜索的用户密码,设备播放界面的设备密码等配置参数全部改成了密文存储。
大量修改代码,全部支持Qt4-Qt6所有版本。
调整onvif代码执行机制,改成了异步执行。
云台协议增加了连续移动。
增加了预置位相关处理,包括获取预置位、调用预置位、添加预置位、删除预置位。
自动巡航按照预置位集合进行,采用定时器去调用预置位队列。
增加图文警情行数、窗口信息行数配置,0行表示自动处理。
做了大量的代码改进,比如onvif内核换成了QDom对象处理,之前是采用的QXmlQuery查询,由于XmlPatterns这个模块逐渐废弃了,而且在Qt6中不再有,所以彻底移除了XmlPatterns相关的代码,改用其他处理方式实现。
增加了预置位和自动巡航处理,其中包括获取预置位集合、调用预置位、添加预置位、删除预置位、设置起始位、调用起始位等。
ONVIF内核几乎全部重写,将数据改成了结构体,比如设备信息、预置位信息、事件信息等,可以存储更多的数据,拓展也非常灵活。
onvif处理部分增加了对非onvif设备的过滤,通过判断是否存在onvif地址。这样可以大大加快处理速度,打开视频的时候去实例化onvif通信,关闭视频的时候删除对应的onvif类,这样可以动态响应。
所有onvif指令改成了线程处理,处理完成一个立马处理下一个,排队处理。
V20210425
配置文件密码改成密文存储。
增加了无敌的牛逼的万能的完美入微级自动分页导航控件。
日志记录表增加索引,速度提升100倍以上。
新增多个设备轨迹 不同颜色+传入经纬度 单独示例。
对地图核心类所有覆盖物都增加颜色+粗细+透明度的参数,可动态传入对应值。
系统设置增加用户管理模块,可分别设置对应的权限。
万能权限管理算法,通过设置不同需要授权的模块名称,对应切换的按钮自动计算。
增加了appkey秘钥类,用于校验秘钥是否正确,运行时间等。
V20210403
增加全局变量AppData::LastLiveTime,记住程序最后的活动时间-包括键盘+鼠标活动,用于两个判断,一个是超过多久没有操作全屏下隐藏鼠标光标,一个是超过多久没有操作如果没有全屏则自动全屏。
增加App::TimeAutoFull配置参数用来判断比较超时自动全屏。
重命名为TimeHideCursor表示程序多久未操作自动隐藏光标,TimeAutoFull程序多久未操作自动全屏界面,下拉框选项值增加0,表示不启用此功能。
增加信息列表模块frmMsgList,用于图文列表显示信息,对应兄弟类frmMsgTable用于表格显示消息。
大改版,将中间部分全部改成了QMainWindow,子模块全部采用停靠窗体,可以悬浮半透明,自动记忆每个模块的最后的位置,启动后自动应用。
移除大改版后的所有不需要用的变量和配置参数,重新调整配置参数。
增加透明度参数用于停靠窗体独立出来后的透明度。
将摄像机控制部分比如云台+控制+预置位+巡航,单独分类到ipc模块,方便管理。
限定操作员不能移动停靠窗体等,需要管理员设计好。
修复系统设置中工作模式等切换造成的自动重启会弹出退出和登录两个窗体的BUG。
修复自动登录用户计算不正确的BUG,要以最后登录的用户为准。
V20210322
本地摄像头增加参数帧率,第二个参数是分辨率,第三个参数为帧率,不设置则采用默认的帧率,video=USB2.0 PC CAMERA|1920x1080|25。
增加独立的demo模块,专门用于测试监控系统中用到的组件和控件,演示如何使用,比如视频图片界面演示从文件夹读取图片绘制到窗体,视频窗体演示系统的核心组件视频控件的设置参数如何使用等。
增加了对其他数据库的支持,比如posgres、oracle、odbc、kingbase等数据库,理论上只要支持odbc数据源方式的都支持。
增加IndexStart启动窗体索引配置参数,0-主程序 1-演示示例。
V20210305
修复数据库有时候没加载到的BUG。
新增配置参数控制画面切换的菜单和快捷图标是否显示。
ffmpeg内核增加了可动态保存机制,点击开始保存按钮启动保存,单击结束则生成视频文件,如此往复。
海康内核判断主码流子码流改成了 /101? 和 /main/ 同时判断。
新增多屏幕的支持,自动在对应屏幕最大化全屏,对话框位置,右下角提示框等。
再次分类存放代码文件,分成core ui class三大类。
系统配置更改视频控件参数,统一一个函数设置,initCommonVideoWidget函数中做了过滤,必须关闭状态的视频控件设置才起作用。
设备播放模块增加大华NVR的远程回放地址,其他地址计算算法调整。
新增界面模块功能启用配置参数。
新增主界面顶部导航模块中间界面,用于不同的运行模式加载不同的模块。
0.8.3 快速迭代
V20201212
增加USB摄像机分辨率设置,直接url带掉。
所有地图内核公用一个,复用代码。
增加地图默认级别和中心点坐标设置参数。
主界面四个模块独立出来,做成了可配置,这样后期可以任意位置放置自定义模块。
四个模块标题栏自定义。
vlc内核和mpv内核的离线判断,当句柄模式下,统一为getLastTime,当调用该函数的时候自动查询播放状态,如果正在播放则自动更新时间为当前时间。
将各种在代码中define定义不同内核的代码全部优化,统一为一个类,很大减少代码量,统一为CommonVideoWidget和CommonVideoManage类。
V20201108
轮询点模块增加批量生成功能。
录像机、摄像机、轮询点,增加导入导出功能。
ffmpeg内核增加读取帧回调,超时识别,可以快速识别掉线。
20200828
增加了云台控制过滤,没有打开的视频禁用云台。
linux上全屏BUG修复,采用showfullscreen。
增加轮询点管理模块。
修正轮询的可能崩溃的BUG。
V20200730
系统设置增加了视频上传模块,用来将本地的视频文件传输到服务器,多线程并发。
视频监控内核新增MPV内核,修正了其他内核的部分函数和处理。
海康内核进行大改动,同时支持视频流和本地MP4文件播放,自动分析切换。
海康内核增加回调处理,可以拿到每一张图片。
海康内核进行了linux上的实验,可以正常播放。
ffmpeg内核增加保存到MP4。
本地文件回放vlc部分增加进度切换等。
悬浮条关闭按钮增加实际处理,之前只是打印消息。
改进了vlc和mpv的事件回调机制,使其同时支持qt4+qt5。
V20200620
增加了opengl显示实时视频,CPU占用极低。
增加了地图上设备点位置的调整。
设备点双击弹出实时视频预览。
增加GPS运动轨迹显示。
ffmpeg解码类增加了音频播放,采用的QAudioOutput。
V20191105
增加云台控制功能,可以上下左右等八个方位控制云台,默认采用相对移动,云台中间按下表示复位。
系统设置增加码流类型选择,默认子码流,切换完自动应用。
云台控制增加速度功能,值越大,速度越快。
增加焦距控制,可放大缩小,速度也可控制。
1 用户登录退出
1.1 用户登录
系统启动后,首先会弹出用户登录界面,从用户姓名的下拉框选择用户名,然后输入密码(默认用户名密码都是admin),单击登录按钮,密码正确则会进入到系统主界面,错误会弹出提示,错误超过三次自动关闭,需要重新打开软件。
在登录界面可以勾选是否记住密码,是否自动登录,如果勾选了记住密码,则下次启用软件会自动填入最后用户的密码,勾选了自动登录(以最后的用户信息作为当前登录用户)则启动后直接进入主界面。如果开启了自动登录,不会弹出登录界面,可以在系统设置中关闭自动登录和记住密码。
1.2 用户退出
在主界面单击右上角的关闭按钮,会弹出用户退出界面,需要输入密码验证防止误关闭,会自动填入登录的用户名,密码输入正确才会退出软件。用户登录和退出都内置了超级密码a防止管理员忘记密码。
2 主界面操作
主界面由顶部主菜单导航、左侧右侧停靠窗体(设备列表、窗口信息、图文警情、悬浮地图、云台控制、设备控制、预置巡航、视频轮询等)、中间视频监控主画面组成,其中左右两侧的停靠窗体可以拉伸宽度,上下停靠窗体之间也可以拉伸高度,每个停靠窗体都可以关闭和悬浮。自动保存布局文件,下次启动自动应用。
新增说明
2021-5-8,主界面改成了停靠窗体模式。
拓展性更强,可以任意组合多种子模块。
模块可停靠悬浮。
在普通模式和全屏模式都有独立的布局文件。
不同的工作模式都可对应不同的布局文件。
2.1 模块显示
左侧和右侧的面板,可以通过单击面板右上角的关闭按钮来隐藏,当隐藏一个面板以后,剩余的面板会自动填充布局,如果需要重新显示面板,则在标题栏鼠标右键就可以对小面板进行显示和隐藏,右上角的时间和CPU显示面板可以在系统设置中控制显示隐藏。系统会自动记住最后的布局比如显示的面板和宽高占比,下次启动后自动应用。
特别说明
在停靠窗体的标题栏鼠标右键也会弹出子窗体的开启菜单,复选框勾选表示显示,悬浮的窗体没有这个特性,一定要是嵌入在主界面中的子窗体标题栏才有。
如果是全屏模式,由于没有了标题栏,想要关闭模块的话,需要将其拖动到边缘嵌入主窗体,然后在标题栏鼠标右键菜单中关闭即可。
2.2 模块拖动
面板和面板之间有个分隔条,鼠标移到对应分隔条的地方,会变成可拉动的鼠标指针,此时可以上下左右拉动调整宽高,调整好以后会自动保存宽高比例,下次启动后自动应用最后的配置来显示。
2.3 视频播放
视频播放支持多种方式:
双击子节点播放单个摄像机,在当前选中通道处播放。
双击父节点播放整个录像机的摄像机,依次排列。
按住子节点拖曳到对应通道,播放摄像机。
本地文件直接拖曳到通道,自动播放本地文件。
启动后自动播放最后通道的视频信息。
代码接口提供指定通道播放url。
代码接口提供指定两个通道交换,比如报警的时候将某个通道移到最前面显示。
2.4 视频截图
@@ -698,16 +698,16 @@ header, .context-menu, .megamenu-content, footer{
12 GraphInfo() {
13 name = "graph";
14 borderWidth = 2;
15 borderColor = "#FF0000";
16 bgColor = QColor(255, 0, 0, 100);
17 }
18};
19
20public slots:
21 //设置图形
22 void setGraph(const GraphInfo &graph);
23 //添加图形
24 void appendGraph(const GraphInfo &graph);
25 //删除图形
26 void removeGraph(const QString &name);
27 //清空图形
28 void clearGraph();
29
30void DeviceVideoSmart::receiveRects(const QList<QRect> &rects)
31{
32 if (!widget || !widget->getIsRunning()) {
33 return;
34 }
35
-
36 widget->clearGraph();
37 foreach (QRect rect, rects) {
38 GraphInfo graph;
39 graph.borderColor = QColor(255, 0, 0);
40 graph.borderWidth = 3;
41 graph.rect = rect;
42 widget->appendGraph(graph);
43 }
44}
操作步骤:
左侧选中通道,前提是该通道的设备支持预置位,一般是球机才有预置位。
单击获取预置位,所有预置位信息会表格形式显示,每个预置位有唯一编号和名称,名称可以修改,编号改不了。
预置位表格中三个按钮依次为执行、更新、删除。
单击执行按钮(三角形状),会调用对应的预置位,设备会切换到对应预置位对应的位置。
单击更新按钮(加号形状),将当前设备停留的位置作为新的位置更新对应预置位。
单击删除按钮(删除形状),将当前选中的预置位信息删除,有部分设备仅仅是删除位置信息,预置位还会在,具体要看设备的支持。
输入预置位名称,调整画面到要新加的预置位置,单击添加预置位按钮,会新增加一个预置位。
调用起始位,一般是球机的默认开机后的位置,原始位置,单击调用起始位按钮后,会自动切换过去。
设置起始位,将当前位置设置为起始位置。
视频回放中有多个子模块,分别是不同的含义:
本地回放:回放存储在本地电脑的视频文件。
远程回放:通过sdk方式回放NVR上的存储录像(暂未实现,每个厂家不一样)。
设备播放:通用的rtsp取流形式的播放实时视频和回放录像文件,支持海康大华等厂家的NVR回放。
图片回放:查找对应文件夹下的所有通道图片,按照设定的间隔回复,类似视频效果,一般用在存储一堆图片序列的应用场景中。
视频上传:将查询的本地存储的视频文件上传到云端服务器。类似于将视频文件存储到服务器上,需要手动填写服务器地址和端口。
基本步骤:
选择设备通道(可以所有通道后者某个通道)。
选择视频类型(存储视频/报警视频),目前只有存储视频。
选择时间范围,考虑都范围大文件数量过多,默认限定查询60天内范围的视频。
单击查询按钮,符合条件的视频文件都会列出来,双击可以播放。
每个文件前面都有复选框,可以勾选用于下载和删除。
单击下载按钮,会将当前选中的文件拷贝到选择的目录。
单击删除按钮,会将当前选中的文件删除。
单击清空按钮,会将所有查询出来的文件全部删除。
播放过程中实时显示播放进度,可以单击或者拖动进度条切换进度。
默认播放完成一个会自动播放下一个,如果有下一个的话。
进度条左侧显示当前播放时长和文件总时长。
进度条右侧有三个按钮,分别是播放/暂停按钮、停止按钮、静音切换按钮。
右上角可以选择播放速度,播放过程中也会立即应用,可选0.5倍速、1.0倍速、2.0倍速、4.0倍速、8.0倍速等。
默认存储主目录 video_normal。
主目录下按照日期目录存放(2025-10-01/2025-10-31)。
日期目录下是单个视频文件(ch01_2021-04-07-14-08-11.mp4/ch02_2021-04-07-14-08-11.mp4)。
拓展功能可以存储对应的数据文件比如经纬度数据和视频文件一个目录(名称一样并且拓展名可以是txt)。
远程回放模块是用来通过sdk的形式回放远程NVR设备上的录像文件,这个暂未实现,本系统主要是为了兼容性和通用性,通过具体sdk形式调用的处理都没有做,破坏了移植性,到了其他平台就没法使用了,本系统sdk使用这块默认用的海康sdk作为示例。
设备播放模块主要是通过rtsp视频流的形式来拉取实时视频和回放视频,现在越来越多的NVR支持直接通过取流的形式来拉取实时视频流和回放视频,这样使用起来很方便,当然在拉取视频流的时候要传入用户信息,防止非法获取,现在越来越多的应用场景需要通过NVR来调取回放视频,传统的SDK的方式非常累厂家太多,而国标的形式太繁琐复杂,于是rtsp形式的最简单的方式应运而生,目前支持的厂家也越来越多,每个厂家格式的规则不一样,可以自行咨询厂家的规则,本程序默认实现了海康、大华和深广的规则。
基本步骤:
选择设备厂家,不同厂家rtsp视频流格式不一样,内置支持了海康、大华、通用的。
选择视频类型,支持实时视频和回放视频两种,回放视频还要选择时间范围。
填写用户名称、用户密码,最后组成rtsp视频流字符串一起。
填写或者下拉选择设备地址,填写IP地址,默认会把录像机管理中添加的设备地址填充到下拉框。
选择设备通道,一个设备比如NVR可能有多个通道,摄像机一般只有1个通道。
选择码流类型,可以选择主码流、子码流、三码流。
选择时间范围,实时视频不用选,回放视频才需要。
左侧选中某个通道,单击播放按钮,会将对应参数组成的rtsp视频流地址打开。
单击删除按钮,相当于关闭选中的通道。
可以单击暂停和继续两个按钮用来控制暂停播放和继续播放。由于是视频流是实时的,所以暂停期间会正常接收数据,但是并不会解码,所以当你再次播放时已经是最新的当前时间的视频数据。
选择设备通道和时间范围,单击查询按钮,会将查询到的图片序列按照日期的形式作为一行添加到列表结果中,双击可以自动播放,可以调节播放速度。
默认存储主目录 image_normal
主目录下按照日期目录存放(2025-10-01/2025-10-31)
日期目录下是单个图片文件(ch01_2021-04-07-14-08-11-222.jpg/ch02_2021-04-07-14-08-11-333.jpg)
拓展功能可以存储对应的数据文件比如警情文字和图片文件一个目录(名称一样并且拓展名可以是txt)
图文混排,可以自定义信息,封装好的类,传入图片队列,图片自适应等比例缩放显示,超过自动分页。
+
widget->clearGraph();
foreach (QRect rect, rects) {
GraphInfo graph;
graph.borderColor = QColor(255, 0, 0);
graph.borderWidth = 3;
graph.rect = rect;
widget->appendGraph(graph);
}
}
操作步骤:
左侧选中通道,前提是该通道的设备支持预置位,一般是球机才有预置位。
单击获取预置位,所有预置位信息会表格形式显示,每个预置位有唯一编号和名称,名称可以修改,编号改不了。
预置位表格中三个按钮依次为执行、更新、删除。
单击执行按钮(三角形状),会调用对应的预置位,设备会切换到对应预置位对应的位置。
单击更新按钮(加号形状),将当前设备停留的位置作为新的位置更新对应预置位。
单击删除按钮(删除形状),将当前选中的预置位信息删除,有部分设备仅仅是删除位置信息,预置位还会在,具体要看设备的支持。
输入预置位名称,调整画面到要新加的预置位置,单击添加预置位按钮,会新增加一个预置位。
调用起始位,一般是球机的默认开机后的位置,原始位置,单击调用起始位按钮后,会自动切换过去。
设置起始位,将当前位置设置为起始位置。
操作步骤:
左侧选中通道,前提是该通道的设备支持OSD的onvif协议设置,一般大厂的都会支持。
单击获取OSD,所有OSD的唯一标识自动列在列表框中。
选中一个OSD,会自动获取该OSD的详细信息然后填入在下面,比如坐标位置、字体大小、标签类型等。
单击添加OSD,会将填写好的对应唯一标识的OSD添加到设备中,一般摄像头会限制OSD的数量,如果已经存在了很多OSD,有可能添加会失败,很多设备会限制最大支持4个OSD。
添加OSD的时候未必是按照填写的唯一标识来添加,设备一般按照自己的命名规则,所以该字段默认即可,比如海康的OSD标识都是OsdToken_开头。
修改OSD,一般支持的修改字段是坐标位置和文字内容,当然这两个也基本上是最常用的需要修改的字段,一般设备不支持将日期时间类型的OSD修改成文字文本类型的OSD,可以选择删除再添加的方式来实现。
很多设备会限制只支持1个日期时间的OSD和多个文字文本的OSD,所以如果你添加多个日期时间OSD的时候,可能会失败。
单击删除OSD会将当前选中的OSD删除,删除后会重新读取所有OSD信息。
在左侧通道上按下鼠标,会自动将鼠标按下处的位置对应的真实像素坐标发送到坐标位置文本框中,以便添加和修改OSD。
视频回放中有多个子模块,分别是不同的含义:
本地回放:回放存储在本地电脑的视频文件。
远程回放:通过sdk方式回放NVR上的存储录像(暂未实现,每个厂家不一样)。
设备播放:通用的rtsp取流形式的播放实时视频和回放录像文件,支持海康大华等厂家的NVR回放。
图片回放:查找对应文件夹下的所有通道图片,按照设定的间隔回复,类似视频效果,一般用在存储一堆图片序列的应用场景中。
视频上传:将查询的本地存储的视频文件上传到云端服务器。类似于将视频文件存储到服务器上,需要手动填写服务器地址和端口。
基本步骤:
选择设备通道(可以所有通道后者某个通道)。
选择视频类型(存储视频/报警视频),目前只有存储视频。
选择时间范围,考虑都范围大文件数量过多,默认限定查询60天内范围的视频。
单击查询按钮,符合条件的视频文件都会列出来,双击可以播放。
每个文件前面都有复选框,可以勾选用于下载和删除。
单击下载按钮,会将当前选中的文件拷贝到选择的目录。
单击删除按钮,会将当前选中的文件删除。
单击清空按钮,会将所有查询出来的文件全部删除。
播放过程中实时显示播放进度,可以单击或者拖动进度条切换进度。
默认播放完成一个会自动播放下一个,如果有下一个的话。
进度条左侧显示当前播放时长和文件总时长。
进度条右侧有三个按钮,分别是播放/暂停按钮、停止按钮、静音切换按钮。
右上角可以选择播放速度,播放过程中也会立即应用,可选0.5倍速、1.0倍速、2.0倍速、4.0倍速、8.0倍速等。
默认存储主目录 video_normal。
主目录下按照日期目录存放(2025-10-01/2025-10-31)。
日期目录下是单个视频文件(ch01_2021-04-07-14-08-11.mp4/ch02_2021-04-07-14-08-11.mp4)。
拓展功能可以存储对应的数据文件比如经纬度数据和视频文件一个目录(名称一样并且拓展名可以是txt)。
远程回放模块是用来通过sdk的形式回放远程NVR设备上的录像文件,这个暂未实现,本系统主要是为了兼容性和通用性,通过具体sdk形式调用的处理都没有做,破坏了移植性,到了其他平台就没法使用了,本系统sdk使用这块默认用的海康sdk作为示例。
设备播放模块主要是通过rtsp视频流的形式来拉取实时视频和回放视频,现在越来越多的NVR支持直接通过取流的形式来拉取实时视频流和回放视频,这样使用起来很方便,当然在拉取视频流的时候要传入用户信息,防止非法获取,现在越来越多的应用场景需要通过NVR来调取回放视频,传统的SDK的方式非常累厂家太多,而国标的形式太繁琐复杂,于是rtsp形式的最简单的方式应运而生,目前支持的厂家也越来越多,每个厂家格式的规则不一样,可以自行咨询厂家的规则,本程序默认实现了海康、大华和深广的规则。
基本步骤:
选择设备厂家,不同厂家rtsp视频流格式不一样,内置支持了海康、大华、通用的。
选择视频类型,支持实时视频和回放视频两种,回放视频还要选择时间范围。
填写用户名称、用户密码,最后组成rtsp视频流字符串一起。
填写或者下拉选择设备地址,填写IP地址,默认会把录像机管理中添加的设备地址填充到下拉框。
选择设备通道,一个设备比如NVR可能有多个通道,摄像机一般只有1个通道。
选择码流类型,可以选择主码流、子码流、三码流。
选择时间范围,实时视频不用选,回放视频才需要。
左侧选中某个通道,单击播放按钮,会将对应参数组成的rtsp视频流地址打开。
单击删除按钮,相当于关闭选中的通道。
可以单击暂停和继续两个按钮用来控制暂停播放和继续播放。由于是视频流是实时的,所以暂停期间会正常接收数据,但是并不会解码,所以当你再次播放时已经是最新的当前时间的视频数据。
选择设备通道和时间范围,单击查询按钮,会将查询到的图片序列按照日期的形式作为一行添加到列表结果中,双击可以自动播放,可以调节播放速度。
默认存储主目录 image_normal
主目录下按照日期目录存放(2025-10-01/2025-10-31)
日期目录下是单个图片文件(ch01_2021-04-07-14-08-11-222.jpg/ch02_2021-04-07-14-08-11-333.jpg)
拓展功能可以存储对应的数据文件比如警情文字和图片文件一个目录(名称一样并且拓展名可以是txt)
图文混排,可以自定义信息,封装好的类,传入图片队列,图片自适应等比例缩放显示,超过自动分页。
视频上传功能主要用来将本地存储的视频文件(也可以是其他文件),通过网络传输(默认TCP)上传到其他地方比如服务器,服务器上要运行接收文件的程序,这样就相当于远程备份视频文件的功能,视频文件可以勾选需要上传哪一些。
本地只需要在视频监控系统客户端上切换到视频上传页面,然后选择要查询的日期范围,单击查询,会将视频文件查询出来显示在左边的表格中,可以勾选要上传的视频文件,右侧填写好服务器的IP和端口(默认6000),单击上传按钮,会多线程的形式上传文件。
远程需要放置文件传输工具,该工具完整源码如果购买了视频监控系统,可以赠送,该工具同时具备了发送端和接收端的功能,配套视频监控系统使用的是接收端,视频监控系统作为发送端,填好监听端口后,单击监听按钮,一旦有连接文件上传,会自动显示对应的接收进度,文件名称以上传的文件名为准。
默认文件传输过程采用了加密机制,意味着传输的数据是加密后的数据,接收到以后根据设置的秘钥进行解密重新生成文件,防止文件传输过程中被拦截,可自定义加密规则。
多线程收发文件,支持加密传输。
接收端支持监听端口接收文件和主动连接服务器接收文件两种方式。
按照 文件开始符+文件大小+文件内容+文件结束符 逐个分包接收。
可对接收的加密过的文件包进行解密输出。
如果采用连接服务器方式接收文件可指定请求文件。
接收端请求文件的形式可以作为通用的程序升级方案。
进度条实时更新收发文件的进度。
发送端可设置每个包最很大小即切片分包数量。
发送端可对文件的每个包进行加密传输。
发送端支持对包进行合并发送。
可指定目录对客户端发来的请求文件进行搜索。
每个功能独立的一个类,接口清晰友好,使用方便。
支持任意Qt版本、任意系统、任意编译器。
电子地图有多个子模块,分别不同的功能,在每个模块上,双击对应的摄像机,都可以弹出实时视频预览画面,支持多个画面同时打开,每个摄像机都一个画面窗体。
图片地图:摄像机分布在平面图上。
离线地图:默认采用百度离线瓦片地图,本地使用。
在线地图:默认采用百度地图,需要联网使用。
路径规划:指定起始点和终点经纬度坐标,查询最优路径并绘制路线,提取路线坐标集合,动态模拟轨迹,比如机器人和飞机轨迹。
图片地图的功能是为了方便直接提供图片文件,然后摄像机点位可直接拖动,更精确定位的场景,图片可以提供鸟瞰图这种,看起来更直观大气,有3D的感觉。
图片文件存放在可执行文件下的map文件夹下,如果需要增加或者删除,可以直接文件操作即可,比如复制新的图片文件到这个目录下即可。
具体摄像机对应哪张图片,可以在摄像机管理中设置,对应字段为地图,直接下拉选择对应的地图即可,默认选择无,就是该摄像机不属于任何地图。
功能和在线地图完全一致,唯一区别就是地图是离线的,不需要联网。离线的地图需要自己准备好,可以网上通过瓦片地图下载器来下载需要的地方的离线地图,一般离线地图比较大,他是一张张图片,所以建议离线地图只下载自己需要的即可,比如某个县的地图,而不是所有的,所有的起码有几十GB。
使用说明
默认系统提供的是上海市的地图。
下载地址在下面文章中,会自动更新地址。 -https://blog.csdn.net/feiyangqingyun/article/details/104005917
请下载同目录下的bin_map_tiles.zip压缩包,解压到config目录下,最后config文件夹下会多出来tiles tiles_hybrid两个文件夹。
在摄像机管理的界面,可以添加经纬度信息,这样就可以在地图上显示对应的摄像机点位信息,如果发现位置不对,可以在右侧先选择摄像机设备,然后鼠标单击新的位置,右侧目标经度、目标纬度信息会自动更新,然后再单击更新经纬度值则会更新当前下拉选择的设备的经纬度信息,也可以在摄像机管理界面手动填入进行修改。
在右侧还有模拟运动轨迹、开始显示轨迹两个按钮,有可能后期还会增加其他功能,是为了演示如何在地图上实现地图的相关功能,开始显示轨迹采用的定时器来生成轨迹点数据,动态模拟运动轨迹,可以单击显示设备位置按钮还原最初的设备点位图。
功能特点
同时支持在线地图和离线地图两种模式。
同时支持webkit内核、webengine内核、IE内核。
支持设置多个标注点,信息包括名称、地址、经纬度。
可设置地图是否可单击、拖动、鼠标滚轮缩放。
可设置协议版本、秘钥、主题样式、中心坐标、中心城市、地理编码位置等。
可设置地图缩放比例和级别,缩略图、比例尺、路况信息等控件的可见。
支持地图交互,比如鼠标按下获取对应位置的经纬度。
支持查询路线,可设置起点位置、终点位置、路线模式、路线方式、路线方案(最少时间、最少换乘、最少步行、不乘地铁、最短距离、避开高速)。
可显示点线面工具,可直接在地图上划线、点、矩形、圆形等。
可设置行政区划,指定某个城市区域绘制图层,在线地图自动输出行政区划边界点集合到js文件给离线地图使用。
可静态或者动态添加多个覆盖物。支持点、折线、多边形、矩形、圆形、弧线、点聚合等。
函数接口友好和统一,使用简单方便,就一个类。
支持js动态交互添加点、删除点、清空点、重置点,不需要刷新页面。
支持任意Qt版本、任意系统、任意编译器。
基本步骤
输入起点坐标和终点坐标,也可以勾选地图选点,开启后直接在左侧的地图界面鼠标按下自动识别对应的经纬度坐标填入,单选框勾选的起点则填入起点坐标输入框中,勾选的终点就填入终点坐标输入框中。
选择路线方式,可选公交、驾车、步行、骑行等方式,默认选择步行。
选择路线方案,可选最少时间、最短距离、避开高速等。
输入关键点数,一般查询返回的路径的经纬度坐标点数非常密集,可能非常多,我们需要根据输入的关键点数来过滤,比如输入30,表示从所有经纬度数据中平均提取出来30个数据就行。点数合计,查询路线后自动返回所有经纬度坐标的数据个数。
单击查询路线,自动返回对应路径的所有经纬度坐标。
单击帅选数据,按照填入的关键点数进行数据帅选,在下方可以看到原始数据和最终数据,选中某个数据,自动在左侧生成点预览对应的位置。
单击模拟轨迹,会启动定时器,从第一个数据点开始,自动移动设备比如机器人、飞行器等,查看整个轨迹点路径是否正确。
本地日志存放的是本系统的操作日志,比如用户登录退出、记录删除、设备报警等操作,都会有对应的记录存放的数据库,可以在这里选择时间段和日志类型进行查询。查询后的日志记录可以翻页查看,还可以直接支持指定页码跳转,(此翻页组件超级牛逼,外观和功能分离,自动计算页码切换导航,具体可参见对应类的头文件功能描述),每页显示多少条记录在系统设置中可以设置。
可以按照多条件进行查询记录。
可以选择设备通道。
可以选择日志的类型:用户操作、运行日志、设备日志、报警日志。
可以选择时间范围。
在查询记录的时候,如果勾选了前面的复选框则表示启用该选择条件进行查询。
没有勾选,就算后面选择了类型等,也是按照where 1=1 条件查询的。
查询后的记录会自动分页显示,而不是一次性显示。
可以单击底部的翻页按钮进行翻页查看记录。
可以快速切换到第一页、末一页、上一页、下一页、显示的页码切换、指定的页码切换。
单击打印按钮,会将当前查询的记录打印出来,自动分页。打印前会弹出打印预览对话框,可以最后在这里调整边距、纸张等设置参数。
单击XLS按钮可以将表格中的内容导出到excel表格,独创的excel导出数据算法,极速导出,支持任意系统,无依赖。
单击删除按钮,会弹出时间范围选择对话框,选择要删除的记录的开始时间和结束时间,单击确定,会将该时间段内的记录全部删除,结束时间必须大于开始时间。
单击清空按钮会先弹出询问框提示是否需要清空数据,单击确定则自动清空所有的记录,清空后不能恢复。
设备日志是指直接通过sdk协议,远程从NVR设备上拉取日志记录到本地显示,其余功能和本地日志一致,此功能未实现。
基本设置中有部分参数的切换会自动重启应用。
参数说明
开机运行:开启以后自动随着系统启动运行,默认开启。
自动登录:开启以后会自动以最后登录的用户信息登录到系统,默认关闭。
记住密码:开启以后会自动填入最后登录的用户信息到登录窗体,默认关闭。
中文标题:软件左上角标题栏的中文标题,改动立即应用。
英文标题:软件左上角标题栏的英文标题,改动立即应用。
版权所有:当前软件版权所有的公司,目前没有显示在哪里,备用。
调试日志:开启后会将打印日志输出到日志文件,默认关闭,日志文件存放在可执行文件夹下的log目录下。
运行时间:开启后会实时记录系统的运行时间,记录当前软件启动后运行了多久,运行时间文件存放在可执行文件夹下的log目录下。
工作模式:默认视频监控,可选机器人监控、无人机监控等。
导航样式:用于选择顶部导航栏和左侧导航栏的样式,上侧+左侧表示顶部导航栏上侧样式(图标在上面,文字在下面),左侧导航栏左侧样式(图标在左侧,文字在右侧)。
界面样式:系统自带17套皮肤,可以在这里自动换肤,默认视频黑。
软件图标:自动从logo文件夹读取,可以自行选择对应的logo文件。
全屏模式:开启以后,最大化显示自动全屏显示而不是最大化显示,默认关闭。
弹框时间:右下角弹出提示信息自动关闭时间,0秒表示常驻不关闭。
报警声音:0表示不启用,其余表示报警后播放的声音次数。
鼠标隐藏:主界面多久鼠标没有操作过会自动隐藏鼠标指针,一般在全屏轮询的时候需要设置,效果会更好。
自动全屏:经过多久以后鼠标没有操作过自动全屏,0表示不启用。
播放记录:如果开启在软件打开后会自动读取上一次的播放记录并自动打开,不需要可以关闭。
图文警情:图文警情模块消息行数,0表示自动计算填满,不产生滚动条。
窗口消息:窗口消息模块消息行数,0表示自动计算填满,不产生滚动条。
透明度值:停靠窗体的透明度值,可调节,动态应用。
参数说明
共享解码:开启后相同地址的通道会复用之前已经打开的通道,这样可以大大节省网络流量和解码压力。
播放音频:开启以后可以播放声音,有时候不需要声音的时候可以关闭,节省资源。
保存视频:录像计划的总开关,开启以后自动存储录像文件,目录在可执行文件目录video_normal。
事件订阅:开启以后会用onvif的机制订阅报警事件。
自动校时:开启后摄像机上线立即同步本地时间到设备。
人工智能:用于演示绘制osd标签和添加各种图形绘制到视频图片上。
画面显示:可选自动调整、等比缩放、拉伸填充三种图片显示策略。
显示模式:可选句柄、绘制、GPU三种模式,在ffmpeg内核下句柄和GPU都是同一种处理。
硬件加速:会根据不同的内核以及不同的系统自动显示不同的可用的加速器名称,默认none表示不启用硬件加速,ffmpeg可选dxva2和d3d11va,建议用dxva2。
通信方式:视频流采用何种通信方式,默认TCP(可靠连接,不会丢包,缺点就是慢),可选UDP(不可靠连接,容易丢包,但是速度快)。
解码策略:ffmpeg内核专用,可选速度优先、质量优先、均衡处理、最快速度,如果对实时视频流rtsp有实时性要求建议选择最快速度,可以看到无论是打开加载视频流还是响应都是最快的。
缓存大小:vlc内核专用,值越小响应速度越快,受限于网络环境和硬件性能。
读取超时:读取视频流过程的超时时间,可选不处理或者具体的秒数,不处理则一直等待直到系统层通知读取失败,选择的话可以加快速度跳出并立即通知失败,建议设置5s,在网络环境不好或者网络中断的情况下能够快速识别到掉线。
连接超时:对于视频流地址可用,先探测对应的地址是否通,不通则不用继续,加载很慢的一些网络地址需要把时间设置大一些,可以尝试用vlc等第三方播放器打开地址对比速度,如果确实很慢,这个值可以设置大一些。
分组双击:可选最后空白通道、从头清空通道,就是双击设备父节点的时候,是从哪个通道开始打开,如果选择的是最后空白通道,则会从通道1开始遍历找到第一个空白的通道依次打开,如果选择的是从头清空通道,则每次都是全部清空再从通道1开始打开。
设备双击:可选最后空白通道、最后按下通道,就是双击设备子节点的时候,是在哪个通道打开视频,如果选择的是最后空白通道,则会从通道1开始遍历找到第一个空白的通道打开视频,如果选择的是最后按下通道,则对按下的通道先删除再打开视频。
表格策略:摄像机管理中,对应表格是按下进入编辑状态还是双击进入编辑状态。
视频边框:视频控件边框大小,用户根据实际需要选择即可。
参数说明
远程同步:开启后将会启用云端数据同步功能,将本地数据实时同步到远程数据库中。
主机类型:和本地数据库设置一样,可选多种。
数据库名:对应数据库的数据库名称,一个数据库系统中可以有多个数据库实例。
主机地址:数据库所在的网络地址,可以是IP地址或者网址。
通信端口:数据库开放通信的端口,不同数据库默认端口不同,比如mysql是3306,postgres是5432,sqlserver是1433。
用户名称:登录到网络数据库对应的用户名称,所有的网络型数据库都需要用户认证。sqlite是文件型数据库一般不需要认证。
用户密码:登录到网络数据库对应的用户密码,所有的网络型数据库都需要用户认证。sqlite是文件型数据库一般不需要认证。
连接测试:单击后主动连接一次当前填入的数据库信息,连接成功与失败都会弹框提示。
初始数据:单击后会执行sql脚本文件,重置数据库,会将原来的数据一并清空。务必记得只有需要的时候才执行。
其他说明
默认提供了数据库脚本文件(拓展名sql结尾的文件)。
单击初始化数据按钮可以对整个数据库进行新建和重置,相当于恢复出厂。
系统支持多种数据库,默认sqlite(Qt内置的数据库,无需安装),可选mysql、postgresql、oracle、人大金仓等。
具体还需要对应Qt版本有数据库插件支持,没有插件支持可以自行编译对应缺失的插件比如mysql,也可选直接通过万能的ODBC来连接。
除了sqlite数据库外,其余数据库都需要输入数据库名称、主机地址、通信端口、用户名称、用户密码信息,输入好以后可以单击连接测试按钮测试下是否正常。
默认提供的是mysql的动态库libmysql.dll,需要放到可执行文件同一目录,严格区分32位和64位的动态库。
xxxxxxxxxx
381//数据库类型枚举
2enum DbType {
3 DbType_ODBC = 0, //odbc数据源
4 DbType_Sqlite = 1, //sqlite数据库
5 DbType_MySql = 2, //mysql数据库
6 DbType_PostgreSQL = 3, //postgresql数据库
7 DbType_SqlServer = 4, //sqlserver数据库
8 DbType_Oracle = 5, //oracle数据库
9 DbType_KingBase = 6, //人大金仓数据库
10 DbType_Other = 255 //其他数据库
11};
12
-
13//自动切换默认数据库端口
14void DbHelper::getDbDefaultInfo(const QString &dbType, QString &hostPort,
15 QString &userName, QString &userPwd)
16{
17 if (dbType == "MYSQL") {
18 hostPort = "3306";
19 userName = "root";
20 userPwd = "root";
21 } else if (dbType == "SQLSERVER") {
22 hostPort = "1433";
23 userName = "sa";
24 userPwd = "123456";
25 } else if (dbType == "POSTGRESQL") {
26 hostPort = "5432";
27 userName = "postgres";
28 userPwd = "123456";
29 } else if (dbType == "ORACLE") {
30 hostPort = "1521";
31 userName = "system";
32 userPwd = "123456";
33 } else if (dbType == "KINGBASE") {
34 hostPort = "54321";
35 userName = "SYSTEM";
36 userPwd = "123456";
37 }
38}
参数说明
地图秘钥:对应百度地图的秘钥,默认内置的作者的秘钥,很多软件系统都用的这个秘钥,用户数较多,可能有并发限制,为了不影响体验,强烈建议改成自己的,可以自行去官网申请,免费。
地图中心:默认地图的中心点坐标。
地图级别:默认地图打开以后的缩放级别。
参数说明
勾选则表示启用。
可以对各种分屏进行功能激活。
需要重启应用。
没有勾选的,不会显示对应的菜单切换和分屏快捷按钮。
多个子界面模块也可以选择显示或者隐藏,以便将不需要的模块隐藏掉,碍眼。
可以设置不同的场景不同的颜色,比如正常的系统消息显示白色,异常消息红色。
本系统所用的录像机信息,并没有实际的作用,也就是不一定要填写实际的录像机信息,留作备用后期使用,目前仅仅是作为生成设备的树状列表使用(类似于区域或分组),如果一个录像机都没有填写,则会自动生成一个默认的录像机信息。
字段说明
设备编号:录像机的编号,唯一字段。
设备名称:录像机的别名,建议不要重复。
设备类型:录像机的厂家类型,可选海康、大华、宇视、其他等。
设备地址:录像机的IP地址。
用户姓名:录像机的登录用户名称。
用户密码:录像机的登录用户密码。
启用状态:录像机设备是否启用。
安装位置:录像机的安装位置。
单击添加按钮,会自动规则生成默认的信息,直接表格中修改即可,修改好以后单击保存按钮保存所有的信息。
如果要删除某个录像机信息,需要先选中该行,然后单击删除按钮,删除后会自动保存。
单击清空按钮会对整个表进行清空操作,清空后数据不能恢复,慎用。
单击导入按钮,可以选择之前导出的csv格式的文件导入数据。
单击导出按钮,将表格数据导出到csv格式的文件,用户可以打开文件编辑,然后再次导入,这样可以作为简易的备份机制使用,也可将繁琐的基础数据录入交给小姑娘去做。
单击打印按钮可以将表格中的内容打印出来,打印前会弹出打印预览界面,可以自行做边距的调整等,可以查看等待打印的内容,翻页切换。
单击导出按钮可以将表格中的内容导出到excel表格,独创的excel导出数据算法,极速导出,支持任意系统,无依赖。
摄像机表信息,是整个系统中最核心的表,这里管理的所有的摄像机信息,并不是所有的字段都显示出来了,比如onvif地址、云台地址等都是隐藏的,因为无需添加更改,需要搜索自动添加的。
字段说明
设备编号:摄像机的唯一编号。
设备名称:摄像机的别名,建议不要重复。
录 像 机:该摄像机对应所属的录像机,随便选择一个就行。
设备厂家:摄像机的厂家类型,通过onvif搜索会自动有厂家信息,没有的就选择其他。
主码流地址:摄像机的主码流地址。
子码流地址:摄像机的子码流地址。
经 纬 度:摄像机的经纬度信息,用来地图上显示位置,中间用 | 隔开。
背景地图:摄像机对应的平面地图,下拉选择。
用户姓名:摄像机登录的用户名称。
用户密码:摄像机登录的用户密码。
启用状态:摄像机是否启用。
安装位置:摄像机的安装位置。
单击添加按钮,会自动规则生成默认的信息,直接表格中修改即可,修改好以后单击保存按钮保存所有的信息。
如果要删除某个摄像机信息,需要先选中该行,然后单击删除按钮,删除后会自动保存。
单击清空按钮会对整个表进行清空操作,清空后数据不能恢复,慎用。
单击导入按钮,可以选择之前导出的csv格式的文件导入数据。
单击导出按钮,将表格数据导出到csv格式的文件,用户可以打开文件编辑,然后再次导入,这样可以作为简易的备份机制使用,也可将繁琐的基础数据录入交给小姑娘去做。
单击打印按钮可以将表格中的内容打印出来,打印前会弹出打印预览界面,可以自行做边距的调整等,可以查看等待打印的内容,翻页切换。
单击导出按钮可以将表格中的内容导出到excel表格,独创的excel导出数据算法,极速导出,支持任意系统,无依赖。
如果摄像机已经添加过,则搜索出来的摄像机对应行禁用不可选中。
基本步骤
第一步:单击广播搜索按钮,搜索到的设备会显示在左侧表格中。
第二步:输入onvif用户名和密码,注意是onvif的用户信息,一个摄像机可能有多种用户,比如登录用户,远程用户,onvif用户,务必记得要用onvif用户信息,可参阅说明书的末尾海康大华的onvif设置。
第三步:单击获取所有,会自动以填写的onvif用户信息,去拉取具体摄像机的码流地址、云台地址等信息,可以拉动底部的横向滚动条查看具体是否获取到信息。
第四步:单击添加选中按钮将所有勾选了复选框的设备添加到摄像机信息表中。
特别说明
如果没有码流地址,是添加不了的,必须有码流地址才能添加。
一般一个项目上的摄像机都是同一个品牌的,onvif用户信息也都一样,所以单击获取所有可以把所有摄像机的信息获取到。
可以填入不同的onvif用户信息,单击获取当前按钮来指定摄像机获取onvif信息。
如果有些设备不支持广播,只支持单播(比如不是同一网段的设备,但是路由器设置过,是通的),则指定设备右侧填写好IP地址或者onvif地址,再单击单播搜索即可。
一台电脑可能多个网卡和IP网段,可以选择不同的网卡进行搜索。
录像机信息和摄像机信息的更改,是自动应用的,无需重启。
搜索后的设备信息自动添加到表格中,按照IP地址升序排序,支持跨网段排序,自动将IP地址转为quint32整型进行排序,而不是取IP地址末尾。
参数说明
用户姓名:onvif用户的名称,默认admin。
用户密码:onvif用户的密码,默认admin。
选择网卡:选择对应电脑的网卡IP,可能有多个网段,onvif只能同一个网段。
指定设备:对指定的IP地址或者onvif地址进行onvif搜索。
过滤设备:对返回的onvif地址进行过滤,一种厂家的类别的设备地址格式一样。
搜索间隔:默认onvif搜索指令有好几种,会重发几次,指定发送的间隔。
搜索策略:默认自动清空,每次都重新添加搜索到的设备,如果选择设备累加则多次搜索后只会将新增加的设备加到设备列表,这个非常有用,在很多设备现场建议用设备累加策略而不是自动清空,因为onvif协议是udp协议,在大量数据的情况下会导致丢包,需要多次搜索,取最终的设备集合。
广播搜索:广播搜索指定网卡的所有onvif设备。
单播搜索:对指定设备进行单个搜索。
获取所有:按照当前填入的用户姓名和密码,填充到onvif请求鉴权中对所有搜索的设备进行媒体地址的获取、云台控制地址的获取、视频流地址的获取等。
获取当前:很多时候并不是所有的设备onvif用户信息一样,对于不一样的,可以先选中设备所在行,然后输入不同的用户信息,单击获取当前即可,会对当前选中的设备重新获取onvif信息。
添加选中:搜索到的设备前面都有个复选框,单击添加选中以后会对所有打钩的设备批量添加到摄像机信息表中,会自动过滤已经添加过的设备以及没有视频流地址的设备。
添加当前:对应获取当前,一般来说单个添加用户信息不一样的设备,因为批量添加不了,他的信息需要单独获取。
轮询点管理界面,上侧是轮询点信息表,可以直接添加、删除、修改、清空轮询点信息,下侧是摄像机信息表,会自动加载,当摄像机信息变动后,这里会自动加载最新的数据。右下角是批量生成轮询点和轮询分组管理。
轮询点的添加有三种方式:手动添加、单个添加、批量添加。允许重复添加,没有过滤机制。
添加方式
手动添加:单击添加按钮,在右侧轮询信息表格中自动生成默认轮询点信息,手动输入和修改信息然后单击保存按钮即可。
单个添加:左侧摄像机信息表中选中一行,单击添加当前按钮,会将选中的摄像机信息添加到右侧轮询点信息中,自动保存。
批量添加:单击添加所有按钮,会将所有摄像机信息添加到右侧轮询点信息中,自动保存。
如果要删除某个轮询点信息,需要先选中该行,然后单击删除按钮,删除后会自动保存。
单击清空按钮会对整个表进行清空操作,清空后数据不能恢复,慎用。
单击导入按钮,可以选择之前导出的csv格式的文件导入数据。
单击导出按钮,将表格数据导出到csv格式的文件,用户可以打开文件编辑,然后再次导入,这样可以作为简易的备份机制使用,也可将繁琐的基础数据录入交给小姑娘去做。
单击打印按钮可以将表格中的内容打印出来,打印前会弹出打印预览界面,可以自行做边距的调整等,可以查看等待打印的内容,翻页切换。
单击导出按钮可以将表格中的内容导出到excel表格,独创的excel导出数据算法,极速导出,支持任意系统,无依赖。
参数说明
自动轮询:开启以后,启动软件后自动轮询。
轮询间隔:画面切换的间隔,单位秒,建议时间长一点。
轮询画面:轮询的画面数,可选1画面、4画面、9画面、16画面。
码流类型:默认子码流,超过4画面建议子码流。
轮询表信息可以通过已添加的摄像机信息表选中添加,也可以自定义规则批量生成视频流地址添加,这种应用场景非常多,比如现场是某一种品牌的摄像机,视频流格式固定,只需要设置好主码流子码流的视频流格式,便可批量生成。
参数说明
生成数量: 需要批量生成多少个。
起始地址:如果选择的是文件,则填写对应的数字,其他则填写IP地址。
地址格式:可选各种厂家类型,还可选择文件,这个用于测试软件非常有用。
可添加、删除、修改、清空轮询分组名称,相当于轮询预案。
用户管理是后面增加的一个模块,用于设置不同的用户不同的类型+权限,可以细分到每个模块的权限,勾选表示具有该权限,内置了7种权限选择,后期还可以在此基础上增加其他权限等。
单击添加按钮,会自动规则生成默认的信息,直接表格中修改即可,修改好以后单击保存按钮保存所有的信息。
如果要删除某个用户信息,需要先选中该行,然后单击删除按钮,删除后会自动保存。不允许删除内置的admin用户。
单击清空按钮会对整个表进行清空操作,清空后数据不能恢复,慎用。
单击导入按钮,可以选择之前导出的csv格式的文件导入数据。
单击导出按钮,将表格数据导出到csv格式的文件,用户可以打开文件编辑,然后再次导入,这样可以作为简易的备份机制使用,也可将繁琐的基础数据录入交给小姑娘去做。
+https://blog.csdn.net/feiyangqingyun/article/details/104005917
请下载同目录下的bin_map_tiles.zip压缩包,解压到config目录下,最后config文件夹下会多出来tiles tiles_hybrid两个文件夹。
在摄像机管理的界面,可以添加经纬度信息,这样就可以在地图上显示对应的摄像机点位信息,如果发现位置不对,可以在右侧先选择摄像机设备,然后鼠标单击新的位置,右侧目标经度、目标纬度信息会自动更新,然后再单击更新经纬度值则会更新当前下拉选择的设备的经纬度信息,也可以在摄像机管理界面手动填入进行修改。
在右侧还有模拟运动轨迹、开始显示轨迹两个按钮,有可能后期还会增加其他功能,是为了演示如何在地图上实现地图的相关功能,开始显示轨迹采用的定时器来生成轨迹点数据,动态模拟运动轨迹,可以单击显示设备位置按钮还原最初的设备点位图。
功能特点
同时支持在线地图和离线地图两种模式。
同时支持webkit内核、webengine内核、IE内核。
支持设置多个标注点,信息包括名称、地址、经纬度。
可设置地图是否可单击、拖动、鼠标滚轮缩放。
可设置协议版本、秘钥、主题样式、中心坐标、中心城市、地理编码位置等。
可设置地图缩放比例和级别,缩略图、比例尺、路况信息等控件的可见。
支持地图交互,比如鼠标按下获取对应位置的经纬度。
支持查询路线,可设置起点位置、终点位置、路线模式、路线方式、路线方案(最少时间、最少换乘、最少步行、不乘地铁、最短距离、避开高速)。
可显示点线面工具,可直接在地图上划线、点、矩形、圆形等。
可设置行政区划,指定某个城市区域绘制图层,在线地图自动输出行政区划边界点集合到js文件给离线地图使用。
可静态或者动态添加多个覆盖物。支持点、折线、多边形、矩形、圆形、弧线、点聚合等。
函数接口友好和统一,使用简单方便,就一个类。
支持js动态交互添加点、删除点、清空点、重置点,不需要刷新页面。
支持任意Qt版本、任意系统、任意编译器。
基本步骤
输入起点坐标和终点坐标,也可以勾选地图选点,开启后直接在左侧的地图界面鼠标按下自动识别对应的经纬度坐标填入,单选框勾选的起点则填入起点坐标输入框中,勾选的终点就填入终点坐标输入框中。
选择路线方式,可选公交、驾车、步行、骑行等方式,默认选择步行。
选择路线方案,可选最少时间、最短距离、避开高速等。
输入关键点数,一般查询返回的路径的经纬度坐标点数非常密集,可能非常多,我们需要根据输入的关键点数来过滤,比如输入30,表示从所有经纬度数据中平均提取出来30个数据就行。点数合计,查询路线后自动返回所有经纬度坐标的数据个数。
单击查询路线,自动返回对应路径的所有经纬度坐标。
单击帅选数据,按照填入的关键点数进行数据帅选,在下方可以看到原始数据和最终数据,选中某个数据,自动在左侧生成点预览对应的位置。
单击模拟轨迹,会启动定时器,从第一个数据点开始,自动移动设备比如机器人、飞行器等,查看整个轨迹点路径是否正确。
本地日志存放的是本系统的操作日志,比如用户登录退出、记录删除、设备报警等操作,都会有对应的记录存放的数据库,可以在这里选择时间段和日志类型进行查询。查询后的日志记录可以翻页查看,还可以直接支持指定页码跳转,(此翻页组件超级牛逼,外观和功能分离,自动计算页码切换导航,具体可参见对应类的头文件功能描述),每页显示多少条记录在系统设置中可以设置。
可以按照多条件进行查询记录。
可以选择设备通道。
可以选择日志的类型:用户操作、运行日志、设备日志、报警日志。
可以选择时间范围。
在查询记录的时候,如果勾选了前面的复选框则表示启用该选择条件进行查询。
没有勾选,就算后面选择了类型等,也是按照where 1=1 条件查询的。
查询后的记录会自动分页显示,而不是一次性显示。
可以单击底部的翻页按钮进行翻页查看记录。
可以快速切换到第一页、末一页、上一页、下一页、显示的页码切换、指定的页码切换。
单击打印按钮,会将当前查询的记录打印出来,自动分页。打印前会弹出打印预览对话框,可以最后在这里调整边距、纸张等设置参数。
单击XLS按钮可以将表格中的内容导出到excel表格,独创的excel导出数据算法,极速导出,支持任意系统,无依赖。
单击删除按钮,会弹出时间范围选择对话框,选择要删除的记录的开始时间和结束时间,单击确定,会将该时间段内的记录全部删除,结束时间必须大于开始时间。
单击清空按钮会先弹出询问框提示是否需要清空数据,单击确定则自动清空所有的记录,清空后不能恢复。
设备日志是指直接通过sdk协议,远程从NVR设备上拉取日志记录到本地显示,其余功能和本地日志一致,此功能未实现。
基本设置中有部分参数的切换会自动重启应用。
参数说明
开机运行:开启以后自动随着系统启动运行,默认开启。
自动登录:开启以后会自动以最后登录的用户信息登录到系统,默认关闭。
记住密码:开启以后会自动填入最后登录的用户信息到登录窗体,默认关闭。
中文标题:软件左上角标题栏的中文标题,改动立即应用。
英文标题:软件左上角标题栏的英文标题,改动立即应用。
版权所有:当前软件版权所有的公司,目前没有显示在哪里,备用。
调试日志:开启后会将打印日志输出到日志文件,默认关闭,日志文件存放在可执行文件夹下的log目录下。
运行时间:开启后会实时记录系统的运行时间,记录当前软件启动后运行了多久,运行时间文件存放在可执行文件夹下的log目录下。
工作模式:默认视频监控,可选机器人监控、无人机监控等。
导航样式:用于选择顶部导航栏和左侧导航栏的样式,上侧+左侧表示顶部导航栏上侧样式(图标在上面,文字在下面),左侧导航栏左侧样式(图标在左侧,文字在右侧)。
界面样式:系统自带17套皮肤,可以在这里自动换肤,默认视频黑。
软件图标:自动从logo文件夹读取,可以自行选择对应的logo文件。
全屏模式:开启以后,最大化显示自动全屏显示而不是最大化显示,默认关闭。
弹框时间:右下角弹出提示信息自动关闭时间,0秒表示常驻不关闭。
报警声音:0表示不启用,其余表示报警后播放的声音次数。
鼠标隐藏:主界面多久鼠标没有操作过会自动隐藏鼠标指针,一般在全屏轮询的时候需要设置,效果会更好。
自动全屏:经过多久以后鼠标没有操作过自动全屏,0表示不启用。
播放记录:如果开启在软件打开后会自动读取上一次的播放记录并自动打开,不需要可以关闭。
图文警情:图文警情模块消息行数,0表示自动计算填满,不产生滚动条。
窗口消息:窗口消息模块消息行数,0表示自动计算填满,不产生滚动条。
透明度值:停靠窗体的透明度值,可调节,动态应用。
参数说明
共享解码:开启后相同地址的通道会复用之前已经打开的通道,这样可以大大节省网络流量和解码压力。
播放音频:开启以后可以播放声音,有时候不需要声音的时候可以关闭,节省资源。
保存视频:录像计划的总开关,开启以后自动存储录像文件,目录在可执行文件目录video_normal。
事件订阅:开启以后会用onvif的机制订阅报警事件。
自动校时:开启后摄像机上线立即同步本地时间到设备。
人工智能:用于演示绘制osd标签和添加各种图形绘制到视频图片上。
画面显示:可选自动调整、等比缩放、拉伸填充三种图片显示策略。
显示模式:可选句柄、绘制、GPU三种模式,在ffmpeg内核下句柄和GPU都是同一种处理。
硬件加速:会根据不同的内核以及不同的系统自动显示不同的可用的加速器名称,默认none表示不启用硬件加速,ffmpeg可选dxva2和d3d11va,建议用dxva2。
通信方式:视频流采用何种通信方式,默认TCP(可靠连接,不会丢包,缺点就是慢),可选UDP(不可靠连接,容易丢包,但是速度快)。
解码策略:ffmpeg内核专用,可选速度优先、质量优先、均衡处理、最快速度,如果对实时视频流rtsp有实时性要求建议选择最快速度,可以看到无论是打开加载视频流还是响应都是最快的。
缓存大小:vlc内核专用,值越小响应速度越快,受限于网络环境和硬件性能。
读取超时:读取视频流过程的超时时间,可选不处理或者具体的秒数,不处理则一直等待直到系统层通知读取失败,选择的话可以加快速度跳出并立即通知失败,建议设置5s,在网络环境不好或者网络中断的情况下能够快速识别到掉线。
连接超时:对于视频流地址可用,先探测对应的地址是否通,不通则不用继续,加载很慢的一些网络地址需要把时间设置大一些,可以尝试用vlc等第三方播放器打开地址对比速度,如果确实很慢,这个值可以设置大一些。
分组双击:可选最后空白通道、从头清空通道,就是双击设备父节点的时候,是从哪个通道开始打开,如果选择的是最后空白通道,则会从通道1开始遍历找到第一个空白的通道依次打开,如果选择的是从头清空通道,则每次都是全部清空再从通道1开始打开。
设备双击:可选最后空白通道、最后按下通道,就是双击设备子节点的时候,是在哪个通道打开视频,如果选择的是最后空白通道,则会从通道1开始遍历找到第一个空白的通道打开视频,如果选择的是最后按下通道,则对按下的通道先删除再打开视频。
表格策略:摄像机管理中,对应表格是按下进入编辑状态还是双击进入编辑状态。
视频边框:视频控件边框大小,用户根据实际需要选择即可。
参数说明
远程同步:开启后将会启用云端数据同步功能,将本地数据实时同步到远程数据库中。
主机类型:和本地数据库设置一样,可选多种。
数据库名:对应数据库的数据库名称,一个数据库系统中可以有多个数据库实例。
主机地址:数据库所在的网络地址,可以是IP地址或者网址。
通信端口:数据库开放通信的端口,不同数据库默认端口不同,比如mysql是3306,postgres是5432,sqlserver是1433。
用户名称:登录到网络数据库对应的用户名称,所有的网络型数据库都需要用户认证。sqlite是文件型数据库一般不需要认证。
用户密码:登录到网络数据库对应的用户密码,所有的网络型数据库都需要用户认证。sqlite是文件型数据库一般不需要认证。
连接测试:单击后主动连接一次当前填入的数据库信息,连接成功与失败都会弹框提示。
初始数据:单击后会执行sql脚本文件,重置数据库,会将原来的数据一并清空。务必记得只有需要的时候才执行。
其他说明
默认提供了数据库脚本文件(源码下的file/db/video_system.sql)。
单击初始化数据按钮可以对整个数据库进行新建和重置,相当于恢复出厂。
系统支持多种数据库,默认sqlite(Qt内置的数据库,无需安装),可选mysql、postgresql、oracle、人大金仓等。
具体还需要对应Qt版本有数据库插件支持,没有插件支持可以自行编译对应缺失的插件比如mysql,也可选直接通过万能的ODBC来连接。
除了sqlite数据库外,其余数据库都需要输入数据库名称、主机地址、通信端口、用户名称、用户密码信息,输入好以后可以单击连接测试按钮测试下是否正常。
默认提供的是mysql的动态库libmysql.dll,需要放到可执行文件同一目录,严格区分32位和64位的动态库。
xxxxxxxxxx
381//数据库类型枚举
2enum DbType {
3 DbType_ODBC = 0, //odbc数据源
4 DbType_Sqlite = 1, //sqlite数据库
5 DbType_MySql = 2, //mysql数据库
6 DbType_PostgreSQL = 3, //postgresql数据库
7 DbType_SqlServer = 4, //sqlserver数据库
8 DbType_Oracle = 5, //oracle数据库
9 DbType_KingBase = 6, //人大金仓数据库
10 DbType_Other = 255 //其他数据库
11};
12
+
13//自动切换默认数据库端口
14void DbHelper::getDbDefaultInfo(const QString &dbType, QString &hostPort,
15 QString &userName, QString &userPwd)
16{
17 if (dbType == "MYSQL") {
18 hostPort = "3306";
19 userName = "root";
20 userPwd = "root";
21 } else if (dbType == "SQLSERVER") {
22 hostPort = "1433";
23 userName = "sa";
24 userPwd = "123456";
25 } else if (dbType == "POSTGRESQL") {
26 hostPort = "5432";
27 userName = "postgres";
28 userPwd = "123456";
29 } else if (dbType == "ORACLE") {
30 hostPort = "1521";
31 userName = "system";
32 userPwd = "123456";
33 } else if (dbType == "KINGBASE") {
34 hostPort = "54321";
35 userName = "SYSTEM";
36 userPwd = "123456";
37 }
38}
参数说明
地图秘钥:对应百度地图的秘钥,默认内置的作者的秘钥,很多软件系统都用的这个秘钥,用户数较多,可能有并发限制,为了不影响体验,强烈建议改成自己的,可以自行去官网申请,免费。
地图中心:默认地图的中心点坐标。
地图级别:默认地图打开以后的缩放级别。
参数说明
勾选则表示启用。
可以对各种分屏进行功能激活。
需要重启应用。
没有勾选的,不会显示对应的菜单切换和分屏快捷按钮。
多个子界面模块也可以选择显示或者隐藏,以便将不需要的模块隐藏掉,碍眼。
可以设置不同的场景不同的颜色,比如正常的系统消息显示白色,异常消息红色。
本系统所用的录像机信息,并没有实际的作用,也就是不一定要填写实际的录像机信息,留作备用后期使用,目前仅仅是作为生成设备的树状列表使用(类似于区域或分组),如果一个录像机都没有填写,则会自动生成一个默认的录像机信息。
字段说明
设备编号:录像机的编号,唯一字段。
设备名称:录像机的别名,建议不要重复。
设备类型:录像机的厂家类型,可选海康、大华、宇视、其他等。
设备地址:录像机的IP地址。
用户姓名:录像机的登录用户名称。
用户密码:录像机的登录用户密码。
启用状态:录像机设备是否启用。
安装位置:录像机的安装位置。
单击添加按钮,会自动规则生成默认的信息,直接表格中修改即可,修改好以后单击保存按钮保存所有的信息。
如果要删除某个录像机信息,需要先选中该行,然后单击删除按钮,删除后会自动保存。
单击清空按钮会对整个表进行清空操作,清空后数据不能恢复,慎用。
单击导入按钮,可以选择之前导出的csv格式的文件导入数据。
单击导出按钮,将表格数据导出到csv格式的文件,用户可以打开文件编辑,然后再次导入,这样可以作为简易的备份机制使用,也可将繁琐的基础数据录入交给小姑娘去做。
单击打印按钮可以将表格中的内容打印出来,打印前会弹出打印预览界面,可以自行做边距的调整等,可以查看等待打印的内容,翻页切换。
单击导出按钮可以将表格中的内容导出到excel表格,独创的excel导出数据算法,极速导出,支持任意系统,无依赖。
摄像机表信息,是整个系统中最核心的表,这里管理的所有的摄像机信息,并不是所有的字段都显示出来了,比如onvif地址、云台地址等都是隐藏的,因为无需添加更改,需要搜索自动添加的。
字段说明
设备编号:摄像机的唯一编号。
设备名称:摄像机的别名,建议不要重复。
录 像 机:该摄像机对应所属的录像机,随便选择一个就行。
设备厂家:摄像机的厂家类型,通过onvif搜索会自动有厂家信息,没有的就选择其他。
主码流地址:摄像机的主码流地址。
子码流地址:摄像机的子码流地址。
经 纬 度:摄像机的经纬度信息,用来地图上显示位置,中间用 | 隔开。
背景地图:摄像机对应的平面地图,下拉选择,默认从可执行文件下的map目录下读取图片文件列表生成。
用户姓名:摄像机登录的用户名称。
用户密码:摄像机登录的用户密码。
启用状态:摄像机是否启用。
安装位置:摄像机的安装位置。
单击添加按钮,会自动规则生成默认的信息,直接表格中修改即可,修改好以后单击保存按钮保存所有的信息。
如果要删除某个摄像机信息,需要先选中该行,然后单击删除按钮,删除后会自动保存。
单击清空按钮会对整个表进行清空操作,清空后数据不能恢复,慎用。
单击导入按钮,可以选择之前导出的csv格式的文件导入数据。
单击导出按钮,将表格数据导出到csv格式的文件,用户可以打开文件编辑,然后再次导入,这样可以作为简易的备份机制使用,也可将繁琐的基础数据录入交给小姑娘去做。
单击打印按钮可以将表格中的内容打印出来,打印前会弹出打印预览界面,可以自行做边距的调整等,可以查看等待打印的内容,翻页切换。
单击导出按钮可以将表格中的内容导出到excel表格,独创的excel导出数据算法,极速导出,支持任意系统,无依赖。
如果摄像机已经添加过,则搜索出来的摄像机对应行禁用不可选中。
基本步骤
第一步:单击广播搜索按钮,搜索到的设备会显示在左侧表格中。
第二步:输入onvif用户名和密码,注意是onvif的用户信息,一个摄像机可能有多种用户,比如登录用户,远程用户,onvif用户,务必记得要用onvif用户信息,可参阅说明书的末尾海康大华的onvif设置。
第三步:单击获取所有,会自动以填写的onvif用户信息,去拉取具体摄像机的码流地址、云台地址等信息,可以拉动底部的横向滚动条查看具体是否获取到信息。
第四步:单击添加选中按钮将所有勾选了复选框的设备添加到摄像机信息表中。
特别说明
如果没有码流地址,是添加不了的,必须有码流地址才能添加。
一般一个项目上的摄像机都是同一个品牌的,onvif用户信息也都一样,所以单击获取所有可以把所有摄像机的信息获取到。
可以填入不同的onvif用户信息,单击获取当前按钮来指定摄像机获取onvif信息。
如果有些设备不支持广播,只支持单播(比如不是同一网段的设备,但是路由器设置过,是通的),则指定设备右侧填写好IP地址或者onvif地址,再单击单播搜索即可。
一台电脑可能多个网卡和IP网段,可以选择不同的网卡进行搜索。
录像机信息和摄像机信息的更改,是自动应用的,无需重启。
搜索后的设备信息自动添加到表格中,按照IP地址升序排序,支持跨网段排序,自动将IP地址转为quint32整型进行排序,而不是取IP地址末尾。
参数说明
用户姓名:onvif用户的名称,默认admin。
用户密码:onvif用户的密码,默认admin。
选择网卡:选择对应电脑的网卡IP,可能有多个网段,onvif只能同一个网段。
指定设备:对指定的IP地址或者onvif地址进行onvif搜索。
过滤设备:对返回的onvif地址进行过滤,一种厂家的类别的设备地址格式一样。
搜索间隔:默认onvif搜索指令有好几种,会重发几次,指定发送的间隔。
搜索策略:默认自动清空,每次都重新添加搜索到的设备,如果选择设备累加则多次搜索后只会将新增加的设备加到设备列表,这个非常有用,在很多设备现场建议用设备累加策略而不是自动清空,因为onvif协议是udp协议,在大量数据的情况下会导致丢包,需要多次搜索,取最终的设备集合。
广播搜索:广播搜索指定网卡的所有onvif设备。
单播搜索:对指定设备进行单个搜索。
获取所有:按照当前填入的用户姓名和密码,填充到onvif请求鉴权中对所有搜索的设备进行媒体地址的获取、云台控制地址的获取、视频流地址的获取等。
获取当前:很多时候并不是所有的设备onvif用户信息一样,对于不一样的,可以先选中设备所在行,然后输入不同的用户信息,单击获取当前即可,会对当前选中的设备重新获取onvif信息。
添加选中:搜索到的设备前面都有个复选框,单击添加选中以后会对所有打钩的设备批量添加到摄像机信息表中,会自动过滤已经添加过的设备以及没有视频流地址的设备。
添加当前:对应获取当前,一般来说单个添加用户信息不一样的设备,因为批量添加不了,他的信息需要单独获取。
轮询点管理界面,上侧是轮询点信息表,可以直接添加、删除、修改、清空轮询点信息,下侧是摄像机信息表,会自动加载,当摄像机信息变动后,这里会自动加载最新的数据。右下角是批量生成轮询点和轮询分组管理。
轮询点的添加有三种方式:手动添加、单个添加、批量添加。允许重复添加,没有过滤机制。
添加方式
手动添加:单击添加按钮,在右侧轮询信息表格中自动生成默认轮询点信息,手动输入和修改信息然后单击保存按钮即可。
单个添加:左侧摄像机信息表中选中一行,单击添加当前按钮,会将选中的摄像机信息添加到右侧轮询点信息中,自动保存。
批量添加:单击添加所有按钮,会将所有摄像机信息添加到右侧轮询点信息中,自动保存。
如果要删除某个轮询点信息,需要先选中该行,然后单击删除按钮,删除后会自动保存。
单击清空按钮会对整个表进行清空操作,清空后数据不能恢复,慎用。
单击导入按钮,可以选择之前导出的csv格式的文件导入数据。
单击导出按钮,将表格数据导出到csv格式的文件,用户可以打开文件编辑,然后再次导入,这样可以作为简易的备份机制使用,也可将繁琐的基础数据录入交给小姑娘去做。
单击打印按钮可以将表格中的内容打印出来,打印前会弹出打印预览界面,可以自行做边距的调整等,可以查看等待打印的内容,翻页切换。
单击导出按钮可以将表格中的内容导出到excel表格,独创的excel导出数据算法,极速导出,支持任意系统,无依赖。
参数说明
自动轮询:开启以后,启动软件后自动轮询。
轮询间隔:画面切换的间隔,单位秒,建议时间长一点。
轮询画面:轮询的画面数,可选1画面、4画面、9画面、16画面。
码流类型:默认子码流,超过4画面建议子码流。
轮询表信息可以通过已添加的摄像机信息表选中添加,也可以自定义规则批量生成视频流地址添加,这种应用场景非常多,比如现场是某一种品牌的摄像机,视频流格式固定,只需要设置好主码流子码流的视频流格式,便可批量生成。
参数说明
生成数量: 需要批量生成多少个。
起始地址:如果选择的是文件,则填写对应的数字,其他则填写IP地址。
地址格式:可选各种厂家类型,还可选择文件,这个用于测试软件非常有用。
可添加、删除、修改、清空轮询分组名称,相当于轮询预案。
用户管理是后面增加的一个模块,用于设置不同的用户不同的类型+权限,可以细分到每个模块的权限,勾选表示具有该权限,内置了7种权限选择,后期还可以在此基础上增加其他权限等。
单击添加按钮,会自动规则生成默认的信息,直接表格中修改即可,修改好以后单击保存按钮保存所有的信息。
如果要删除某个用户信息,需要先选中该行,然后单击删除按钮,删除后会自动保存。不允许删除内置的admin用户。
单击清空按钮会对整个表进行清空操作,清空后数据不能恢复,慎用。
单击导入按钮,可以选择之前导出的csv格式的文件导入数据。
单击导出按钮,将表格数据导出到csv格式的文件,用户可以打开文件编辑,然后再次导入,这样可以作为简易的备份机制使用,也可将繁琐的基础数据录入交给小姑娘去做。
单击打印按钮可以将表格中的内容打印出来,打印前会弹出打印预览界面,可以自行做边距的调整等,可以查看等待打印的内容,翻页切换。
单击导出按钮可以将表格中的内容导出到excel表格,独创的excel导出数据算法,极速导出,支持任意系统,无依赖。
假设设置了用户没有退出系统和电子地图的权限,则关闭系统的时候会弹出错误信息提示当前用户没有权限。
-
录像文件严格按照30分钟一个文件,除了首个文件和末尾文件不一定是30分钟的文件,中间的肯定是完整的30分钟的文件,时间从00:00到29:59或者30:00到59:59。由于文件打开和保存需要一点时间,文件可能会有1s的偏差。
基本步骤:
单击批量按钮可以批量添加1-64通道7 * 24小时录像计划到数据库中。
每个通道可以设置周一到周日7天的每个半小时时段是否录像。
上面表格中选中通道,下面录像计划控件选择对应的格子即可。
可以鼠标右键选择全选、反选、清空操作。
录像计划控件更改后会立即更新表格中对应通道的录像计划值,1表示该时间段录像,0表示不录像。
选中通道表格行,下面会自动显示对应的录像计划,一目了然。
其他设置里面的内容之前在基本设置中,现在重新开一个窗体,因为后面可能还有各种各样的设置,预留空间。
系统中可能用到了多个串口通信,可以在这里选择对应的串口号和波特率。
系统中可能用到多种网络通信,比如软件主动连接服务器,需要填写TCP地址和端口,也可能软件作为服务端,填写TCP或者UDP监听端口。
切换到系统设置-》摄像机管理,单击添加,输入码流地址,单击保存。
在不知道主码流和子码流是啥的情况下,两个地方填一样的,其余默认即可。
本地文件格式:g:/mp4/1.mp4
USB摄像机:默认ffmpeg内核为 video=USB2.0 PC CAMERA
摄像机视频流:直接填入rtsp、rtmp、http的视频流地址,该地址可以先用vlc播放器或者potplay等播放器先试试是否能正常播放,不能的话就别添加了,添加了也没卵用,别费力气了。
切换到视频监控主界面,左侧设备列表,双击摄像机,自动通道播放,双击录像机则整个录像机下面的摄像机全部加载。
云台控制的前提是摄像机是通过onvif搜索的形式添加的,不然没有云台地址没法进行云台控制,当然也必须要求摄像机带云台,不带云台的摄像机是不能进行云台控制的。 +
录像文件严格按照30分钟一个文件,除了首个文件和末尾文件不一定是30分钟的文件,中间的肯定是完整的30分钟的文件,时间从00:00到29:59或者30:00到59:59。由于文件打开和保存需要时间以及保证首帧是关键帧(有些设备可以设置I帧间隔50/意味着接近2s一个关键帧),文件可能会有1-2s的偏差。
基本步骤:
单击批量按钮可以批量添加1-64通道7 * 24小时录像计划到数据库中。
每个通道可以设置周一到周日7天的每个半小时时段是否录像。
上面表格中选中通道,下面录像计划控件选择对应的格子即可。
可以鼠标右键选择全选、反选、清空操作。
录像计划控件更改后会立即更新表格中对应通道的录像计划值,1表示该时间段录像,0表示不录像。
选中通道表格行,下面会自动显示对应的录像计划,一目了然。
其他设置里面的内容之前在基本设置中,现在重新开一个窗体,因为后面可能还有各种各样的设置,预留空间。
系统中可能用到了多个串口通信,可以在这里选择对应的串口号和波特率。
系统中可能用到多种网络通信,比如软件主动连接服务器,需要填写TCP地址和端口,也可能软件作为服务端,填写TCP或者UDP监听端口。
切换到系统设置-》摄像机管理,单击添加,输入码流地址,单击保存。
在不知道主码流和子码流是啥的情况下,两个地方填一样的,其余默认即可。
本地文件格式:g:/mp4/1.mp4
USB摄像机:默认ffmpeg内核为 video=USB2.0 PC CAMERA
摄像机视频流:直接填入rtsp、rtmp、http的视频流地址,该地址可以先用vlc播放器或者potplay等播放器先试试是否能正常播放,不能的话就别添加了,添加了也没卵用,别费力气了。
切换到视频监控主界面,左侧设备列表,双击摄像机,自动通道播放,双击录像机则整个录像机下面的摄像机全部加载。
云台控制的前提是摄像机是通过onvif搜索的形式添加的,不然没有云台地址没法进行云台控制,当然也必须要求摄像机带云台,不带云台的摄像机是不能进行云台控制的。 先选中要进行云台控制的摄像机通道,边缘高亮,然后再单击右侧的云台控件,可以上下左右等移动,变倍和光圈没有用。
在系统设置中开启自动校时后,设备自动上线后会自动将本地时间同步到设备。
在系统设置中开启事件订阅后,一旦接收到设备的报警信息会显示到主界面左下角的信息栏,右下角弹出对应的报警信息。 摄像机要响应事件订阅,具体详细设置说明参见说明书其他说明中的摄像机报警输入设置。
操作说明
用onvif也可以对摄像机的明亮度、对比度、饱和度进行设置。
先选中对应的通道,然后右下角这里找到设置的区域。
单击获取参数,会自动将对应摄像机的明亮度、对比度、饱和度值读回来,显示在对应文本框和滑块中。
如果需要设置图片参数,先移动滑块到需要的值,然后单击设置参数按钮即可。
设置完以后会立即应用,传过来的视频流就能看到效果。
下面还有两个按钮可以手动重启设备以及校时。后期可能还会增加一些按钮。
本系统支持多种内核,方便不同的用户选择,适应不同的应用场景。
本系统默认集成的是ffmpeg内核,其他内核需要额外购买或者定制,支持定制内核。
每个内核实现的功能不一定完全一致,可仔细查看后面的每个内核的功能特点说明。
@@ -722,14 +722,14 @@ header, .context-menu, .megamenu-content, footer{
本系统内置高达18套皮肤样式供用户选择,可以在系统设置中随意切换立即应用。
xxxxxxxxxx
261void QUIStyle::getStyle(QStringList &styleNames, QStringList &styleFiles)
2{
3 static QStringList names;
4 if (names.count() == 0) {
5 names << "黑蓝色" << "软件黑" << "视频黑";
6 names << "深黑色" << "深蓝色" << "深灰色";
7 names << "扁平黑" << "扁平蓝" << "扁平灰";
8 names << "浅黑色" << "浅蓝色" << "浅灰色";
9 names << "普通黑" << "普通蓝" << "普通灰";
10 names << "大蓝色" << "大紫色" << "大银色";
11 }
12
13 //中文皮肤名称对应样式表文件
14 static QStringList files;
15 if (files.count() == 0) {
16 files << ":/qss/blackblue.css" << ":/qss/blacksoft.css" << ":/qss/blackvideo.css";
17 files << ":/qss/darkblack.css" << ":/qss/darkblue.css" << ":/qss/darkgray.css";
18 files << ":/qss/flatblack.css" << ":/qss/flatblue.css" << ":/qss/flatgray.css";
19 files << ":/qss/lightblack.css" << ":/qss/lightblue.css" << ":/qss/lightgray.css";
20 files << ":/qss/normalblack.css" << ":/qss/normalblue.css" << ":/qss/normalgray.css";
21 files << ":/qss/otherblue.css" << ":/qss/otherpurple.css" << ":/qss/othersilvery.css";
22 }
23
-
24 styleNames = names;
25 styleFiles = files;
26}
备注:下面的截图和说明未必是最新的,但是大部分是一致的,整体的框架不会改变,可能会有新增加子模块和代码,或者部分类文件有调整或者删除,具体以最新的代码为准。
本系统采用模块化的设备,有用到第三方开源类库比如串口通信qextserialport,全部放在3rd下面,有用到很多自己封装完善的通用类库比如ffmpeg视频监控,全部放在core下面,设备通信和辅助处理全部放在class下面,所有界面全部放在ui下面,相当于一个个小的组件合起来,最终形成了整个监控系统的完整代码。
名称 | 说明 |
---|---|
3rd | 一些第三方开源的类库,比如串口通信qextserialport。 |
class | 存放系统初始化、样式控制、自定义控件、设备通信等。 |
core | 本人一直持续更新完善的通用的类库,比如ffmpeg视频监控。 |
ui | 所有的界面都分门别类放在这里。 |
这里放的全部是第三方开源的轮子,感谢开源、感谢github、gitee等开源社区。
名称 | 说明 |
---|---|
3rd_qextserialport | 第三方串口通信qextserialport,这个类比较稳定可靠,经过了几十个项目持续数十年运行的考验,不用Qt自带的串口类。 |
具体代码不做过多说明。
这里放的都是一些系统初始化、设备通信相关的类。
名称 | 说明 |
---|---|
api | 存放数据库表映射成对应的全局队列数据、通用的辅助函数类。 |
app | 全局配置参数管理类、秘钥管理类、通用函数。 |
devicecustom | 用户自定义设备通信管理,比如机器人通信、无人机通信等。 |
devicevideo | 视频监控相关处理类,包括设备地图、表格消息、线程UI通信、人工智能处理等。 |
usercontrol | 当前系统的自定义控件全部放在这里,其中包括云台仪表盘、天气面板等控件。 |
名称 | 说明 |
---|---|
dbdata | 将数据库表映射到全局变量数据队列,比如将摄像机表ipcinfo转成QStringList存放一行行数据,这样在程序中运算比较速度极快,直接内存比较,不用每次都去读取数据库。 |
dbquery | 所有的数据库查询插入更新等操作都在这里,比如查询摄像机表、插入日志记录等。 |
名称 | 说明 |
---|---|
appconfig | 配置参数类,整个系统的配置参数存放在ini文件中,跨平台,所有参数都对应一个变量,读取配置参数的时候将值赋值给变量,写入的时候将变量值写入到配置文件。 |
appdata | 全局变量类,系统中无可避免需要一些全局变量方便处理,都放在此类,比如版本号、录像机类型、摄像机类型、当前用户信息、地图宽度高度、左侧右侧顶部底部宽高等。 |
appevent | 全局事件转发类,系统越复杂信号需要传递的层级越多,所以需要一个全局事件转发类,用来中转这些事件,这样永远只需要两层就可以收到信号进行处理,而且整个系统看起来干净整洁,不会说一个信号传递到了N个地方乱七八糟,建议需要跨层级传递的信号都放在这里中转。比如软件退出信号,可能多个界面需要收到退出信号进行保存和其他处理,如果从关闭界面发出信号传递给需要的界面,那不知道要中间层层传递多少次,有了这个全局事件转发类,你只需要将事件传给appevent,需要接收事件的地方关联这个信号就行,appevent为全局单例类,整个系统唯一。通用的一些信号有软件退出、全局样式改变、主窗体变化(0-最小化 1-最大化 2-恢复 3-关闭 4-移动 5-尺寸变化)等。 |
appinit | 程序初始化类,在main函数中,会先执行这个初始化的类,比如初始化皮肤、字体、数据库、样式等操作,这些都是要优先在窗体加载前执行的,执行完毕以后再打开窗体主界面。 |
appstyle | 全局样式管理类,整个系统的样式全部放在这里,一般加载流程是先读取样式表文件,然后将本系统独特的样式(比如开关按钮、视频监控、云台仪表盘)内容追加到后面,最后统一设置全局样式,在main函数中加载,和appinit类一样放在最前面执行。 |
appurl | 视频监控系统中常用的默认的视频地址集合。 |
名称 | 说明 |
---|---|
devicerobot | 机器人串口通信管理类。 |
devicerobot2 | 机器人串口通信管理类2,有串口数据转发功能。 |
deviceuavsserver | 无人机后端服务类,当前为空,用户自己添加。 |
deviceuavsvideo | 无人机视频监控类,将视频控件设置过来,然后就可以将自己人工智能算法处理后的图片传过来进行绘制,类似于实时视频效果。 |
名称 | 说明 |
---|---|
devicehelper | 整个系统设备管理辅助类,比如插入窗口消息、加载设备列表、加载图片地图、加载设备按钮、初始化视频控件等。 |
devicemap | 设备图片地图管理类,相当于一次性加载所有图片到内存,当要切换或者显示的时候,直接从内存取出来设置即可,速度极快,瞬间相应,纯粹是为了加快相应速度以及可能在图片上进行绘制增加的功能,比从文件系统读取图片文件显示快N倍。 |
deviceonvif | 设备onvif通信管理类,比如获取当前选中通道的onvif地址、开启事件订阅、校对时间、重启设备、获取视频参数、设置视频参数、云台控制等,这里是具体的需要和摄像机信息表及视频通道关联的处理,所以不能放到通用的onvif模块中。 |
devicethreadui | 演示线程通知UI更新,包括每隔一段时间插入消息、异步调用添加表格消息和图文警情、设备GPS移动、报警闪烁、指定通道编号设置视频和通道交换等。 |
devicevideosmart | 人工智能处理类,最常见的应用就是设置一个视频控件,然后在视频控件上绘制人脸框、文字信息等,比如设备的实时运行状态。 |
名称 | 说明 |
---|---|
gaugecloud | 云台仪表盘控件。 |
cityhelper | 省市县联动类,通过从json文件读取省市县信息。 |
weather | 城市天气类,最后显示在标题栏上,实时显示设置的城市的最近几天的天气。 |
widgetsound | 声音面板控件,主界面右下角单击弹出音量条。 |
这里放的全部是个人一直持续更新完善的独创的轮子,所有的项目都公用这些轮子,用到哪个就包含哪个进来,更新只需要更新轮子代码就行。
视频监控系统包含的轮子超级丰富给力,物超所值,涵盖了数据导出模块、数据库应用、音频播放和录制、视频播放和录制、ONVIF通信、TCP文件传输、地图应用、通用浏览器内核等。
名称 | 说明 |
---|---|
core_audio | 音频播放和录制,包括音频输入输出管理、音频曲线、音频播放、音频录制、音频振幅控件等。 |
core_common | 通用函数,包括通用秘钥、通用导航、通用样式、声音播放、日志记录、运行时间记录等。 |
core_control | 通用自定义控件,很多系统经常用到的控件全部放在这里,比如开关按钮、设备容器、设备按钮、颜色下拉框等。 |
core_dataout | 数据导入导出到xls/pdf和打印类库,极速、跨平台、无依赖。 |
core_db | 数据库通用类库比如数据库线程管理、数据清理、数据采集等。 |
core_form | 通用的用户登录、用户退出、用户管理、数据库配置界面类等。 |
core_map | 地图综合应用类库,百度地图(支持在线离线)和echart封装类等。 |
core_onvif | onvif功能封装类,包括设备搜索、云台控制、设备参数设置等。 |
core_qui | 通用的辅助类,包括自定义对话框,全局辅助函数,图形字体等。 |
core_tcpfile | 文件多线程收发类,支持多个并发。 |
core_video | 视频播放核心类,包括了监控画面切换控件、视频回放控件、视频播放组件结构体、视频播放辅助函数、视频解码线程类、视频显示控件类等。 |
core_videobase | 视频相关基类,包括音视频文件保存基类、视频解码基类、视频控件基类、视频悬浮工具栏、视频控件结构体等。 |
core_videoffmpeg | 视频监控内核ffmpeg版本,本系统默认采用的内核。 |
core_videoopengl | opengl封装类,支持打开yuv/nv12文件,绘制yuv/nv12帧数据,一般搭配ffmpeg视频内核显示视频,直接走GPU绘制。 |
core_videosave | 音视频保存组件,包括音频保存类、视频保存类、保存相关辅助函数类。 |
core_webview | 通用浏览器控件类,同时支持webkit、wenengine、miniblink三种内核,打通了所有的Qt版本。 |
名称 | 说明 |
---|---|
audiohelper | 音频相关辅助函数,比如获取音频输入输出设备、根据设备名称查找设备对象、初始化音频格式、获取对应音频格式最大振幅、获取对应音频格式音频数据的振幅级别等。 |
audiolevel | 音频振幅控件,根据传入的音频振幅大小绘制振幅,可设置颜色。 |
audioplayer | 音频播放类,可以设置声音大小和静音状态,支持带参数打开音频输入和输出设备,自动关联音频输入输出设备形成话筒和音响联动。 |
audioplot | 音频曲线类,包括初始化图表、添加振幅数据、添加音频数据等。 |
audiorecorder | 音频录制类,可以设置音频录制的参数,包括采样大小、比特率、通道数、质量级别、编码模式等。 |
名称 | 说明 |
---|---|
base64helper | 图片及文字和base64编码之间转换的类。 |
commonkey | 通用秘钥管理类,指定校验秘钥文件,可设置运行时间、设备数量等限制,支持根据硬件指纹特征生成机器码文件等。 |
commonnav | 通用菜单导航管理类,用来控制和显示顶部导航栏、左侧导航栏的样式。很多子界面需要用到,所以封装成一个专门管理这个的类。 |
commonstyle | 通用样式管理类,比如Qt自带类窗体样式、自定义控件样式、分页导航样式、导航按钮样式、开关按钮样式等。相当于将多个项目常用的自定义样式封装一起做成通用。 |
framelesswidget2 | 无边框窗体拉伸类,边框四周八个方位都可以自由拉伸,可设置是否允许拖动和拉伸。 |
playwav | 声音文件播放类,通用Qt456,自动识别当前Qt版本使用对应的类,Qt4采用QSound,Qt5以上采用QSoundEffect,嵌入式采用对应的命令行aplay、mpv来播放。 |
savelog | 日志钩子类,将系统中所有的打印信息转为日志存储或者输出到网络等,可以开启用来打印输出日志信息。 |
saveruntime | 保存运行时间类,用来存储系统启动后每隔一段时间就输出一条记录用来记录启动后软件运行了多久,方便分析问题。 |
名称 | 说明 |
---|---|
bottomwidget | 通用底部状态栏控件,可以设置软件名称、版本号、运行时间等。 |
colorcombobox | 颜色下拉框控件,在系统设置中有。 |
cpumemorylabel | CPU和内存使用情况标签控件,主界面右上角显示。 |
customtitlebar | 停靠窗体自定义标题栏控件。 |
devicebutton | 设备按钮控件,比如图片地图模块中用到,可设置不同的图标样式和状态等,双击发出信号进行相应处理比如弹出对应窗体等。 |
lcddatetime | 软件右上角显示时间的控件。 |
panelwidget | 面板容器控件,主界面子模块表格消息,就用到此控件,用于将一堆widget放到此容器进行管理,自动形成滚动条等。 |
switchbutton | 开关按钮控件,在系统设置中存在大量该控件。 |
xslider | 滑动条控件,在原有滑动条基础上增加了鼠标按下立即定位等。 |
名称 | 说明 |
---|---|
datacreat | 通用数据报表内容创建类,比如生成表格格式的html内容,然后赋值给dataprint直接打印,里面举例了图文混排的报告内容,后期会不断增加其他模板,也可以自行增加其他模板数据。 |
datacsv | 导入导出数据,csv格式,可设置分隔符。拓展名。过滤条件等。 |
datahead | 当前组件通用头文件。 |
datahelper | 辅助类,比如校验规则函数,通用数据导出+打印函数。 |
dataprint | 数据打印到pdf及纸张,支持多线程。 |
dataxls | 数据导出到xls类,支持多线程导出。 |
名称 | 说明 |
---|---|
dbcleanthread | 自动清理数据线程类。 |
dbconnthread | 数据库通信管理线程类。 |
dbdelegate | 自定义委托全家桶,包括复选框、下拉框、密码框、按钮等。 |
dbhead | 当前组件通用头文件。 |
dbhelper | 各种数据库应用函数封装,比如初始化数据库、执行sql语句等。 |
dbhttpthread | 网络请求数据采集类。 |
dbpage | 数据库通用翻页类。 |
dbpagemodel | 数据库翻页类数据模型。 |
navpage | 分页导航控件。 |
名称 | 说明 |
---|---|
formhelper | 封装的导入导出、导出数据到xls/pdf和打印数据、自动备份数据、保存最后打开的文件夹等。 |
frmconfigdb | 通用数据库管理界面类,可选不同的数据库类型,填入用户信息,执行检测连接和初始化数据操作。 |
frmconfiguser | 通用用户管理界面类,可添加、删除、修改用户信息,包括权限分配等,可导入导出打印用户信息。 |
frmlogin | 通用用户登录界面类,包括自动登录和记住密码复选框,多次密码错误校验,记住当前用户信息等。三次错误关闭,下拉可选用户,内置超级密码。 |
frmlogout | 通用用户退出界面类,三次错误关闭,下拉可选用户,内置超级密码。 |
userhelper | 通用用户权限管理类,内置7种类型权限,对应权限名称可自定义,一般在用户切换对应界面或者单击了对应功能按钮的时候触发。 |
名称 | 说明 |
---|---|
echartjs | echart模块中用到的json文件转js文件,获取js文件中的名字和经纬度等处理。 |
echarts | echart封装类,可加载仪表盘、闪烁点图、迁徙图、世界地图、区域地图等,每个点可自定义颜色和提示信息等。 |
mapbaidu | 百度地图封装类,支持在线和离线两种模式。 |
名称 | 说明 |
---|---|
onvifbase | 基础类,用于获取设备信息、服务文件地址、能力文件地址、媒体文件地址、视频流地址等。 |
onvifdevice | 设备类,核心处理及管理,包括设置用户信息请求onvif地址、获取设备信息、云台控制、事件订阅、抓拍图片等。 |
onvifevent | 事件订阅具体实现类,可设置请求超时时间等。 |
onvifhead | 当前组件通用头文件。 |
onvifhelper | 辅助类,比如获取UUID用于请求、判断IP合法、获取本机IP地址集合、管理系统中所有onvif设备对象等。 |
onvifmedia | 获取媒体文件具体解析类。 |
onvifother | 其他处理类,比如系统重启、NTP校时、获取和设置网络信息、获取和设备时间、获取和设置图片参数等。 |
onvifptz | 云台控制实现类,包括绝对移动、相对移动等。 |
onvifquery | 数据查询类,用于将接收到的xml数据解析,并赋值字符串比如命名空间、设备地址、媒体地址、事件地址等。 |
onvifrequest | 网络请求类,包括设置用户信息、获取用户token数据、获取xml头部数据等,通用的请求数据返回结果函数。 |
onvifsearch | 设备搜索类,支持广播搜索、指定地址搜索,可获取设备信息集合、获取设备地址集合。 |
onvifservices | 服务类,用于获取媒体地址、云台地址等。 |
onvifsnap | 图片抓拍实现类,包括获取抓图地址、抓拍图片等。 |
本组件涵盖的功能较多,所以采用了分层管理代码结构。
名称 | 说明 |
---|---|
iconhelper | 万能图形字体类,可传入多种图形字体文件,一个类通用所有图形字体。 |
quiconfig | 存储当前组件的配置参数信息,比如全局的字体名称、字号、无边框窗体的最小化最大化关闭等图标、样式表的颜色值。 |
quihead | 当前组件通用头文件。 |
quistyle | 当前组件通用样式设置管理类,可以指定枚举类型样式、传入样式内容设置、获取样式表文件对应的颜色值等。当前组件样式相关的处理函数都放在这里,统一管理。 |
名称 | 说明 |
---|---|
quiabout | 关于系统对话框,可传入软件标题、版本、版权、网址等信息。 |
quidateselect | 自定义日期范围选择对话框。 |
quiinputbox | 自定义输入框窗体,可指定不同的输入类型比如文本框、下拉框等。 |
quimessagebox | 自定义信息消息框窗体,可设置关闭倒计时,不同的类型比如信息框、询问框、错误框等。 |
quisplash | 自定义弹出提示信息,提示完自动消息关闭。 |
quitipbox | 自定义右下角信息对话框,可设置对齐方式、关闭倒计时等。 |
quiwidget | 自定义无边框窗体,可设置标题,各种图标等。 |
名称 | 说明 |
---|---|
quihelper | 项目通用辅助类,各种常用函数的封装,比如获取当前屏幕分辨率、设置字体、设置编码、加载翻译文件、各种进制数据转换、弹出各种对话框、设置延时时间等。 |
quihelpercore | 获取当前桌面分辨率,设置编码、字体、翻译文件等。 |
quihelperdata | 16进制、2进制、10进制互相转换,16进制字符串、字节数组互相转换,字节数组转int和short,CRC校验等。 |
quihelperfile | 选择文件、保存文件、选择目录等对话框,复制文件、删除文件等。 |
quihelperform | 设置无边框窗体、边框阴影,弹出信息框、错误框、询问框、日期选择框、关于对话框、中间提示框等。 |
quihelperimage | 获取等比例缩放图片,通用设置logo图片,支持资源文件、本地图片、图形字体、svg自动变色等多种形式。 |
quihelpernet | 获取本机IP地址集合,获取外网IP地址,判断IP、MAC等是否合法,下载网络文件,IP地址字符串与整型互相转换。 |
quihelperother | 初始化数据库文件,设置系统时间、开机启动,设置图标到按钮,写入临时消息的文本文件等。 |
名称 | 说明 |
---|---|
tcpfilehead | 当前组件通用头文件。 |
tcpfilehelper | 辅助类,包括将字节转为MB单位、初始化表格控件、生成表格行、数据加密解密、解压文件、重启系统等。 |
tcpreceivefileserver | 接收文件服务类,管理多个接收文件线程,支持监听端口被动接收文件和主动连接服务器接收文件。 |
tcpreceivefilethread | 接收文件线程类,根据发送的文件名、包编号、块大小、挨个接收数据最终形成文件,可设置保存文件夹等。 |
tcpsearchfileserver | 搜索文件服务类,目前没用,用于接收请求搜索文件是否存在。 |
tcpsendfilethread | 发送文件线程类,按照 文件开始符+文件大小+文件内容+文件结束符 逐个分包发送,可对文件的每个包进行加密传输。 |
视频组件继承和依赖关系说明:
videobase是基类组件,video是视频播放组件,依赖基类组件,videoffmpeg是具体的内核实现组件,依赖视频播放组件,videosave是视频保存组件,依赖基类组件。
video组件中的videothread解码线程类继承自videobase基类组件中的abstractvideothread。
video组件中的videowidgetx视频显示类继承自videobase基类组件中的abstractvideowidget。
videosave组件中的saveaudio和savevideo继承自videobase组件中的abstractsavethread。
videoffmpeg组件中的ffmpegthread继承自video组件中的videothread。
videoffmpeg组件中的ffmpegsave继承自videobase组件中的abstractsavethread。
按照此规则还有其他内核比如vlc组件中的vlcthread也是继承自videothread,mpv组件中的mpvthread也是继承自videothread。这样新增一种内核只要具体实现部分处理函数即可应用整个视频框架。
通过多层基类继承关系,使得动态挂载任意解码内核极为方便。
为何在video视频组件的基础上还要提炼一个videobase基类组件?因为该基类组件还可以提供给QCamera本地摄像头采集组件使用,基类中的变量、函数、处理逻辑几乎一致,但是又有特殊性,所以需要分开再提炼出videobase基类。
名称 | 说明 |
---|---|
videobox | 监控画面切换控件,将所有通道切换处理全部集中到一个类,通用异形布局切换函数,可以参考进行自定义异形布局,通道布局切换发出信号通知,支持自定义子菜单布局内容。 |
videohelper | 视频播放内核辅助函数,比如根据url地址取出ip地址、校验网络地址是否可达、检查地址是否正常、加载解析内核到下拉框、根据地址获取本地摄像头参数、创建视频采集类、对采集线程设置参数等。 |
videomanage | 视频线程管理类,全局单例,将所有视频控件发给此类管理,负责挨个打开视频、应用录像计划等。 |
videoplayback | 视频回放控件,支持多个通道,显示每个通道对应的视频段。 |
videostruct | 视频播放组件结构体定义类,包括解析内核枚举值、视频类型枚举值、解码策略枚举值、视频采集参数结构体。 |
videotask | 视频任务线程类,全局单例,可以随时插入一些视频相关的任务进行处理,比如vlc录制视频后需要重命名文件,mpv内核关闭视频后鼠标指针打圈圈需要复位。 |
videothread | 视频解码线程类,内置了共享解码线程处理逻辑,可以打开视频、关闭视频、设置视频宽高比例、获取文件总时长、获取媒体信息、获取和设置播放位置、获取和设置播放速度、获取和设置音量大小、获取和设置静音状态等。 |
videourl | 视频地址相关静态函数,可以读取和写入地址到文本文件,用作历史记录,内置了各种类型(rtsp、http、音频文件、视频文件、网络文件、本地USB摄像头)的测试音视频地址集合。 |
videowidgetx | 视频播放控件,一个控件对应一个解码线程,提供播放成功、播放结束、收到截图、工具栏按钮单击等处理,提供开始播放、停止播放、暂停播放、继续播放、抓拍截图、开始录制、暂停录制、停止录制等接口。 |
名称 | 说明 |
---|---|
abstractsavethread | 音视频存储基类,可以设置需要保存的音视频文件类型,比如音频文件类型有pcm、wav、aac,视频文件类型有yuv、h264、mp4,提供开始保存、暂停保存、停止保存等接口。 |
abstractvideosurface | 视频回调基类,用于Qt中的QCamera和QMedia类播放后拿到回调视频数据,这样可以取到一张张图片。 |
abstractvideothread | 视频解码线程基类,摄像头采集线程和视频采集线程都继承自此类,将各种公用的变量、函数、接口、信号槽全部放在基类,包括了停止线程标志位、打开是否成功标志位、暂停采集标志位、开始截图标志位、正在录制标志位,提供了虚函数开始播放、停止播放、暂停播放、继续播放、抓拍截图、截图完成、开始录制、暂停录制、停止录制等,提供写入视频数据到文件、写入音频数据到文件槽函数。 |
abstractvideowidget | 视频显示控件基类, |
audioplayer | 音频播放类,空的,纯粹为了在没有Qt音频播放类QAudioOutput的时候使用,有些Qt版本或者嵌入式板子环境未必有这个类,但是又不能影响整个组件的运行,于是定义了空的类,函数正常调用但是不做任何处理。 |
bannerwidget | 悬浮工具栏控件,可以设置各种颜色、按钮图标集合、按钮名称集合、按钮提示信息集合等,悬浮条位置支持上下左右四个方位。 |
imagelabel | 图片标签控件,多线程绘制传入的图片,性能比setpixmap更优。 |
widgethelper | 窗体相关辅助函数,包括传入图片尺寸和窗体区域及边框大小返回居中区域(scaleMode: 0-自动调整 1-等比缩放 2-拉伸填充)、绘制矩形区域比如人脸框、绘制点集合多边形路径比如三角形、绘制路径集合、显示截图预览等。 |
名称 | 说明 |
---|---|
ffmpeghelper | 相关辅助函数,包括打印输出各种信息、打印设备列表和参数、格式枚举值转字符串、视频帧旋转、通用硬解码、通用软解码、通用软编码、释放数据帧数据包、超时回调(包括打开超时和读取超时)等。 |
ffmpegrun | 执行ffmpeg命令,包括yuv420p文件转mp4文件、mp4文件转yuv420p文件、wav文件转aac文件、合并aac以及h264文件或者mp4文件到带声音的mp4文件、转换视频文件到mp4文件等。 |
ffmpegrunthread | 执行ffmpeg命令行线程,可以设置执行完成是否删除转换前的文件、可执行文件路径,传入需要执行的指令即可。 |
ffmpegsave | 视频存储类,用于保存h264和mp4文件。 |
ffmpegsync | 音视频同步线程类,解码后的音视频数据发给本类进行时间同步处理,采用的外部时钟同步策略。音视频播放的进度也在本类中。 |
ffmpegthread | 视频解码线程核心,从打开地址、分配解码器、初始化参数、取出音视频数据解码、关闭并释放资源等都在本类实现。 |
名称 | 说明 |
---|---|
openglinclude | 当前组件头文件。 |
nv12glwidget | 空类,用于没有opengl的Qt版本中保证程序能够继续运行。 |
nv12openglwidget | 继承自QOpenGLWidget的NV12格式OPENGL绘制窗体。 |
yuvglwidget | 空类,用于没有opengl的Qt版本中保证程序能够继续运行。 |
yuvopenglwidget | 继承自QOpenGLWidget的YUV格式OPENGL绘制窗体。 |
名称 | 说明 |
---|---|
saveaudio | 音频保存类,继承自videobase组件中的abstractsavethread,可以设置音频文件类型、采样率、通道数等,支持pcm、wav、aac三种格式。 |
savevideo | 视频保存类,继承自videobase组件中的abstractsavethread,可以设置视频文件类型、宽度、高度、帧率,支持yuv原始数据格式。 |
savehelper | 音视频保存相关辅助函数,包括pcm文件转wav文件、aac文件采样率下标、aac文件添加adts头等。 |
名称 | 说明 |
---|---|
webcore.pri | 通用的根据不同的Qt版本、不同的编译器环境、不同的操作系统,加载对应的浏览器内核模块和定义不同的变量。 |
miniblink | miniblink封装处理类。 |
webhelper | 经纬度转换、获取小数点经纬度值等常用处理函数。 |
webjsdata | 通用的浏览器控件和Qt程序交互数据中转类。 |
webview | 通用浏览器控件,支持webkit、webengine、miniblink。 |
界面说明
这里分门别类存放的各种功能集合的界面类。
每个类都一个ui文件、一个h头文件、一个cpp实现文件。
可以方便快速查找对应功能的界面,也方便拓展增加界面。
不仅分文件夹存放的,而且命名也尽量按照对应功能打头,比如系统设置模块中的都用frmconfig打头。
外层文件夹是整齐的,内部代码也是整齐的。
名称 | 说明 |
---|---|
frmconfig | 系统设置模块,包括基本设置、录像机管理、摄像机管理、轮询管理、用户管理、视频上传等。 |
frmdata | 日志查询模块,包括本地日志、设备日志等。 |
frmdemo | 演示demo示例,用于演示具体控件或者功能的使用,方便学习参考,比如视频图片、视频控件、视频存储都单独的使用demo。 |
frmipc | 存放摄像机处理相关的模块,比如设备控制,云台控制、预置位、巡航设置等。之前放在frmmodule模块中,后面独立出来管理更方便。 |
frmmain | 主界面模块,包括登录登出界面、主界面、右上角时间组件、欢迎组件等。 |
frmmap | 地图模块,包括通用地图内核界面、图片地图、在线地图、离线地图、路径规划等。 |
frmmodule | 停靠子窗体模块,包括停靠窗体管理核心类、设备列表、窗口信息、图文警情、设备轨迹、网页浏览等模块。将摄像机、机器人、无人机相关的模块放到了对应的模块文件夹,这里放的是系统通用的模块。 |
frmrobot | 无人机模块,包括图像增强、飞行监控等模块。 |
frmuavs | 无人机模块,包括图像增强、飞行监控等模块。 |
frmvideo | 视频监控模块,所有视频监控相关的都放在这里,包括主界面的视频监控布局窗体、视频回放、远程回放、图片回放等。 |
名称 | 说明 |
---|---|
frmconfig | 系统设置模块主界面,采用堆栈窗体形式,加载多个子界面比如摄像机管理、轮询管理等。 |
frmconfigipc | 摄像机管理,可以增加、删除、修改、清空、导入、导出、打印摄像机信息。 |
frmconfigipcsearch | onvif设备搜索,独立出来的窗体,可以搜索局域网内的所有onvif摄像机信息,搜索完以后获取摄像机的视频流地址等,最后可以单个添加或者批量选中添加到摄像机信息表格中。 |
frmconfignvr | 录像机管理,可以增加、删除、修改、清空、导入、导出、打印录像机信息。 |
frmconfigpoll | 轮询管理,可以增加、删除、修改、清空、导入、导出、打印轮询点信息。可以按照设定规则批量生成轮询点信息。 |
frmconfigpollplus | 将轮询管理中的轮询参数配置、分组管理、批量添加等独立出来的界面,方便管理和拓展。 |
frmconfigsave | 录像计划,可以对每个通道每周每天每半小时时间段设置是否存储录像。 |
frmconfigsystem | 系统设置,包括基本设置、视频参数、数据库设置、地图配置、功能激活、颜色配置、串口配置、网络配置等。 |
名称 | 说明 |
---|---|
frmdata | 日志查询模块主界面,采用堆栈窗体形式,加载多个子界面包括本地日志、设备日志等。 |
frmdatadevice | 设备日志,通过私有协议从NVR取对应设备日志信息。 |
frmdatauser | 本地地址,用户操作的日志信息,可查询和导出打印数据记录。 |
名称 | 说明 |
---|---|
frmdemo | 单独的功能演示示例主窗体,加载多个子界面比如视频控件等。 |
frmdemoqui | 通用辅助示例,主要演示qui通用组件中封装的函数如何使用,比如各种消息框、提示框等。 |
frmdemovideoimage | 视频图片示例,从图片文件夹读取图片集合,定时器绘制取出图片发给视频控件绘制。 |
frmdemovideoplus | 视频叠加示例,多个视频控件叠加在一起同时播放,可以设置在四个角落位置。 |
frmdemovideosave | 视频保存示例,演示如何对视频控件进行视频保存,可动态保存。 |
frmdemovideowidget | 视频控件示例,演示视频控件如何使用。 |
名称 | 说明 |
---|---|
frmipccontrol | 设备控制模块,可对选中设备进行图片参数调节、NTP校时、设备重启、抓拍图片(ONVIF抓图)等。 |
frmipcnavigate | 巡航管理模块,暂未实现,后期完善。 |
frmipcreset | 预置位管理模块,暂未实现,后期完善。 |
frmipcptz | 云台控制模块,可对选中的摄像机进行云台控制。 |
名称 | 说明 |
---|---|
frmmain | 系统主界面,采用堆栈窗体,加载各个子模块。 |
frmmain1 | 备用模块1界面,根据参数设置决定是否启用。 |
frmtimecpu | 右上角日期时间+CPU内存显示。 |
frmwelcome | 右上角欢迎信息界面。 |
名称 | 说明 |
---|---|
frmmap | 地图管理主界面,采用堆栈窗体形式,加载各个子界面比如图片地图、在线地图、离线地图、路径规划等。 |
frmmapcore | 通用百度地图内核界面,用来加载百度地图,可设置在线、离线模式,有很多个窗体用到类似功能特意封装到一个类,重复利用,比如悬浮地图、飞行轨迹、路径规划等模块都用到了此内核。 |
frmmapdevice | 通用的设备地图界面,在线地图和离线地图界面公用这个界面,唯一区别就是设置下地图的模式是在线还是离线。 |
frmmapimage | 图片地图界面,设备作为一个个按钮点显示在对应地图上,可以拖动,双击弹出预览实时视频。 |
frmmaplocal | 离线地图界面,可更新经纬度值、模拟运动轨迹等。 |
frmmapweb | 在线地图界面,可更新经纬度值、模拟运动轨迹等。 |
frmmaproute | 路径规划界面,可查询路线得到路线的经纬度坐标集合。 |
名称 | 说明 |
---|---|
frmdevicegps | 设备轨迹模块,对设定的设备随机模拟轨迹,也可传入经纬度坐标值自动移动并绘制轨迹线条,不同设备可以不同颜色。 |
frmdevicetree | 设备列表模块,读取设备信息加载形成树状列表,双击或者拖动到视频监控窗体直接播放视频,提供右键菜单作为演示如何使用。 |
frmmodule | 主界面中心部分窗体,采用QMainWindow类,中间加载的视频监控面板,其余new出来每个子模块,子模块可停靠和悬浮拖动等。不同工作模式下的各种子模块都在此加载。同时负责管理模块的显示隐藏菜单。 |
frmmsglist | 图文警情模块,也叫消息列表模块,带有右键菜单添加、删除、清空列表中的消息,双击可以弹出大图预览。 |
frmmsglistitem | 图文警情模块子类,都是由一个个item组成放到panelwidget面板控件中,自动形成滚动条。 |
frmmsgtable | 窗口消息模块,也叫表格消息模块,表格形式显示打印信息,不同的内容可以不同颜色区分。 |
frmwebview | 网页浏览模块,传入一个url地址打开对应的网页,比如打开一个3D的网页。 |
名称 | 说明 |
---|---|
frmrobotdata | 仿真数据模块,启动机器人通信服务,接收数据解析显示。 |
frmrobotdebug | 数据调试模块,可模拟发送轨迹数据测试解析类。 |
frmrobotdebug2 | 新数据调试模块,打印多个串口数据,不同颜色显示。 |
frmrobotemulate | 运动仿真模块,预留给用户实现,一般放个3D效果。 |
frmrobotlog | 机器人实时数据模块,预留给用户实现。 |
名称 | 说明 |
---|---|
frmvideo | 视频回放模块主界面,堆栈窗体形式,加载多个子界面比如本地回放、远程回放、设备播放等。 |
frmvideopanel | 视频监控面板,主界面中间部分,这是核心,管理多个通道,通道可移除删除,拖曳打开,拖曳交换等。 |
frmvideopaneltool | 视频监控底部工具栏,独立出来一个类专门管理。 |
frmvideoplayimage | 图片回放模块,按照规则查询图片目录,然后可设定播放速度进行图片序列播放。 |
frmvideoplaylocal | 本地回放模块,查询对应通道的本地存储的视频文件,双击播放,可暂停和拖动进度条位置。 |
frmvideoplaynvr | 设备播放模块,通过RTSP视频流的形式从远程设备取视频进行播放,支持摄像机和录像机,手动填入地址也行。 |
frmvideoplayweb | 远程回放模块,需要用厂家sdk去实现,从NVR回放录像。 |
frmvideopreview | 视频预览窗体,比如图片或者地图上双击设备弹出的视频预览,可以多个,关闭的时候自动释放资源。 |
frmvideoupload | 视频上传,将本地存储的视频文件上传到服务器。 |
第一步:安装系统,推荐用vmware虚拟机。
第二步:安装qt环境,可以直接用官方下载的run安装包安装,有些要求用命令行安装。
第三步:写个空白窗体程序测试下是否环境正常。
第四步:编译ffmpeg,生成对应的动态库或者静态库。
第五步:打开video_system.pro项目进行编译。
第六步:打包发布,为了发布方便,推荐用静态编译的Qt+静态编译的ffmpeg,这样打包发布很清爽,就一个可执行文件。
本系统功能比较多,封装了多个控件,尤其是核心的视频监控控件,所以特意安排了独立的使用示例演示如何使用,可以在main函数找到 AppConfig::IndexStart = 0; 改成AppConfig::IndexStart = 1;即可,这样编译运行的是监控系统组件示例。
演示通用组件比如qui封装的类的使用。
弹出信息框
弹出错误框
弹出询问框
带自动关闭倒计时
弹出右下角信息框
隐藏右下角信息框
弹出时间选择框
弹出中间提示信息
弹出关于对话框
演示加载图片文件夹,进行图片序列的播放。
演示通用视频控件如何使用,包括打开、关闭、暂停、继续、截图、自动抓拍等功能。
演示视频控件如何存储视频文件到本地,单击开始按钮开始存储视频,单击关闭则关闭存储。
演示如何用多个视频控件做视频叠加播放,可以设置叠加的位置在四个角落。
xxxxxxxxxx
191//可以自行调整位置 0-可拖动 1-左上角 2-右上角 3-左下角 4-右下角
2int type = 1;
3if (type == 1) {
4 gridLayout->addItem(hSpacer, 0, 1);
5 gridLayout->addItem(vSpacer, 1, 0);
6 gridLayout->addWidget(widget2, 0, 0);
7} else if (type == 2) {
8 gridLayout->addItem(hSpacer, 0, 0);
9 gridLayout->addItem(vSpacer, 1, 1);
10 gridLayout->addWidget(widget2, 0, 1);
11} else if (type == 3) {
12 gridLayout->addItem(vSpacer, 0, 0);
13 gridLayout->addItem(hSpacer, 1, 1);
14 gridLayout->addWidget(widget2, 1, 0);
15} else if (type == 4) {
16 gridLayout->addItem(hSpacer, 1, 0);
17 gridLayout->addItem(vSpacer, 0, 1);
18 gridLayout->addWidget(widget2, 1, 1);
19}
演示如何同步播放多个视频,切换进度条自动全部切换播放进度。
演示如何关联视频声音左右通道频谱信号,界面中音量控件实时显示当前的左右通道音量值。
演示关联拖曳文件信号,识别本地文件拖曳到视频控件中播放。
演示如何无缝切换打开不同视频,避免关闭后打开中间产生的空白缝隙。
演示如何添加各种osd标签信息和各种图形信息,osd标签信息可以设置字体、颜色、位置等,图形信息可以是矩形、三角形、多边形、圆形等。都支持批量多个添加。
演示视频控件文字水印功能,可以添加日期时间水印、自定义文字水印、实时码率帧率水印,提供按钮主动更新自定义文字水印。
新版的海康的摄像机,默认onvif是关闭的,需要手动开启,开启以后记得添加onvif用户,并重启摄像机应用。提示:海康旗下的萤石目前暂时不支持onvif协议。
大华摄像机,需要在用户管理中添加onvif用户,添加好以后建议重启摄像机应用。
工具的名字叫ONVIF Device Manager,可以自行搜索下载,此工具位国际官方工具,如果此工具搜索不到摄像机,则说明该摄像机不是真正的onvif摄像机,不是标准的摄像机,目前市面上的绝大部分网络摄像机都支持onvif。具体用法可以参考 https://www.cnblogs.com/lsdb/p/9157302.html
现在大部分厂家的NVR也逐渐支持onvif,并将每个通道都可以单独列出来。
切换到ptz页面可以进行云台控制和预置位管理。
+
styleNames = names;
styleFiles = files;
}
备注:下面的截图和说明未必是最新的,但是大部分是一致的,整体的框架不会改变,可能会有新增加子模块和代码,或者部分类文件有调整或者删除,具体以最新的代码为准。
本系统采用模块化的设备,有用到第三方开源类库比如串口通信qextserialport,全部放在3rd下面,有用到很多自己封装完善的通用类库比如ffmpeg视频监控,全部放在core下面,设备通信和辅助处理全部放在class下面,所有界面全部放在ui下面,相当于一个个小的组件合起来,最终形成了整个监控系统的完整代码。
名称 | 说明 |
---|---|
3rd | 一些第三方开源的类库,比如串口通信qextserialport。 |
class | 存放系统初始化、样式控制、自定义控件、设备通信等。 |
core | 本人一直持续更新完善的通用的类库,比如ffmpeg视频监控。 |
ui | 所有的界面都分门别类放在这里。 |
这里放的全部是第三方开源的轮子,感谢开源、感谢github、gitee等开源社区。
名称 | 说明 |
---|---|
3rd_qextserialport | 第三方串口通信qextserialport,这个类比较稳定可靠,经过了几十个项目持续数十年运行的考验,不用Qt自带的串口类。 |
具体代码不做过多说明。
这里放的都是一些系统初始化、设备通信相关的类。
名称 | 说明 |
---|---|
api | 存放数据库表映射成对应的全局队列数据、通用的辅助函数类。 |
app | 全局配置参数管理类、秘钥管理类、通用函数。 |
devicecustom | 用户自定义设备通信管理,比如机器人通信、无人机通信等。 |
devicevideo | 视频监控相关处理类,包括设备地图、表格消息、线程UI通信、人工智能处理等。 |
usercontrol | 当前系统的自定义控件全部放在这里,其中包括云台仪表盘、天气面板等控件。 |
名称 | 说明 |
---|---|
dbdata | 将数据库表映射到全局变量数据队列,比如将摄像机表ipcinfo转成QStringList存放一行行数据,这样在程序中运算比较速度极快,直接内存比较,不用每次都去读取数据库。 |
dbquery | 所有的数据库查询插入更新等操作都在这里,比如查询摄像机表、插入日志记录等。 |
名称 | 说明 |
---|---|
appconfig | 配置参数类,整个系统的配置参数存放在ini文件中,跨平台,所有参数都对应一个变量,读取配置参数的时候将值赋值给变量,写入的时候将变量值写入到配置文件。 |
appdata | 全局变量类,系统中无可避免需要一些全局变量方便处理,都放在此类,比如版本号、录像机类型、摄像机类型、当前用户信息、地图宽度高度、左侧右侧顶部底部宽高等。 |
appevent | 全局事件转发类,系统越复杂信号需要传递的层级越多,所以需要一个全局事件转发类,用来中转这些事件,这样永远只需要两层就可以收到信号进行处理,而且整个系统看起来干净整洁,不会说一个信号传递到了N个地方乱七八糟,建议需要跨层级传递的信号都放在这里中转。比如软件退出信号,可能多个界面需要收到退出信号进行保存和其他处理,如果从关闭界面发出信号传递给需要的界面,那不知道要中间层层传递多少次,有了这个全局事件转发类,你只需要将事件传给appevent,需要接收事件的地方关联这个信号就行,appevent为全局单例类,整个系统唯一。通用的一些信号有软件退出、全局样式改变、主窗体变化(0-最小化 1-最大化 2-恢复 3-关闭 4-移动 5-尺寸变化)等。 |
appinit | 程序初始化类,在main函数中,会先执行这个初始化的类,比如初始化皮肤、字体、数据库、样式等操作,这些都是要优先在窗体加载前执行的,执行完毕以后再打开窗体主界面。 |
appstyle | 全局样式管理类,整个系统的样式全部放在这里,一般加载流程是先读取样式表文件,然后将本系统独特的样式(比如开关按钮、视频监控、云台仪表盘)内容追加到后面,最后统一设置全局样式,在main函数中加载,和appinit类一样放在最前面执行。 |
appurl | 视频监控系统中常用的默认的视频地址集合。 |
名称 | 说明 |
---|---|
devicerobot | 机器人串口通信管理类。 |
devicerobot2 | 机器人串口通信管理类2,有串口数据转发功能。 |
deviceuavsserver | 无人机后端服务类,当前为空,用户自己添加。 |
deviceuavsvideo | 无人机视频监控类,将视频控件设置过来,然后就可以将自己人工智能算法处理后的图片传过来进行绘制,类似于实时视频效果。 |
名称 | 说明 |
---|---|
devicehelper | 整个系统设备管理辅助类,比如插入窗口消息、加载设备列表、加载图片地图、加载设备按钮、初始化视频控件等。 |
devicemap | 设备图片地图管理类,相当于一次性加载所有图片到内存,当要切换或者显示的时候,直接从内存取出来设置即可,速度极快,瞬间相应,纯粹是为了加快相应速度以及可能在图片上进行绘制增加的功能,比从文件系统读取图片文件显示快N倍。 |
deviceonvif | 设备onvif通信管理类,比如获取当前选中通道的onvif地址、开启事件订阅、校对时间、重启设备、获取视频参数、设置视频参数、云台控制等,这里是具体的需要和摄像机信息表及视频通道关联的处理,所以不能放到通用的onvif模块中。 |
devicethreadui | 演示线程通知UI更新,包括每隔一段时间插入消息、异步调用添加表格消息和图文警情、设备GPS移动、报警闪烁、指定通道编号设置视频和通道交换等。 |
devicevideosmart | 人工智能处理类,最常见的应用就是设置一个视频控件,然后在视频控件上绘制人脸框、文字信息等,比如设备的实时运行状态。 |
名称 | 说明 |
---|---|
gaugecloud | 云台仪表盘控件。 |
cityhelper | 省市县联动类,通过从json文件读取省市县信息。 |
weather | 城市天气类,最后显示在标题栏上,实时显示设置的城市的最近几天的天气。 |
widgetsound | 声音面板控件,主界面右下角单击弹出音量条。 |
这里放的全部是个人一直持续更新完善的独创的轮子,所有的项目都公用这些轮子,用到哪个就包含哪个进来,更新只需要更新轮子代码就行。
视频监控系统包含的轮子超级丰富给力,物超所值,涵盖了数据导出模块、数据库应用、音频播放和录制、视频播放和录制、ONVIF通信、TCP文件传输、地图应用、通用浏览器内核等。
名称 | 说明 |
---|---|
core_audio | 音频播放和录制,包括音频输入输出管理、音频曲线、音频播放、音频录制、音频振幅控件等。 |
core_common | 通用函数,包括通用秘钥、通用导航、通用样式、声音播放、日志记录、运行时间记录等。 |
core_control | 通用自定义控件,很多系统经常用到的控件全部放在这里,比如开关按钮、设备容器、设备按钮、颜色下拉框等。 |
core_dataout | 数据导入导出到xls/pdf和打印类库,极速、跨平台、无依赖。 |
core_db | 数据库通用类库比如数据库线程管理、数据清理、数据采集等。 |
core_form | 通用的用户登录、用户退出、用户管理、数据库配置界面类等。 |
core_map | 地图综合应用类库,百度地图(支持在线离线)和echart封装类等。 |
core_onvif | onvif功能封装类,包括设备搜索、云台控制、设备参数设置等。 |
core_qui | 通用的辅助类,包括自定义对话框,全局辅助函数,图形字体等。 |
core_tcpfile | 文件多线程收发类,支持多个并发。 |
core_video | 视频播放核心类,包括了监控画面切换控件、视频回放控件、视频播放组件结构体、视频播放辅助函数、视频解码线程类、视频显示控件类等。 |
core_videobase | 视频相关基类,包括音视频文件保存基类、视频解码基类、视频控件基类、视频悬浮工具栏、视频控件结构体等。 |
core_videoffmpeg | 视频监控内核ffmpeg版本,本系统默认采用的内核。 |
core_videoopengl | opengl封装类,支持打开yuv/nv12文件,绘制yuv/nv12帧数据,一般搭配ffmpeg视频内核显示视频,直接走GPU绘制。 |
core_videosave | 音视频保存组件,包括音频保存类、视频保存类、保存相关辅助函数类。 |
core_webview | 通用浏览器控件类,同时支持webkit、wenengine、miniblink三种内核,打通了所有的Qt版本。 |
名称 | 说明 |
---|---|
audiohelper | 音频相关辅助函数,比如获取音频输入输出设备、根据设备名称查找设备对象、初始化音频格式、获取对应音频格式最大振幅、获取对应音频格式音频数据的振幅级别等。 |
audiolevel | 音频振幅控件,根据传入的音频振幅大小绘制振幅,可设置颜色。 |
audioplayer | 音频播放类,可以设置声音大小和静音状态,支持带参数打开音频输入和输出设备,自动关联音频输入输出设备形成话筒和音响联动。 |
audioplot | 音频曲线类,包括初始化图表、添加振幅数据、添加音频数据等。 |
audiorecorder | 音频录制类,可以设置音频录制的参数,包括采样大小、比特率、通道数、质量级别、编码模式等。 |
名称 | 说明 |
---|---|
base64helper | 图片及文字和base64编码之间转换的类。 |
commonkey | 通用秘钥管理类,指定校验秘钥文件,可设置运行时间、设备数量等限制,支持根据硬件指纹特征生成机器码文件等。 |
commonnav | 通用菜单导航管理类,用来控制和显示顶部导航栏、左侧导航栏的样式。很多子界面需要用到,所以封装成一个专门管理这个的类。 |
commonstyle | 通用样式管理类,比如Qt自带类窗体样式、自定义控件样式、分页导航样式、导航按钮样式、开关按钮样式等。相当于将多个项目常用的自定义样式封装一起做成通用。 |
framelesswidget2 | 无边框窗体拉伸类,边框四周八个方位都可以自由拉伸,可设置是否允许拖动和拉伸。 |
playwav | 声音文件播放类,通用Qt456,自动识别当前Qt版本使用对应的类,Qt4采用QSound,Qt5以上采用QSoundEffect,嵌入式采用对应的命令行aplay、mpv来播放。 |
savelog | 日志钩子类,将系统中所有的打印信息转为日志存储或者输出到网络等,可以开启用来打印输出日志信息。 |
saveruntime | 保存运行时间类,用来存储系统启动后每隔一段时间就输出一条记录用来记录启动后软件运行了多久,方便分析问题。 |
名称 | 说明 |
---|---|
bottomwidget | 通用底部状态栏控件,可以设置软件名称、版本号、运行时间等。 |
colorcombobox | 颜色下拉框控件,在系统设置中有。 |
cpumemorylabel | CPU和内存使用情况标签控件,主界面右上角显示。 |
customtitlebar | 停靠窗体自定义标题栏控件。 |
devicebutton | 设备按钮控件,比如图片地图模块中用到,可设置不同的图标样式和状态等,双击发出信号进行相应处理比如弹出对应窗体等。 |
lcddatetime | 软件右上角显示时间的控件。 |
panelwidget | 面板容器控件,主界面子模块表格消息,就用到此控件,用于将一堆widget放到此容器进行管理,自动形成滚动条等。 |
switchbutton | 开关按钮控件,在系统设置中存在大量该控件。 |
xslider | 滑动条控件,在原有滑动条基础上增加了鼠标按下立即定位等。 |
名称 | 说明 |
---|---|
datacreat | 通用数据报表内容创建类,比如生成表格格式的html内容,然后赋值给dataprint直接打印,里面举例了图文混排的报告内容,后期会不断增加其他模板,也可以自行增加其他模板数据。 |
datacsv | 导入导出数据,csv格式,可设置分隔符。拓展名。过滤条件等。 |
datahead | 当前组件通用头文件。 |
datahelper | 辅助类,比如校验规则函数,通用数据导出+打印函数。 |
dataprint | 数据打印到pdf及纸张,支持多线程。 |
dataxls | 数据导出到xls类,支持多线程导出。 |
名称 | 说明 |
---|---|
dbcleanthread | 自动清理数据线程类。 |
dbconnthread | 数据库通信管理线程类。 |
dbdelegate | 自定义委托全家桶,包括复选框、下拉框、密码框、按钮等。 |
dbhead | 当前组件通用头文件。 |
dbhelper | 各种数据库应用函数封装,比如初始化数据库、执行sql语句等。 |
dbhttpthread | 网络请求数据采集类。 |
dbpage | 数据库通用翻页类。 |
dbpagemodel | 数据库翻页类数据模型。 |
navpage | 分页导航控件。 |
名称 | 说明 |
---|---|
formhelper | 封装的导入导出、导出数据到xls/pdf和打印数据、自动备份数据、保存最后打开的文件夹等。 |
frmconfigdb | 通用数据库管理界面类,可选不同的数据库类型,填入用户信息,执行检测连接和初始化数据操作。 |
frmconfiguser | 通用用户管理界面类,可添加、删除、修改用户信息,包括权限分配等,可导入导出打印用户信息。 |
frmlogin | 通用用户登录界面类,包括自动登录和记住密码复选框,多次密码错误校验,记住当前用户信息等。三次错误关闭,下拉可选用户,内置超级密码。 |
frmlogout | 通用用户退出界面类,三次错误关闭,下拉可选用户,内置超级密码。 |
userhelper | 通用用户权限管理类,内置7种类型权限,对应权限名称可自定义,一般在用户切换对应界面或者单击了对应功能按钮的时候触发。 |
名称 | 说明 |
---|---|
echartjs | echart模块中用到的json文件转js文件,获取js文件中的名字和经纬度等处理。 |
echarts | echart封装类,可加载仪表盘、闪烁点图、迁徙图、世界地图、区域地图等,每个点可自定义颜色和提示信息等。 |
mapbaidu | 百度地图封装类,支持在线和离线两种模式。 |
名称 | 说明 |
---|---|
onvifbase | 基础类,用于获取设备信息、服务文件地址、能力文件地址、媒体文件地址、视频流地址等。 |
onvifdevice | 设备类,核心处理及管理,包括设置用户信息请求onvif地址、获取设备信息、云台控制、事件订阅、抓拍图片等。 |
onvifevent | 事件订阅具体实现类,可设置请求超时时间等。 |
onvifhead | 当前组件通用头文件。 |
onvifhelper | 辅助类,比如获取UUID用于请求、判断IP合法、获取本机IP地址集合、管理系统中所有onvif设备对象等。 |
onvifmedia | 获取媒体文件具体解析类。 |
onvifother | 其他处理类,比如系统重启、NTP校时、获取和设置网络信息、获取和设备时间、获取和设置图片参数等。 |
onvifptz | 云台控制实现类,包括绝对移动、相对移动等。 |
onvifquery | 数据查询类,用于将接收到的xml数据解析,并赋值字符串比如命名空间、设备地址、媒体地址、事件地址等。 |
onvifrequest | 网络请求类,包括设置用户信息、获取用户token数据、获取xml头部数据等,通用的请求数据返回结果函数。 |
onvifsearch | 设备搜索类,支持广播搜索、指定地址搜索,可获取设备信息集合、获取设备地址集合。 |
onvifservices | 服务类,用于获取媒体地址、云台地址等。 |
onvifsnap | 图片抓拍实现类,包括获取抓图地址、抓拍图片等。 |
本组件涵盖的功能较多,所以采用了分层管理代码结构。
名称 | 说明 |
---|---|
iconhelper | 万能图形字体类,可传入多种图形字体文件,一个类通用所有图形字体。 |
quiconfig | 存储当前组件的配置参数信息,比如全局的字体名称、字号、无边框窗体的最小化最大化关闭等图标、样式表的颜色值。 |
quihead | 当前组件通用头文件。 |
quistyle | 当前组件通用样式设置管理类,可以指定枚举类型样式、传入样式内容设置、获取样式表文件对应的颜色值等。当前组件样式相关的处理函数都放在这里,统一管理。 |
名称 | 说明 |
---|---|
quiabout | 关于系统对话框,可传入软件标题、版本、版权、网址等信息。 |
quidateselect | 自定义日期范围选择对话框。 |
quiinputbox | 自定义输入框窗体,可指定不同的输入类型比如文本框、下拉框等。 |
quimessagebox | 自定义信息消息框窗体,可设置关闭倒计时,不同的类型比如信息框、询问框、错误框等。 |
quisplash | 自定义弹出提示信息,提示完自动消息关闭。 |
quitipbox | 自定义右下角信息对话框,可设置对齐方式、关闭倒计时等。 |
quiwidget | 自定义无边框窗体,可设置标题,各种图标等。 |
名称 | 说明 |
---|---|
quihelper | 项目通用辅助类,各种常用函数的封装,比如获取当前屏幕分辨率、设置字体、设置编码、加载翻译文件、各种进制数据转换、弹出各种对话框、设置延时时间等。 |
quihelpercore | 获取当前桌面分辨率,设置编码、字体、翻译文件等。 |
quihelperdata | 16进制、2进制、10进制互相转换,16进制字符串、字节数组互相转换,字节数组转int和short,CRC校验等。 |
quihelperfile | 选择文件、保存文件、选择目录等对话框,复制文件、删除文件等。 |
quihelperform | 设置无边框窗体、边框阴影,弹出信息框、错误框、询问框、日期选择框、关于对话框、中间提示框等。 |
quihelperimage | 获取等比例缩放图片,通用设置logo图片,支持资源文件、本地图片、图形字体、svg自动变色等多种形式。 |
quihelpernet | 获取本机IP地址集合,获取外网IP地址,判断IP、MAC等是否合法,下载网络文件,IP地址字符串与整型互相转换。 |
quihelperother | 初始化数据库文件,设置系统时间、开机启动,设置图标到按钮,写入临时消息的文本文件等。 |
名称 | 说明 |
---|---|
tcpfilehead | 当前组件通用头文件。 |
tcpfilehelper | 辅助类,包括将字节转为MB单位、初始化表格控件、生成表格行、数据加密解密、解压文件、重启系统等。 |
tcpreceivefileserver | 接收文件服务类,管理多个接收文件线程,支持监听端口被动接收文件和主动连接服务器接收文件。 |
tcpreceivefilethread | 接收文件线程类,根据发送的文件名、包编号、块大小、挨个接收数据最终形成文件,可设置保存文件夹等。 |
tcpsearchfileserver | 搜索文件服务类,目前没用,用于接收请求搜索文件是否存在。 |
tcpsendfilethread | 发送文件线程类,按照 文件开始符+文件大小+文件内容+文件结束符 逐个分包发送,可对文件的每个包进行加密传输。 |
视频组件继承和依赖关系说明:
videobase是基类组件,video是视频播放组件,依赖基类组件,videoffmpeg是具体的内核实现组件,依赖视频播放组件,videosave是视频保存组件,依赖基类组件。
video组件中的videothread解码线程类继承自videobase基类组件中的abstractvideothread。
video组件中的videowidgetx视频显示类继承自videobase基类组件中的abstractvideowidget。
videosave组件中的saveaudio和savevideo继承自videobase组件中的abstractsavethread。
videoffmpeg组件中的ffmpegthread继承自video组件中的videothread。
videoffmpeg组件中的ffmpegsave继承自videobase组件中的abstractsavethread。
按照此规则还有其他内核比如vlc组件中的vlcthread也是继承自videothread,mpv组件中的mpvthread也是继承自videothread。这样新增一种内核只要具体实现部分处理函数即可应用整个视频框架。
通过多层基类继承关系,使得动态挂载任意解码内核极为方便。
为何在video视频组件的基础上还要提炼一个videobase基类组件?因为该基类组件还可以提供给QCamera本地摄像头采集组件使用,基类中的变量、函数、处理逻辑几乎一致,但是又有特殊性,所以需要分开再提炼出videobase基类。
名称 | 说明 |
---|---|
videobox | 监控画面切换控件,将所有通道切换处理全部集中到一个类,通用异形布局切换函数,可以参考进行自定义异形布局,通道布局切换发出信号通知,支持自定义子菜单布局内容。 |
videohelper | 视频播放内核辅助函数,比如根据url地址取出ip地址、校验网络地址是否可达、检查地址是否正常、加载解析内核到下拉框、根据地址获取本地摄像头参数、创建视频采集类、对采集线程设置参数等。 |
videomanage | 视频线程管理类,全局单例,将所有视频控件发给此类管理,负责挨个打开视频、应用录像计划等。 |
videoplayback | 视频回放控件,支持多个通道,显示每个通道对应的视频段。 |
videostruct | 视频播放组件结构体定义类,包括解析内核枚举值、视频类型枚举值、解码策略枚举值、视频采集参数结构体。 |
videotask | 视频任务线程类,全局单例,可以随时插入一些视频相关的任务进行处理,比如vlc录制视频后需要重命名文件,mpv内核关闭视频后鼠标指针打圈圈需要复位。 |
videothread | 视频解码线程类,内置了共享解码线程处理逻辑,可以打开视频、关闭视频、设置视频宽高比例、获取文件总时长、获取媒体信息、获取和设置播放位置、获取和设置播放速度、获取和设置音量大小、获取和设置静音状态等。 |
videourl | 视频地址相关静态函数,可以读取和写入地址到文本文件,用作历史记录,内置了各种类型(rtsp、http、音频文件、视频文件、网络文件、本地摄像头)的测试音视频地址集合。 |
videowidgetx | 视频播放控件,一个控件对应一个解码线程,提供播放成功、播放结束、收到截图、工具栏按钮单击等处理,提供开始播放、停止播放、暂停播放、继续播放、抓拍截图、开始录制、暂停录制、停止录制等接口。 |
名称 | 说明 |
---|---|
abstractsavethread | 音视频存储基类,可以设置需要保存的音视频文件类型,比如音频文件类型有pcm、wav、aac,视频文件类型有yuv、h264、mp4,提供开始保存、暂停保存、停止保存等接口。 |
abstractvideosurface | 视频回调基类,用于Qt中的QCamera和QMedia类播放后拿到回调视频数据,这样可以取到一张张图片。 |
abstractvideothread | 视频解码线程基类,摄像头采集线程和视频采集线程都继承自此类,将各种公用的变量、函数、接口、信号槽全部放在基类,包括了停止线程标志位、打开是否成功标志位、暂停采集标志位、开始截图标志位、正在录制标志位,提供了虚函数开始播放、停止播放、暂停播放、继续播放、抓拍截图、截图完成、开始录制、暂停录制、停止录制等,提供写入视频数据到文件、写入音频数据到文件槽函数。 |
abstractvideowidget | 视频显示控件基类, |
audioplayer | 音频播放类,空的,纯粹为了在没有Qt音频播放类QAudioOutput的时候使用,有些Qt版本或者嵌入式板子环境未必有这个类,但是又不能影响整个组件的运行,于是定义了空的类,函数正常调用但是不做任何处理。 |
bannerwidget | 悬浮工具栏控件,可以设置各种颜色、按钮图标集合、按钮名称集合、按钮提示信息集合等,悬浮条位置支持上下左右四个方位。 |
imagelabel | 图片标签控件,多线程绘制传入的图片,性能比setpixmap更优。 |
widgethelper | 窗体相关辅助函数,包括传入图片尺寸和窗体区域及边框大小返回居中区域(scaleMode: 0-自动调整 1-等比缩放 2-拉伸填充)、绘制矩形区域比如人脸框、绘制点集合多边形路径比如三角形、绘制路径集合、显示截图预览等。 |
名称 | 说明 |
---|---|
ffmpeghelper | 相关辅助函数,包括打印输出各种信息、打印设备列表和参数、格式枚举值转字符串、视频帧旋转、通用硬解码、通用软解码、通用软编码、释放数据帧数据包、超时回调(包括打开超时和读取超时)等。 |
ffmpegrun | 执行ffmpeg命令,包括yuv420p文件转mp4文件、mp4文件转yuv420p文件、wav文件转aac文件、合并aac以及h264文件或者mp4文件到带声音的mp4文件、转换视频文件到mp4文件等。 |
ffmpegrunthread | 执行ffmpeg命令行线程,可以设置执行完成是否删除转换前的文件、可执行文件路径,传入需要执行的指令即可。 |
ffmpegsave | 视频存储类,用于保存h264和mp4文件。 |
ffmpegsync | 音视频同步线程类,解码后的音视频数据发给本类进行时间同步处理,采用的外部时钟同步策略。音视频播放的进度也在本类中。 |
ffmpegthread | 视频解码线程核心,从打开地址、分配解码器、初始化参数、取出音视频数据解码、关闭并释放资源等都在本类实现。 |
名称 | 说明 |
---|---|
openglinclude | 当前组件头文件。 |
nv12glwidget | 空类,用于没有opengl的Qt版本中保证程序能够继续运行。 |
nv12openglwidget | 继承自QOpenGLWidget的NV12格式OPENGL绘制窗体。 |
yuvglwidget | 空类,用于没有opengl的Qt版本中保证程序能够继续运行。 |
yuvopenglwidget | 继承自QOpenGLWidget的YUV格式OPENGL绘制窗体。 |
名称 | 说明 |
---|---|
saveaudio | 音频保存类,继承自videobase组件中的abstractsavethread,可以设置音频文件类型、采样率、通道数等,支持pcm、wav、aac三种格式。 |
savevideo | 视频保存类,继承自videobase组件中的abstractsavethread,可以设置视频文件类型、宽度、高度、帧率,支持yuv原始数据格式。 |
savehelper | 音视频保存相关辅助函数,包括pcm文件转wav文件、aac文件采样率下标、aac文件添加adts头等。 |
名称 | 说明 |
---|---|
webcore.pri | 通用的根据不同的Qt版本、不同的编译器环境、不同的操作系统,加载对应的浏览器内核模块和定义不同的变量。 |
miniblink | miniblink封装处理类。 |
webhelper | 经纬度转换、获取小数点经纬度值等常用处理函数。 |
webjsdata | 通用的浏览器控件和Qt程序交互数据中转类。 |
webview | 通用浏览器控件,支持webkit、webengine、miniblink。 |
界面说明
这里分门别类存放的各种功能集合的界面类。
每个类都一个ui文件、一个h头文件、一个cpp实现文件。
可以方便快速查找对应功能的界面,也方便拓展增加界面。
不仅分文件夹存放的,而且命名也尽量按照对应功能打头,比如系统设置模块中的都用frmconfig打头。
外层文件夹是整齐的,内部代码也是整齐的。
名称 | 说明 |
---|---|
frmconfig | 系统设置模块,包括基本设置、录像机管理、摄像机管理、轮询管理、用户管理、视频上传等。 |
frmdata | 日志查询模块,包括本地日志、设备日志等。 |
frmdemo | 演示demo示例,用于演示具体控件或者功能的使用,方便学习参考,比如视频图片、视频控件、视频存储都单独的使用demo。 |
frmipc | 存放摄像机处理相关的模块,比如设备控制,云台控制、预置位、巡航设置等。之前放在frmmodule模块中,后面独立出来管理更方便。 |
frmmain | 主界面模块,包括登录登出界面、主界面、右上角时间组件、欢迎组件等。 |
frmmap | 地图模块,包括通用地图内核界面、图片地图、在线地图、离线地图、路径规划等。 |
frmmodule | 停靠子窗体模块,包括停靠窗体管理核心类、设备列表、窗口信息、图文警情、设备轨迹、网页浏览等模块。将摄像机、机器人、无人机相关的模块放到了对应的模块文件夹,这里放的是系统通用的模块。 |
frmrobot | 无人机模块,包括图像增强、飞行监控等模块。 |
frmuavs | 无人机模块,包括图像增强、飞行监控等模块。 |
frmvideo | 视频监控模块,所有视频监控相关的都放在这里,包括主界面的视频监控布局窗体、视频回放、远程回放、图片回放等。 |
名称 | 说明 |
---|---|
frmconfig | 系统设置模块主界面,采用堆栈窗体形式,加载多个子界面比如摄像机管理、轮询管理等。 |
frmconfigipc | 摄像机管理,可以增加、删除、修改、清空、导入、导出、打印摄像机信息。 |
frmconfigipcsearch | onvif设备搜索,独立出来的窗体,可以搜索局域网内的所有onvif摄像机信息,搜索完以后获取摄像机的视频流地址等,最后可以单个添加或者批量选中添加到摄像机信息表格中。 |
frmconfignvr | 录像机管理,可以增加、删除、修改、清空、导入、导出、打印录像机信息。 |
frmconfigpoll | 轮询管理,可以增加、删除、修改、清空、导入、导出、打印轮询点信息。可以按照设定规则批量生成轮询点信息。 |
frmconfigpollplus | 将轮询管理中的轮询参数配置、分组管理、批量添加等独立出来的界面,方便管理和拓展。 |
frmconfigsave | 录像计划,可以对每个通道每周每天每半小时时间段设置是否存储录像。 |
frmconfigsystem | 系统设置,包括基本设置、视频参数、数据库设置、地图配置、功能激活、颜色配置、串口配置、网络配置等。 |
名称 | 说明 |
---|---|
frmdata | 日志查询模块主界面,采用堆栈窗体形式,加载多个子界面包括本地日志、设备日志等。 |
frmdatadevice | 设备日志,通过私有协议从NVR取对应设备日志信息。 |
frmdatauser | 本地地址,用户操作的日志信息,可查询和导出打印数据记录。 |
名称 | 说明 |
---|---|
frmdemo | 单独的功能演示示例主窗体,加载多个子界面比如视频控件等。 |
frmdemoqui | 通用辅助示例,主要演示qui通用组件中封装的函数如何使用,比如各种消息框、提示框等。 |
frmdemovideoimage | 视频图片示例,从图片文件夹读取图片集合,定时器绘制取出图片发给视频控件绘制。 |
frmdemovideoplus | 视频叠加示例,多个视频控件叠加在一起同时播放,可以设置在四个角落位置。 |
frmdemovideosave | 视频保存示例,演示如何对视频控件进行视频保存,可动态保存。 |
frmdemovideowidget | 视频控件示例,演示视频控件如何使用。 |
名称 | 说明 |
---|---|
frmipccontrol | 设备控制模块,可对选中设备进行图片参数调节、NTP校时、设备重启、抓拍图片(ONVIF抓图)等。 |
frmipcnavigate | 巡航管理模块,暂未实现,后期完善。 |
frmipcreset | 预置位管理模块,暂未实现,后期完善。 |
frmipcptz | 云台控制模块,可对选中的摄像机进行云台控制。 |
名称 | 说明 |
---|---|
frmmain | 系统主界面,采用堆栈窗体,加载各个子模块。 |
frmmain1 | 备用模块1界面,根据参数设置决定是否启用。 |
frmtimecpu | 右上角日期时间+CPU内存显示。 |
frmwelcome | 右上角欢迎信息界面。 |
名称 | 说明 |
---|---|
frmmap | 地图管理主界面,采用堆栈窗体形式,加载各个子界面比如图片地图、在线地图、离线地图、路径规划等。 |
frmmapcore | 通用百度地图内核界面,用来加载百度地图,可设置在线、离线模式,有很多个窗体用到类似功能特意封装到一个类,重复利用,比如悬浮地图、飞行轨迹、路径规划等模块都用到了此内核。 |
frmmapdevice | 通用的设备地图界面,在线地图和离线地图界面公用这个界面,唯一区别就是设置下地图的模式是在线还是离线。 |
frmmapimage | 图片地图界面,设备作为一个个按钮点显示在对应地图上,可以拖动,双击弹出预览实时视频。 |
frmmaplocal | 离线地图界面,可更新经纬度值、模拟运动轨迹等。 |
frmmapweb | 在线地图界面,可更新经纬度值、模拟运动轨迹等。 |
frmmaproute | 路径规划界面,可查询路线得到路线的经纬度坐标集合。 |
名称 | 说明 |
---|---|
frmdevicegps | 设备轨迹模块,对设定的设备随机模拟轨迹,也可传入经纬度坐标值自动移动并绘制轨迹线条,不同设备可以不同颜色。 |
frmdevicetree | 设备列表模块,读取设备信息加载形成树状列表,双击或者拖动到视频监控窗体直接播放视频,提供右键菜单作为演示如何使用。 |
frmmodule | 主界面中心部分窗体,采用QMainWindow类,中间加载的视频监控面板,其余new出来每个子模块,子模块可停靠和悬浮拖动等。不同工作模式下的各种子模块都在此加载。同时负责管理模块的显示隐藏菜单。 |
frmmsglist | 图文警情模块,也叫消息列表模块,带有右键菜单添加、删除、清空列表中的消息,双击可以弹出大图预览。 |
frmmsglistitem | 图文警情模块子类,都是由一个个item组成放到panelwidget面板控件中,自动形成滚动条。 |
frmmsgtable | 窗口消息模块,也叫表格消息模块,表格形式显示打印信息,不同的内容可以不同颜色区分。 |
frmwebview | 网页浏览模块,传入一个url地址打开对应的网页,比如打开一个3D的网页。 |
名称 | 说明 |
---|---|
frmrobotdata | 仿真数据模块,启动机器人通信服务,接收数据解析显示。 |
frmrobotdebug | 数据调试模块,可模拟发送轨迹数据测试解析类。 |
frmrobotdebug2 | 新数据调试模块,打印多个串口数据,不同颜色显示。 |
frmrobotemulate | 运动仿真模块,预留给用户实现,一般放个3D效果。 |
frmrobotlog | 机器人实时数据模块,预留给用户实现。 |
名称 | 说明 |
---|---|
frmvideo | 视频回放模块主界面,堆栈窗体形式,加载多个子界面比如本地回放、远程回放、设备播放等。 |
frmvideopanel | 视频监控面板,主界面中间部分,这是核心,管理多个通道,通道可移除删除,拖曳打开,拖曳交换等。 |
frmvideopaneltool | 视频监控底部工具栏,独立出来一个类专门管理。 |
frmvideoplayimage | 图片回放模块,按照规则查询图片目录,然后可设定播放速度进行图片序列播放。 |
frmvideoplaylocal | 本地回放模块,查询对应通道的本地存储的视频文件,双击播放,可暂停和拖动进度条位置。 |
frmvideoplaynvr | 设备播放模块,通过RTSP视频流的形式从远程设备取视频进行播放,支持摄像机和录像机,手动填入地址也行。 |
frmvideoplayweb | 远程回放模块,需要用厂家sdk去实现,从NVR回放录像。 |
frmvideopreview | 视频预览窗体,比如图片或者地图上双击设备弹出的视频预览,可以多个,关闭的时候自动释放资源。 |
frmvideoupload | 视频上传,将本地存储的视频文件上传到服务器。 |
第一步:安装系统,推荐用vmware虚拟机。
第二步:安装qt环境,可以直接用官方下载的run安装包安装,有些要求用命令行安装。
第三步:写个空白窗体程序测试下是否环境正常。
第四步:编译ffmpeg,生成对应的动态库或者静态库。
第五步:打开video_system.pro项目进行编译。
第六步:打包发布,为了发布方便,推荐用静态编译的Qt+静态编译的ffmpeg,这样打包发布很清爽,就一个可执行文件。
本系统功能比较多,封装了多个控件,尤其是核心的视频监控控件,所以特意安排了独立的使用示例演示如何使用,可以在main函数找到 AppConfig::IndexStart = 0; 改成AppConfig::IndexStart = 1;即可,这样编译运行的是监控系统组件示例。
演示通用组件比如qui封装的类的使用。
弹出信息框
弹出错误框
弹出询问框
带自动关闭倒计时
弹出右下角信息框
隐藏右下角信息框
弹出时间选择框
弹出中间提示信息
弹出关于对话框
演示加载图片文件夹,进行图片序列的播放。
演示通用视频控件如何使用,包括打开、关闭、暂停、继续、截图、自动抓拍等功能。
演示视频控件如何存储视频文件到本地,单击开始按钮开始存储视频,单击关闭则关闭存储。
演示如何用多个视频控件做视频叠加播放,可以设置叠加的位置在四个角落。
xxxxxxxxxx
191//可以自行调整位置 0-可拖动 1-左上角 2-右上角 3-左下角 4-右下角
2int type = 1;
3if (type == 1) {
4 gridLayout->addItem(hSpacer, 0, 1);
5 gridLayout->addItem(vSpacer, 1, 0);
6 gridLayout->addWidget(widget2, 0, 0);
7} else if (type == 2) {
8 gridLayout->addItem(hSpacer, 0, 0);
9 gridLayout->addItem(vSpacer, 1, 1);
10 gridLayout->addWidget(widget2, 0, 1);
11} else if (type == 3) {
12 gridLayout->addItem(vSpacer, 0, 0);
13 gridLayout->addItem(hSpacer, 1, 1);
14 gridLayout->addWidget(widget2, 1, 0);
15} else if (type == 4) {
16 gridLayout->addItem(hSpacer, 1, 0);
17 gridLayout->addItem(vSpacer, 0, 1);
18 gridLayout->addWidget(widget2, 1, 1);
19}
演示如何同步播放多个视频,切换进度条自动全部切换播放进度。
演示如何关联视频声音左右通道频谱信号,界面中音量控件实时显示当前的左右通道音量值。
演示关联拖曳文件信号,识别本地文件拖曳到视频控件中播放。
演示如何无缝切换打开不同视频,避免关闭后打开中间产生的空白缝隙。
演示如何添加各种osd标签信息和各种图形信息,osd标签信息可以设置字体、颜色、位置等,图形信息可以是矩形、三角形、多边形、圆形等。都支持批量多个添加。
演示视频控件文字水印功能,可以添加日期时间水印、自定义文字水印、实时码率帧率水印,提供按钮主动更新自定义文字水印。
新版的海康的摄像机,默认onvif是关闭的,需要手动开启,开启以后记得添加onvif用户,并重启摄像机应用。提示:海康旗下的萤石目前暂时不支持onvif协议。
大华摄像机,需要在用户管理中添加onvif用户,添加好以后建议重启摄像机应用。
工具的名字叫ONVIF Device Manager(还有个工具叫ONVIF Device Test Tool,专用于程序员测试各种数据交互),可以自行搜索下载,此工具位国际官方工具,如果此工具搜索不到摄像机,则说明该摄像机不是真正的onvif摄像机,不是标准的摄像机,目前市面上的绝大部分网络摄像机都支持onvif。具体用法可以参考 https://www.cnblogs.com/lsdb/p/9157302.html
现在大部分厂家的NVR也逐渐支持onvif,并将每个通道都可以单独列出来。
切换到ptz页面可以进行云台控制和预置位管理。
操作说明
默认摄像机IO输入或者开关量输入是关闭的,需要手动开启。
一般都是登录到摄像机的web页面找到开关量的地方,可能描述不一样但是大致的意思差不多。
一般摄像机会有两组开关量输入,而且开关量报警有常开常闭两种,都需要自己手动选择。
如果是常开的话意味着闭合是属于报警,反之亦然。
找两个导线接在对应口子(详见摄像机厂家的说明书,摄像机背面板也会有对应字样标识一般叫 in)。
短接或者扒开,都会有反应,onvif工具都能接收到信息(前提是单击过订阅事件按钮,而且顺利返回了订阅地址才行)。
会收到LogicalState关键字的信息,true或者1表示报警,false或者0表示正常。
可能每个厂家会有所区别,需要自己拿到数据后做特殊处理,但是大部分厂家都是相似的,实在不行无非搞个contains方法判断好了。
打开项目:QT VS TOOLS – Open Qt Project File 选择 video_system.pro,然后等待项目加载完毕。 由于项目中用到了ffmpeg和vlc,引用了对应的lib库,所以在用vs+qt的开发环境中,很可能报错提示映像是不安全的错误,导致编译通不过,需要做个设置。
解决方法
第一步:打开该项目的“属性页”对话框。
第二步:单击“链接器”文件夹。
第三步:单击“命令行”属性页。
第四步:将 /SAFESEH:NO 键入“附加选项”框中,然后点击应用。
如果设置完发现还是不行,那应该是没有一开始就设置这个步骤,你需要打开项目以后就设置好这个步骤,再去编译,建议重新解压项目来一遍。
如果在数据库设置中选择了mysql数据库,需要对mysql数据库做个设置,就是将编码设置成utf8,已设置可以跳过,不然很可能数据库无法正常使用。
32位的Qt程序,带对应32位的libmysql动态库(对应文件是libmysql.dll,如果是64位的则需要将libmysql64.dll重命名为libmysql.dll),可以访问32/64位的mysql数据库,64位的也是一样可以访问32/64位的mysql数据库,只需要带上对应位数的动态库就行。查看mysql是32位还是64位命令 mysql.exe -V。 -
在加载USB摄像机的时候,需要填写对应USB设备的名称,可以通过命令行和设备管理器查看对应的名称,要英文的。
在需要加载多个USB摄像机的场景下,有时候会遇到同名的USB名称设备,此时需要打开注册表进行设备名称修改后,按照新修改后的设备名称填入即可。
+
在加载USB摄像机的时候,需要填写对应USB设备的名称,可以通过命令行和设备管理器查看对应的名称,要英文的。
在需要加载多个USB摄像机的场景下,有时候会遇到同名的USB名称设备,此时需要打开注册表进行设备名称修改后,按照新修改后的设备名称填入即可。
-
如果是在虚拟机中打开USB摄像头,你需要对虚拟机做点设置,默认USB2.0需要改成USB3.1。 +
如果是在虚拟机中打开本地摄像头,你需要对虚拟机做点设置,默认USB2.0需要改成USB3.1。
整个项目源代码行数大概30W行,其中代码13.5W行(占比45%),注释12.7W行(占比42%),空行3.5W行。分层设计注释详细。
下面是linux系统编译ffmpeg步骤
第一步:下载好ffmpeg,这个可以去官网 http://ffmpeg.org/ 或者第三方下载地址 https://www.videohelp.com/software/ffmpeg/old-versions (推荐这个地址,官网很多人找不到下载地址)自行找到下载位置下载。要注意的是有些很老的嵌入式linux系统的编译器未必支持最新的ffmpeg4。下面用ffmpeg-3.4.5.tar.gz举例子。
第二步:复制ffmpeg-3.4.5.tar.gz 到自定义文件夹下,我这里是/home/liu
第三步:解压ffmpeg,tar –zxvf ffmpeg-3.4.5.tar.gz –C /home/liu
第四步:安装编译ffmpeg依赖的包 apt-get install yasm
第五步:编译ffmpeg cd /home/liu/ffmpeg-3.4.5
如果编译静态库执行以下命令
./configure --prefix=host --enable-static --disable-shared --disable-doc --disable-sdl2
如果编译动态库执行以下命令
./configure --prefix=host --enable-shared --disable-static --disable-doc
如果需要编译ffplay以便直接用其打开测试,可以在参数后面加上--enable-ffplay
./configure --prefix=host --enable-shared --disable-static --disable-doc --enable-ffplay
嵌入式交叉编译需要指定编译器路径 --cross-prefix=/usr/local/arm-linux-gcc-4.9.2/gcc-linaro-arm-linux-gnueabihf-4.9-2014.08_linux/bin/arm-linux-gnueabihf- --arch=arm --target-os=linux
其他常用参数 --disable-zlib --disable-xlib --enable-x11grab --disable-libxcb
可以执行./configure –help 来查看支持哪些参数,尤其是各种解码器的开关,具体可搜索。
其他参数可参见网页 https://blog.csdn.net/momo0853/article/details/78043903
make (还可以开启多线程编译加快速度 make –j4)
make install
第六步:打开ffmpeg3.4.5/host目录,生成的文件都在这里,拿去用吧。
编译ffmpeg支持x264/x265编码
在linux上默认编译ffmpeg出来的库支持h264/h265的解码,编码并不支持,所以需要单独加上x264/x265的库再编译。
首先要下载好x264/x265的源码包,解压到目录,切换到管理员权限(需要编译后拷贝库到/usr/lib)。
编译libx264以便支持h264编码。
./configure --disable-asm
make -j4
make install
编译libx265以便支持h265(hevc)编码。
定位到x265的build/linux目录
./make-Makefiles.bash
make -j4
make install
如果提示cmake:command not found 需要安装 apt install cmake-curses-gui
编译ffmpeg加入x264/x265支持。
指定位置链接libx264头文件和库写法
./configure --prefix=host --disable-static --enable-shared --disable-doc --enable-libx264 --enable-libx265 --enable-gpl --enable-rpath --enable-libfreetype --disable-sdl2 --extra-cflags=-I/home/liu/qt/x264/host/include --extra-ldflags=-L/home/liu/qt/x264/host/lib
如果头文件和库已经在系统目录中则不需要指定
./configure --prefix=host --disable-static --enable-shared --disable-doc --enable-libx264 --enable-libx265 --enable-gpl --enable-rpath
如果需要滤镜支持比如文字水印用到了drawtext,还依赖freetype库,还需要加上 --enable-libfreetype。
如果环境中有sdl的库则编译ffmpeg的时候默认会开启依赖sdl,avdevice库依赖他,也可以手动指定禁用sdl --disable-sdl2。
如果有需要可以对编译出来的ffmpeg可执行文件设置rpath以便文件和库在一起可以找到库并运行。
查看ffmpeg可执行文件rpath命令 readelf -d ffmpeg | grep 'RPATH'
修改ffmpeg可执行文件rpath命令 chrpath -r "$ORIGIN" ffmpeg
windows系统采用mingw编译ffmpeg https://blog.csdn.net/yp18792574062/article/details/108962638
在windows上经常遇到高分屏缩放的问题,很头疼,貌似这东西就是windows首发的。
在Qt4时代的程序遇到高分屏缩放,不作任何处理,毕竟Qt4时代(2010年以前)出来的时候几乎还没高分屏缩放这东西。
从Qt5.6开始提供了高分屏缩放支持,需要在main函数前面设置 QApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
从Qt5.14开始提供了高分屏缩放策略设置,需要在main函数前面设置 QApplication::setHighDpiScaleFactorRoundingPolicy(Qt::HighDpiScaleFactorRoundingPolicy::PassThrough);
从Qt6.0开始默认就开启高分屏属性Qt::AA_EnableHighDpiScaling,而且不允许关闭(所以你会发现程序用Qt6编译后界面变得很大)。可以通过setHighDpiScaleFactorRoundingPolicy函数设置策略。
如果不想要高分屏,希望程序永远保持默认的尺寸,你需要在main函数前面设置 QApplication::setAttribute(Qt::AA_Use96Dpi); 表示永远不缩放。
如果希望启用Qt的高分屏则需要设置Qt::AA_EnableHighDpiScaling和setHighDpiScaleFactorRoundingPolicy。缺点是图片容易发虚,比如复选框的边框,哪怕是Qt内置样式风格或者系统默认风格也一样。
xxxxxxxxxx
51int main(int argc, char *argv[])
2{
3 QApplication::setAttribute(Qt::AA_EnableHighDpiScaling); QApplication::setHighDpiScaleFactorRoundingPolicy(Qt::HighDpiScaleFactorRoundingPolicy::PassThrough);
4 QApplication a(argc, argv);
5}
另外一种办法就是写个文本文件qt.conf(Qt程序默认的标准配置文件,必须是这个名字),写入内容后,放到可执行文件同一目录即可,此方法采用操作系统的策略进行缩放,推荐此方法,虽然看起来稍微有点模糊,但不会出现发虚等问题,整体一致。
xxxxxxxxxx
21[Platforms]
2WindowsArguments = dpiawareness=0
没有完美的高分屏支持方法,都是只能尽量满足,哪怕是windows系统本身,在开启缩放的时候,任务管理器也是模糊的很(尽管改成124%可以改变,但总归不是好办法),还有很多其他知名软件也是如此。
本系统的电子地图模块支持三种浏览器内核:webkit、webengine、miniblink,编译的时候会自动识别。
其中Qt5.6以前用的是webkit,Qt5.6版本以后分两种情况,一种是mingw编译器(windows系统)对应的Qt库不再提供浏览器模块,所以本系统为了兼容各种编译器,特意封装了miniblink浏览器内核,弥补这个不足。
Qt5.6以后的版本在linux系统和mac等系统,都不存在没有浏览器控件的情况,都使用的webengine。
仅仅是windows上的mingw编译器的Qt版本没有,其他系统其实都有的。很多人在这个地方都有疑问,都以为只有msvc编译器有浏览器控件,其实确切的说是在windows上msvc的Qt库带浏览器控件。
安装Qt的时候webengine模块默认不勾选,需要主动勾选才会安装。
也不是所有的msvc的Qt版本都有webengine浏览器模块,哪怕你勾选了也没用,有些版本官方并没有编译,需要自行编译。需要到对应的Qt安装目录查看是否有 Qt5WebEngine.dll 文件。
本系统除了支持直连各种数据库比如mysql、postgresql、sqlserver、oracle数据库,也支持odbc数据源的形式连接以上各种数据库,在配置数据源的时候,记得区分32、64位,对应数据源后面带有32/64一起字样的说明该数据源可以同时支持32位和64位的程序访问,不带的要用对应位数的才能访问。数据库名称记得填写的是数据源对应的名称,而不是数据源连接的数据库名称,很多人会搞错。
摄像机音频编码可选多种格式,建议选择用AAC格式。
@@ -738,5 +738,5 @@ header, .context-menu, .megamenu-content, footer{
- +