diff --git a/docs/video_system/index.html b/docs/video_system/index.html index e05fe767..3a02cd0e 100644 --- a/docs/video_system/index.html +++ b/docs/video_system/index.html @@ -697,7 +697,7 @@ https://pan.baidu.com/s/13LDRu6mXC6gaADtrGprNVA 提取码: ujm7。
如果是64位的qt则对应的dll是拷贝dll_ffmpeg4_64目录下的,64位的linux对应的是liblinux64.tar.gz。
本系统支持ffmpeg2/3/4/5/6所有版本,默认是ffmpeg4,如果要支持XP需要用ffmpeg2/3。如果是在linux/mac系统上编译记得查看core_videoffmpeg/下面的 linux系统和mac系统上库的用法.txt/编译阶段linux系统ffmpeg库放置位置.jpg/运行阶段linux系统ffmpeg库放置位置.jpg。
如果编译运行提示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)。
本系统没有说基于哪个Qt版本,由于系统中电子地图模块用到了浏览器模块,所以理论上要求你电脑的Qt版本也有浏览器模块才行。
如果没有浏览器模块则电子地图模块不可用,但是其余功能全部可用,没有任何影响。
支持Qt4.7以上的所有版本,亲测msvc、mingw、gcc、clang、armgcc各种编译器,亲测xp、win7、win10、linux、mac、树莓派、香橙派、全志H3、cotex-A9、imx6等。
2021-1-6开始集成了miniblink浏览器内核,意味着mingw版本的qt5.6以上版本也全部支持,这样就所有系统都有浏览器模块不需要担心没有电子地图的问题。Qt6.4.1到Qt6.5.1之间的版本,miniblink浏览器控件会和openglwidget冲突导致白屏,建议避开这几个版本。
部分构建套件可能不支持预编译头,预编译头仅仅是为了加快编译速度,和程序本身无关。比如在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)重新打开程序即可。
内核ffmpeg画框画文字水印等采用的滤镜实现,默认硬解码的数据是NV12不支持滤镜,意味着画框等无效,绘制文字有效,如果一定要在硬解码的帧数据画框,可以使用包含各种形状比如正方形/三角形/矩形的图形字体,指定图形字体的值来绘制。
如果在linux系统编译提示 -disable-new-dtags: unknown option ,打开core_videobase/core_videobase_include.pri ,把底部 DTAGS = ,-disable-new-dtags 整行注释就行。
关于声音的几点说明:系统中有多个声音相关的控制参数,一个是decodeAudio,用于控制是否解码音频数据;一个是playAudio,用于控制是否将解码后的音频数据发到声卡进行播放;一个是soundMute,用于控制声音大小为静音;在视频控件上的音量图标切换是用于切换静音。音频振幅也就是音柱的变化,只要声卡那边有数据播放,无论静音与否,都会有音频振幅效果。
离线地图可以用网上的瓦片地图下载器下载百度的离线地图放到对应目录即可。
也可以直接下载网盘中已经下载好的上海市的离线地图。
下载地址: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保存即可。
本源码项目文件中对编译生成的临时文件和可执行文件做了重定向,可执行文件并不在build开头的目录下,而是在源码同级目录的bin目录下。
config目录放的是软件的配置文件、地图模块需要的图片资源等。
db目录一般有三个文件,key.db是秘钥文件、video_system.db是对应sqlite的数据库文件、video_system.sql是对应数据库脚本(可以在系统设置中数据库管理部分执行脚本用来切换到mysql等其他数据库)。
logo目录存放的各种左上角软件LOGO图片,可以在系统设置中下拉选择。
map目录存放的图片地图模块所用的地图图片文件,可以手动拷贝到此。
sound目录存放的本系统所用的声音文件。
layout目录存放的不同工作模式不同界面对应的布局方案配置文件。
本视频监控系统做的是通用的系统,主要偏重整体框架和UI交互等。
主要功能包括摄像机管理,实时视频显示,视频轮询、视频存储、设备地图显示,各种画面切换,各种悬停子模块、onvif搜索设备和云台控制及预置位,通用的NVR视频流播放(比如海康的NVR支持直接取流回放),录像计划、用户管理等功能。
如果是依赖SDK去实现的功能(雨刷、去雾等)都没有做,那个破坏了兼容性,无法通用其他摄像机设备以及其他操作系统。
每个厂家SDK和定制的功能都不一样,如果有这方面的需要都是买过去自己加上SDK的功能和自己定制需要的功能。
整个项目源代码行数大概30W行(项目代码本身除去第三方库以后约7W行,就是自己写的部分),其中代码13.5W行(占比45%),注释12.7W行(占比42%),空行3.5W行。分层设计注释详细。
本程序会一直持续迭代更新,包括项目源码、整体框架、使用说明等,一次购买终生售后。
本程序相当于是个客户端,并不是服务器程序,而是直接从摄像机或者NVR等设备取rtsp视频流。对标的是海康大华的PC客户端程序,只不过海康大华的客户端默认只支持自家的设备,而本程序支持各个厂家的设备。
摄像机管理没有限制摄像机的数量,理论上10000路肯定没有问题,就是个数据库记录。
程序实时显示界面最大通道数量可以到64路,每个通道都是打开的时候才会去建立连接取视频流,而不是一开始就建立了连接。
一般屏幕大小显示64路就已经足够,再多就窗口很小,意义不大,除非分辨率很大。如果还需要同时显示到255路,程序中稍作修改即可,这部分功能可以定制。
实时显示具体能支持多少路,和具体的电脑配置有关,亲测1.8G主频8G内存I5子码流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预置位,可以添加、删除、修改预置位,可以调用起始位。
支持OSD增删改查,可以通过onvif协议添加及修改OSD信息。
支持onvif图像参数设置,包括明亮度、对比度、饱和度、尖锐度等。
支持onvif其他操作,包括抓图、网络设置、校时、重启、事件订阅等。
支持任意onvif摄像机,包括但不限于海康、大华、宇视、天地伟业、华为等。
可保存视频,可通过录像计划存储,也可在悬浮条手动切换开始录像和停止录像。
可设置视频流通信方式tcp或udp,可设置视频解码是速度优先、质量优先、均衡处理、最快速度等。
可设置软件中文名称、英文名称、LOGO图标等。
存储的视频文件支持导出到指定目录,支持批量上传到服务器。
完善的录像计划设置,支持每个通道7 * 24小时每半小时设置是否存储录像。
音视频同步显示以及音视频同步存储到MP4文件。
主界面采用停靠窗体模式,各种组件以小模块的形式加入,可自定义任意模块加入。
停靠模块可拖动任意位置嵌入和悬浮,支持最大化全屏,支持多屏幕。
双重布局文件存储机制,正常模式、全屏模式都对应不同的布局方案,自动切换和保存,比如全屏模式可以突出几个模块透明显示在指定位置,更具科幻感现代化。
原创onvif协议机制,采用底层协议解析(udp广播搜索+http请求执行命令)更轻量易懂易学习拓展,不依赖任何第三方组件比如gsoap。
原创数据导入、导出、打印机制,跨平台不依赖任何组件,瞬间导出数据。
内置多个原创组件,宇宙超值超级牛逼,包括数据导入导出组件(导出到xls、pdf、打印)、数据库组件(数据库管理线程、自动清理数据线程、万能分页、数据请求等)、地图组件、视频监控组件、文件多线程收发组件、onvif通信组件、通用浏览器内核组件等。
自定义信息框+错误框+询问框+右下角提示框(包含多种格式)等。
精美换肤,高达20套皮肤样式随意更换,所有样式全部统一,包括菜单等。
选中通道对应设备树节点高亮,选中通道节点对应视频控件高亮,方便查看当前通道信息。
视频控件悬浮条可以自行增加多个按钮,监控界面底部小工具栏也可自行增加按钮。
双击摄像机节点自动播放视频,双击节点自动依次添加视频,会自动跳到下一个,双击父节点自动添加该节点下的所有视频。可选主码流、子码流。
录像机管理、摄像机管理,可添加删除修改导入导出打印信息,立即应用新的设备信息生成树状列表,不需重启。
可选多种内核自由切换,ffmpeg、vlc、mpv等,均可在pro中设置。推荐用ffmpeg,跨平台最多,默认提供好了linux和mac平台上编译好的库。
支持硬解码,可设置硬解码类型(qsv、dxva2、d3d11va等)。
默认采用opengl绘制视频,超低的CPU资源占用,支持yuyv和nv12两种格式绘制,性能爆表。
标签和图形信息支持三种绘制方式,绘制到遮罩层、绘制到图片、源头绘制(对应信息可以存储到文件)。
包括但不限于视频监控内核组件的所有功能,可参阅说明书中功能介绍 视频监控内核。
高度可定制化,用户可以很方便的在此基础上衍生自己的功能,比如增加自定义模块,增加运行模式、机器人监控、无人机监控、挖掘机监控等。
支持xp、win7、win10、win11、linux、mac、各种国产系统(UOS、中标麒麟、银河麒麟等)、嵌入式linux等系统。
注释完整,项目结构清晰,超级详细完整的使用开发手册,精确到每个代码文件的功能说明,不断持续迭代版本。
由于编解码涉及到很多参数,一般都按照默认参数进行处理。
部分用户有时候希望通过填入的播放地址就带上这些信息,比如通信协议、桌面采集的分辨率、编码保存是否转码、转码是否缩放原图等。
各种参数设置有个优先级,优先取地址中带的,没有带则取结构体中的,还没有则取默认值。
有些值会根据具体情况自动调整,比如本地设备采集没有硬解码,udp开头的视频流强制用udp协议,有些不支持硬解的格式自动将硬解码=none。
对于需要在地址中指定参数,对应占位符不填的需要占位符留空,不可以跳过。
占位符中填了对应参数的必须严格按照指定的格式要求,不按照则很可能导致解析失败。
参数用英文竖杠 | 隔开。
监控解码组件支持各种场景需求的格式,你能想到的情况都考虑到了,经过近十年的长期实战积累而成。强烈建议看完下面的格式要求。
格式要求: url|transport|decodeType|encodeVideo|encodeVideoFps|encodeVideoRatio|encodeVideoScale。
url表示媒体地址,比如 f:/1.mp3 d:/1.mp4 rtsp://192.168.0.100 等。
transport表示通信协议,可选 tcp/udp,一般用于rtsp视频流,很多时候在linux系统中必须指定tcp,rtsp摄像头才能正常采集。
decodeType表示解码策略,0-速度优先,1-质量优先,2-均衡处理,3-最快速度(不做音视频同步,收到就立马解码和显示)。
encodeVideo表示视频编码格式,0-不做处理,1-自动转码(源头是264就264/265就265),2-强制用264编码,3-强制用265编码。
encodeVideoFps表示编码帧率,默认取源头流的帧率,如果指定了则取指定的。
encodeVideoRatio表示视频压缩比率,对应bit_rate的值,在不改变分辨率的情况下,通过调整这个参数来控制保存文件体积的大小。范围值0-1。
encodeVideoScale表示视频缩放值,字符串类型,如果值float值,则相当于在原有分辨率按照这个值等比例缩放,比如encodeVideoScale=0.5,视频源分辨率是1920x720,则编码保存按照960x360这个分辨率保存。如果是640x480,则按照指定的这个分辨率强制缩放,可能会变形。
格式要求:url|bufferSize|frameRate|codecName|encodeVideoScale。
url表示媒体地址,采集摄像头统一约定 video=或者audio=开头。
bufferSize表示分辨率,可填1280x720这种,不填默认640x480。
frameRate表示帧率,不填默认25。
codecName表示解码器名称,有些本地摄像头可以指定解码器名称比如mjpeg/h264,前提是要该设备支持该解码器。默认为空则不指定会自动处理。
encodeVideoScale表示缩放,1表示原始比例(默认值1),0.2则表示按照原始分辨率等比例0.2倍缩放,也可以填400x300表示强制按照这个分辨率缩放。这个在高分辨率的时候特别有用,比如采集的桌面分辨率很大,但是传输的时候受限于带宽,需要等比例压缩一下再传输,此时可以填0.5/0.2之类的值。
win系统如何查看设备名见本文档中 打开本地摄像头。
linux系统查看设备名直接执行命令 ls /dev/video * 即可,一般对应的设备名是 /dev/video0。
下面假定本地摄像头的设备名为 USB Video Device。
写法1:video=USB Video Device,这种写法默认按照640x480分辨率打开摄像头。
写法2:video=USB Video Device|1280x720|30,这种写法按照指定的分辨率1280x720以及采集帧率30来打开摄像头。
写法3:video=/dev/video0,这种是对应linux系统,程序内部会自动过滤和调整填入的地址。
写法4:audio=麦克风 (USB Audio Device),只采集本地麦克风。
写法5:video=USB Video Device:audio=麦克风 (USB Audio Device),同时采集本地摄像头和麦克风。
写法6:video=USB Video Device|1920x1080|30|h264,按照1080P分辨率30帧h264格式解码来打开摄像头。
写法7:video=USB Video Device|1920x1080|||0.5,按照1080P分辨率采集,保存按照960x540分辨率。
约定audio=开头是只采集音频,video=开头可以采集视频或者视音频。
如果指定了分辨率和帧率则需要硬件支持才行,比如摄像头的最大分辨率是640x480,而指定了1280x720则会打开失败。
格式要求:url|bufferSize|frameRate|offsetX|offsetY|screenIndex|encodeVideoScale。
url表示媒体地址,采集桌面统一约定 screen=开头。
bufferSize表示采集分辨率,不填则默认取屏幕分辨率。
frameRate表示采集帧率,基本上在2-30之间,不填的话默认ffmpeg会设定一个值,有时候是30。
offsetX/offsetY表示偏移值XY坐标,从屏幕的左上角(0,0)开始。
screenIndex表示屏幕索引,不填的话则默认取当前鼠标所在屏幕。在多个屏幕的时候可通过此参数指定屏幕索引。
encodeVideoScale表示缩放,1表示原始比例(默认值1),0.2则表示按照原始分辨率等比例0.2倍缩放,也可以填400x300表示强制按照这个分辨率缩放。这个在高分辨率的时候特别有用,比如采集的桌面分辨率很大,但是传输的时候受限于带宽,需要等比例压缩一下再传输,此时可以填0.5/0.2之类的值。
写法1:screen=desktop,当前屏幕全屏采集。
写法2:screen=desktop||15|0|0|1,屏幕2全屏采集,帧率15。
写法3:screen=desktop|800x600|10|50|100,鼠标所在当前屏幕采集,采集区域rect(50,100,800,600),帧率10。
写法4:screen=desktop|10x10,约定10x10分辨率表示所有屏幕合并到一个屏幕采集,比如两个屏幕的时候,当做一个屏幕整体采集。当合并屏幕采集的时候,XY偏移值参数无效。
写法5:screen=desktop|800x600|25|1500|300|255,约定屏幕索引255则取用户自定义的区域,该字符串表示采集区域是(1500, 300, 800, 600),自由区域,可以任意指定,比如两个屏幕中间区域。前提只要保证该区域在两个屏幕区域中,如果超过了的话可能采集失败,这要求用户需要对采集区域精准定位。
写法6:screen=title=MainWindow,对指定窗口标题是MainWindow的窗体采集。支持中文标题比如screen=title=系统设置。
经过大量测试发现,如果打包发布的Qt程序带了qt.conf文件并且里面指定了 WindowsArguments = dpiawareness=0 ,在电脑分辨率设置了缩放比不为100%的时候,计算出来的桌面区域未必正确,建议如果此种情况下一定要采集正确的桌面,去掉qt.conf文件中的对应内容或者删除qt.conf文件即可。
中央综合: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/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
专业测试视频播放器的各种文件 http://samples.mplayerhq.hu/
下面列出的是一些常用厂家的格式,不同厂家格式不一样,具体什么格式请咨询厂家索要对应的视频流格式,或者设备支持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年到该时间经过的秒数。
由于视频流源头限制,可能有些源头只支持tcp/udp协议的一种,就需要手动指定。
指定tcp协议打开视频流:rtsp://admin:12345@192.168.1.128/1|tcp
指定udp协议打开视频流:rtmp://livetv.dhtv.cn:1935/live/financial|udp
系统启动后,首先会弹出用户登录界面,从用户姓名的下拉框选择用户名,然后输入密码(默认用户名密码都是admin),单击登录按钮,密码正确则会进入到系统主界面,错误会弹出提示,错误超过三次自动关闭,需要重新打开软件。
在登录界面可以勾选是否记住密码,是否自动登录,如果勾选了记住密码,则下次启用软件会自动填入最后用户的密码,勾选了自动登录(以最后的用户信息作为当前登录用户)则启动后直接进入主界面。如果开启了自动登录,不会弹出登录界面,可以在系统设置中关闭自动登录和记住密码。
在主界面单击右上角的关闭按钮,会弹出用户退出界面,需要输入密码验证防止误关闭,会自动填入登录的用户名,密码输入正确才会退出软件。用户登录和退出都内置了超级密码a防止管理员忘记密码。
主界面由顶部主菜单导航、左侧右侧停靠窗体(设备列表、窗口信息、图文警情、悬浮地图、云台控制、设备控制、预置巡航、视频轮询等)、中间视频监控主画面组成,其中左右两侧的停靠窗体可以拉伸宽度,上下停靠窗体之间也可以拉伸高度,每个停靠窗体都可以关闭和悬浮。自动保存布局文件,下次启动自动应用。
所有模块都是停靠窗体。
可以任意组合多种子模块。
模块可停靠悬浮。
在普通模式和全屏模式都有独立的布局文件。
不同的工作模式都可对应不同的布局文件。
左侧和右侧的面板,可以通过单击面板右上角的关闭按钮来隐藏,当隐藏一个面板以后,剩余的面板会自动填充布局,如果需要重新显示面板,则在标题栏鼠标右键就可以对小面板进行显示和隐藏,右上角的时间和CPU显示面板可以在系统设置中控制显示隐藏。系统会自动记住最后的布局比如显示的面板和宽高占比,下次启动后自动应用。
在停靠窗体的标题栏鼠标右键也会弹出子窗体的开启菜单,复选框勾选表示显示,悬浮的窗体没有这个特性,一定要是嵌入在主界面中的子窗体标题栏才有。
如果是全屏模式,由于没有了标题栏,想要关闭模块的话,需要将其拖动到边缘嵌入主窗体,然后在标题栏鼠标右键菜单中关闭即可。
面板和面板之间有个分隔条,鼠标移到对应分隔条的地方,会变成可拉动的鼠标指针,此时可以上下左右拉动调整宽高,调整好以后会自动保存宽高比例,下次启动后自动应用最后的配置来显示。
视频播放支持多种方式:
双击子节点播放单个摄像机,在当前选中通道处播放。
双击父节点播放整个录像机的摄像机,依次排列。
按住子节点拖曳到对应通道,播放摄像机。
本地文件直接拖曳到通道,自动播放本地文件。
启动后自动播放最后通道的视频信息。
代码接口提供指定通道播放url,AppEvent::Instance()->slot_loadVideo。
代码接口提供指定两个通道交换,AppEvent::Instance()->slot_changeVideo,比如报警的时候将某个通道移到最前面显示。
视频截图支持多种方式:
监控通道鼠标右键,弹出菜单选择截图当前视频/截图所有视频。
视频面板底部工具栏截图按钮。
每个通道悬浮工具条截图按钮。
截图默认保存在可执行文件所在目录下的image_normal目录,文件名格式ch01_2028-11-24-13-41-24-000.jpg。
底部工具栏截图按钮触发截图后会弹出提示抓拍文件后的保存位置。
有多种方法可以删除视频:
鼠标右键删除当前视频。
鼠标右键删除所有视频。
按住通道画面移出视频监控画面。
悬浮条关闭按钮。
-
系统支持多画面切换,全屏切换等,包括1/4/6/8/9/13/16/25/36/64画面切换,如果还需要增加更多的画面比如81/100/255等,可以直接在videobox.cpp源码中稍微修改即可。
画面切换支持多种方式:
鼠标右键画面切换。
底部左侧画面切换缩略图。
快捷键alt+enter全屏。
快捷键esc退出全屏。
切换到X画面,标准的行列数通道布局,比如竖屏一般需要4x2这种,表示4行2列布局。
切换到Y画面,自定义的一些布局,比如通道01-通道02表示左右两侧各一个通道。通道01-通道03表示上面一整个通道,下面左右两侧各一个通道。可以自行在videobox类中增加或者修改。
在主界面画面栏右下角,按下声音图标自动弹出声音调节面板,失去焦点自动隐藏,拉动声音滚动条来调节声音大小,还有静音切换。右下角的声音和静音切换是针对所有通道的,单个通道可以在每个通道的悬浮条工具栏中单击静音切换按钮。
参数说明:
自动轮询:开启后在软件启动后会自动轮询。
轮询间隔:可选5s、10s、30s、60s等,按照此间隔切换下一组视频。
轮询画面:可选1画面、4画面、9画面、16画面,轮询的时候按照多少个通道同时显示。
轮询方案:也可以叫轮询分组,在系统设置中配置。
启动轮询:单击后会启动轮询,轮询是通过定时器控制的,到了时间就切换到下一屏画面。再次单击此按钮会停止轮询,停止轮询会复位轮询分组索引,下次轮询重新从第一个开始。
暂停轮询:单击后会暂停当前轮询,只是定时器暂停,当前轮询索引不变,再次单击从上一次轮询到的位置开始继续轮询。
通道交换功能很常用,一般用户喜欢调整自己想要的通道显示到前面或者占据画面的更大部分,比如6画面8画面的时候,左侧有一个画面占据很大的位置,一般这个用来显示重要性最高的实时视频,如果需要通道交换,则按住通道拖动到另外一个通道上面松开鼠标即可,会立即应用,瞬间切换,这里切记不要移出视频画面外,移出去表示删除。
本系统也封装了代码中动态控制切换和动态交换,具体演示示例代码在DeviceThreadUI类中,具体全局调用函数在AppEvent类中,具体执行在frmVideoPanelTool窗体类中。
xxxxxxxxxx
51//指定通道显示视频 id从0开始
2void slot_loadVideo(int channel, int ipcID);
3void slot_loadVideo(int channel, const QString &url);
4//通道交换
5void slot_changeVideo(int channel1, int channel2);
如果需要控制云台移动,先要选择对应的通道,边缘会高亮,进行云台控制的前提是该摄像机要是支持云台的摄像机,很多人以为啥摄像机都可以移动,这是错误的,如果摄像机不支持云台,这个功能就别玩了,玩不起,经常遇到一些人说怎么云台不能用了,一检查尼玛原来摄像机根本没有云台。
本系统云台控制走的是onvif协议,没有使用私有协议,上百家厂家的摄像机,走私有协议会玩死人的,所以统一采用onvif通用协议,需要提前在系统设置中的摄像机管理,搜索摄像机,输入正确的onvif用户信息后一键获取到云台地址。具体操作参见 设备搜索 。
设备控制部分,目前可以获取和设置图片参数、手动校时、重启设备、抓拍图片等,和云台控制操作一样,操作前也是需要选中某个通道,然后才是对选中的通道进行设备控制,比如图片参数中的明亮度、对比度、饱和度、尖锐度。
后面把OSD配置模块和网络配置模块也放在这里,因为这几个模块参数排列不适合作为悬停模块,所以统一放在设备控制模块中,通过单击按钮切换出来。
本系统默认支持海康、大华、宇视、华为、天地伟业等厂家的摄像机的报警事件订阅,可以在系统设置中的视频参数设置中开启事件订阅开关,如果摄像机已经开启了报警事件的话(一般摄像机的网页配置界面进去有移动侦测、遮挡报警、人脸识别、报警输入等各种),默认一般是关闭的,比如摄像机后面的开关量输入报警接口,需要web页面进去设置开启。具体操作参见 报警输入设置 和 Onvif事件设置 。
报警订阅走的是onvif协议,具体事件内容和含义可以在config/event.txt事件字典表中修改,由于onvif事件有多种,而且不同厂家对应关键字对应的事件含义可能不一样,不同厂家的设备可能含义有点出入,所有可以通过事件字典表自行更改,对应内容含义 事件等级/唯一标识/报警字样/解除字样,默认程序按照这个表中的进行过滤,不在表中的可以正常收到但是不会处理。具体处理逻辑代码在DeviceOnvif类中。
常用几种事件字典:
1,IsMotion,有人在移动,移动结束
1,IsInside,有人在闯入,入侵结束
1,LogicalState,开关量报警,报警结束
1,State,开关量联动,联动结束
1,IsTamper,遮挡报警,遮挡结束
悬浮条功能介绍:
内置悬浮条控件,悬浮条位置支持顶部、底部、左侧、右侧。
悬浮条控件参数包括边距、间距、背景透明度、背景颜色、文本颜色、按下颜色、位置、按钮图标代码集合、按钮名称标识集合、按钮提示信息集合。
悬浮条控件一排工具按钮可自定义,通过结构体参数设置,图标可选图形字体还是自定义图片。
悬浮条按钮内部实现了录像切换、抓拍截图、静音切换、电子放大、关闭视频等功能,也可以自行在源码中增加自己对应的功能。
悬浮条按钮对应实现了功能的按钮,有对应图标切换处理,比如录像按钮按下后会切换到正在录像中的图标,声音按钮切换后变成静音图标,再次切换还原。
悬浮条按钮单击后都用名称唯一标识作为信号发出,可以自行关联响应处理。
悬浮条空白区域可以显示提示信息,默认显示当前视频分辨率大小,具体要显示哪些信息在系统设置中的功能激活中勾选。
在悬浮条中单击电子放大按钮,可以切换到电子放大状态,然后在画面上选取一块区域,选取的时候会自动绘制对应的矩形,鼠标松开后会自动放大显示选取的区域。为了能够区分哪些通道处于电子放大状态,在单击了电子放大按钮后,悬浮条会一直显示,直到再次单击该按钮撤出电子放大状态。画面模式和原始的视频显示模式一致,如果画面模式是拉伸填充则电子放大的画面也是拉伸填充。
可动态添加任意多个osd标签信息,标签信息包括名字、是否可见、字号大小、文本文字、文本颜色、标签图片、标签坐标、标签格式(文本、日期、时间、日期时间、图片)、标签位置(左上角、左下角、右上角、右下角、居中、自定义坐标)。
具体结构体参数和使用方法如下:
x1//标签信息
2struct OsdInfo {
3 QString name; //名字唯一标识符(方便删除或更新)
4 bool visible; //是否可见
5 int fontSize; //字号大小
6 QString text; //文本文字
7
+ 系统支持多画面切换,全屏切换等,包括1/4/6/8/9/13/16/25/36/64画面切换,如果还需要增加更多的画面比如81/100/255等,可以直接在videobox.cpp源码中稍微修改即可。
画面切换支持多种方式:
鼠标右键画面切换。
底部左侧画面切换缩略图。
快捷键alt+enter全屏。
快捷键esc退出全屏。
切换到X画面,标准的行列数通道布局,比如竖屏一般需要4x2这种,表示4行2列布局。
切换到Y画面,自定义的一些布局,比如通道01-通道02表示左右两侧各一个通道。通道01-通道03表示上面一整个通道,下面左右两侧各一个通道。可以自行在videobox类中增加或者修改。
2.7 声音调节
在主界面画面栏右下角,按下声音图标自动弹出声音调节面板,失去焦点自动隐藏,拉动声音滚动条来调节声音大小,还有静音切换。右下角的声音和静音切换是针对所有通道的,单个通道可以在每个通道的悬浮条工具栏中单击静音切换按钮。
2.8 视频轮询
参数说明:
自动轮询:开启后在软件启动后会自动轮询。
轮询间隔:可选5s、10s、30s、60s等,按照此间隔切换下一组视频。
轮询画面:可选1画面、4画面、9画面、16画面,轮询的时候按照多少个通道同时显示。
轮询方案:也可以叫轮询分组,在系统设置中配置。
启动轮询:单击后会启动轮询,轮询是通过定时器控制的,到了时间就切换到下一屏画面。再次单击此按钮会停止轮询,停止轮询会复位轮询分组索引,下次轮询重新从第一个开始。
暂停轮询:单击后会暂停当前轮询,只是定时器暂停,当前轮询索引不变,再次单击从上一次轮询到的位置开始继续轮询。
2.9 通道交换
通道交换功能很常用,一般用户喜欢调整自己想要的通道显示到前面或者占据画面的更大部分,比如6画面8画面的时候,左侧有一个画面占据很大的位置,一般这个用来显示重要性最高的实时视频,如果需要通道交换,则按住通道拖动到另外一个通道上面松开鼠标即可,会立即应用,瞬间切换,这里切记不要移出视频画面外,移出去表示删除。
本系统也封装了代码中动态控制切换和动态交换,具体演示示例代码在DeviceThreadUI类中,具体全局调用函数在AppEvent类中,具体执行在frmVideoPanelTool窗体类中。
xxxxxxxxxx
51//指定通道显示视频 id从0开始
2void slot_loadVideo(int channel, int ipcID);
3void slot_loadVideo(int channel, const QString &url);
4//通道交换
5void slot_changeVideo(int channel1, int channel2);
2.10 云台控制
如果需要控制云台移动,先要选择对应的通道,边缘会高亮,进行云台控制的前提是该摄像机要是支持云台的摄像机,很多人以为啥摄像机都可以移动,这是错误的,如果摄像机不支持云台,这个功能就别玩了,玩不起,经常遇到一些人说怎么云台不能用了,一检查尼玛原来摄像机根本没有云台。
本系统云台控制走的是onvif协议,没有使用私有协议,上百家厂家的摄像机,走私有协议会玩死人的,所以统一采用onvif通用协议,需要提前在系统设置中的摄像机管理,搜索摄像机,输入正确的onvif用户信息后一键获取到云台地址。具体操作参见 设备搜索 。
2.11 设备控制
设备控制部分,目前可以获取和设置图片参数、手动校时、重启设备、抓拍图片等,和云台控制操作一样,操作前也是需要选中某个通道,然后才是对选中的通道进行设备控制,比如图片参数中的明亮度、对比度、饱和度、尖锐度。
后面把OSD配置模块和网络配置模块也放在这里,因为这几个模块参数排列不适合作为悬停模块,所以统一放在设备控制模块中,通过单击按钮切换出来。
2.12 报警订阅
本系统默认支持海康、大华、宇视、华为、天地伟业等厂家的摄像机的报警事件订阅,可以在系统设置中的视频参数设置中开启事件订阅开关,如果摄像机已经开启了报警事件的话(一般摄像机的网页配置界面进去有移动侦测、遮挡报警、人脸识别、报警输入等各种),默认一般是关闭的,比如摄像机后面的开关量输入报警接口,需要web页面进去设置开启。具体操作参见 报警输入设置 和 Onvif事件设置 。
报警订阅走的是onvif协议,具体事件内容和含义可以在config/event.txt事件字典表中修改,由于onvif事件有多种,而且不同厂家对应关键字对应的事件含义可能不一样,不同厂家的设备可能含义有点出入,所有可以通过事件字典表自行更改,对应内容含义 事件等级/唯一标识/报警字样/解除字样,默认程序按照这个表中的进行过滤,不在表中的可以正常收到但是不会处理。具体处理逻辑代码在DeviceOnvif类中。
常用几种事件字典:
1,IsMotion,有人在移动,移动结束
1,IsInside,有人在闯入,入侵结束
1,LogicalState,开关量报警,报警结束
1,State,开关量联动,联动结束
1,IsTamper,遮挡报警,遮挡结束
2.13 悬浮工具
悬浮条功能介绍:
内置悬浮条控件,悬浮条位置支持顶部、底部、左侧、右侧。
悬浮条控件参数包括边距、间距、背景透明度、背景颜色、文本颜色、按下颜色、位置、按钮图标代码集合、按钮名称标识集合、按钮提示信息集合。
悬浮条控件一排工具按钮可自定义,通过结构体参数设置,图标可选图形字体还是自定义图片。
悬浮条按钮内部实现了录像切换、抓拍截图、静音切换、电子放大、关闭视频等功能,也可以自行在源码中增加自己对应的功能。
悬浮条按钮对应实现了功能的按钮,有对应图标切换处理,比如录像按钮按下后会切换到正在录像中的图标,声音按钮切换后变成静音图标,再次切换还原。
悬浮条按钮单击后都用名称唯一标识作为信号发出,可以自行关联响应处理。
悬浮条空白区域可以显示提示信息,默认显示当前视频分辨率大小,具体要显示哪些信息在系统设置中的功能激活中勾选。
2.14 电子放大
在悬浮条中单击电子放大按钮,可以切换到电子放大状态,然后在画面上选取一块区域,选取的时候会自动绘制对应的矩形,鼠标松开后会自动放大显示选取的区域。为了能够区分哪些通道处于电子放大状态,在单击了电子放大按钮后,悬浮条会一直显示,直到再次单击该按钮撤出电子放大状态。画面模式和原始的视频显示模式一致,如果画面模式是拉伸填充则电子放大的画面也是拉伸填充。
2.15 标签图形
可动态添加任意多个osd标签信息,标签信息包括名字、是否可见、字号大小、文本文字、文本颜色、标签图片、标签坐标、标签格式(文本、日期、时间、日期时间、图片)、标签位置(左上角、左下角、右上角、右下角、居中、自定义坐标)。
具体结构体参数和使用方法如下:
xxxxxxxxxx
651//标签信息
2struct OsdInfo {
3 QString name; //名字唯一标识符(方便删除或更新)
4 bool visible; //是否可见
5 int fontSize; //字号大小
6 QString text; //文本文字
7
8 QColor color; //文本颜色
9 QImage image; //标签图片
10 QPoint point; //标签坐标(位置自定义时候使用)
11 OsdFormat format; //标签格式
12 OsdPosition position; //标签位置
13
14 OsdInfo() {
15 name = "osd";
16 visible = true;
17 fontSize = 12;
18 text = "视频标签";
19
20 color = "#FF0000";
21 image = QImage();
22 point = QPoint(0, 0);
23 format = OsdFormat_Text;
24 position = OsdPosition_LeftTop;
25 }
26};
27
@@ -785,7 +785,7 @@
13.7 打开本地摄像头
在加载USB摄像机的时候,需要填写对应USB设备的名称,可以通过命令行和设备管理器查看对应的名称,要英文的。
在需要加载多个USB摄像机的场景下,有时候会遇到同名的USB名称设备,此时需要打开注册表(计算机\HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\DeviceClasses\{65E8773D-8F56-11D0-A3B9-00A0C9223196}\##?#USB#VID_XXXXXXX\#GLOBAL\Device Parameters\FriendlyName)进行设备名称修改后,按照新修改后的设备名称填入即可。
如果是在虚拟机中打开本地摄像头,你需要对虚拟机做点设置,默认USB2.0需要改成USB3.1。
-
13.8 项目代码行数
整个项目源代码行数大概30W行,其中代码13.5W行(占比45%),注释12.7W行(占比42%),空行3.5W行。分层设计注释详细。
13.9 编译ffmpeg
13.9.1 本地编译
第一步:下载好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
如果提示 ERROR: freetype2 not found 需要安装 sudo apt install libfreetype6-dev
./configure --prefix=host --enable-shared --disable-static --disable-doc --enable-ffplay
其他常用参数 --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目录,生成的文件都在这里,拿去用吧。
13.9.2 交叉编译
在宿主主机交叉编译ffmpeg,只需要增加指定编译器路径 --cross-prefix=... --arch=arm --target-os=linux。完整命令:./configure --prefix=host --enable-shared --disable-static --disable-doc --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
在宿主主机交叉编译x264,完整命令:./configure --prefix=/home/liu/host --enable-shared --disable-asm --host=arm-linux --cross-prefix=/usr/local/arm-linux-gcc-4.9.2/gcc-linaro-arm-linux-gnueabihf-4.9-2014.08_linux/bin/arm-linux-gnueabihf-
在宿主主机交叉编译x265,完整命令:cmake -DCMAKE_TOOLCHAIN_FILE=crosscompile.cmake -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX="/home/liu/host" -DENABLE_SHARED:bool=on ../../source
在宿主主机交叉编译带264/265的ffmpeg:./configure --prefix=host --disable-static --enable-shared --disable-doc --enable-libx264 --enable-libx265 --enable-gpl --enable-rpath --disable-sdl2 --extra-cflags=-I/home/liu/host/include --extra-ldflags=-L/home/liu/host/lib --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
网上看到的其他几个参数:--extra-libs=-ldl --extra-cflags="-fPIC" --extra-ldflags=-Wl,-Bsymbolic --extra-libs="-lpthread -lm"
windows系统采用mingw编译ffmpeg https://blog.csdn.net/yp18792574062/article/details/108962638
13.9.3 编译x264/x265
在linux上默认编译ffmpeg出来的库支持h264/h265的解码,编码并不支持,所以需要单独加上x264/x265的库再编译。
首先要下载好x264/x265的源码包(https://www.videolan.org/developers/x264.html / https://www.x265.org/downloads/),解压到目录,切换到管理员权限(需要编译后拷贝库到/usr/lib)。
编译libx264以便支持h264编码。
./configure --disable-asm --enable-shared --prefix=/home/liu/host
make -j4
make install
编译libx265以便支持h265(hevc)编码。
定位到x265的build/linux目录
执行编译方式1 ./make-Makefiles.bash (或者执行命令用来重新定义拷贝目录 cmake -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX="/home/liu/host" -DENABLE_SHARED:bool=on ../../source)
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/host/include --extra-ldflags=-L/home/liu/host/lib
如果头文件和库已经在系统目录中则不需要指定
./configure --prefix=host --disable-static --enable-shared --disable-doc --enable-libx264 --enable-libx265 --enable-gpl --enable-rpath
链接多个写法:--extra-cflags=“-I/usr/local/x264/include -I/usr/local/x265/include/” --extra-ldflags=“-L/usr/local/x264/lib -L/usr/local/x265/lib/”
如果需要滤镜支持比如文字水印用到了drawtext,还依赖freetype库,还需要加上 --enable-libfreetype。
如果环境中有sdl的库则编译ffmpeg的时候默认会开启依赖sdl,avdevice库依赖他,也可以手动指定禁用sdl --disable-sdl2。
在做静态编译的时候如果提示 ERROR: x265 not found using pkg-config,打开/home/liu/host/lib/pkgconfig/x265.pc文件 ,末尾两行改成 Libs: -L${libdir} -lx265 -lstdc++ -pthread -lm -lrt -ldl / Libs.private: -lstdc++ -pthread -lm -lrt -ldl 。
有个便捷的方法,不需要自己编译,直接安装开发库即可,命令行 apt install libx264-dev libx265-dev 。这个命令的前提是环境要联网,而且对应系统远端包服务器要存在该文件,不存在也无法安装,测试ubuntu14只有264,从ubuntu16开始都有。
如果有需要可以对编译出来的ffmpeg可执行文件设置rpath以便文件和库在一起可以找到库并运行。
查看ffmpeg可执行文件rpath命令 readelf -d ffmpeg | grep 'RPATH'
修改ffmpeg可执行文件rpath命令 chrpath -r "$ORIGIN" ffmpeg
如果在ffmpeg/configure后提示找不到x264,可以尝试 export PKG_CONFIG_PATH=/home/liu/qt/host/lib/pkgconfig:$PKG_CONFIG_PATH 。
ffmpeg7开始支持vvc解码,但是编译未必成功,需要禁用 --disable-decoder=vvc 。
13.9.4 硬件解码
默认提供的windows平台的ffmpeg库内置了硬解码支持,走系统层的dxva2/d3d11va。
linux编译支持硬解码的ffmpeg,需要先安装对应的开发包,比如 sudo apt install libvdpau*
如果linux系统环境中装了libvdpau等,默认编译ffmpeg会开启硬解支持,但是这样意味着发布程序也必须带上对应so文件,有时候需要禁用则命令加上 --disable-vaapi --disable-vdpau 。
13.10 高分屏缩放
在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%可以改变,但总归不是好办法),还有很多其他知名软件也是如此。
+
13.8 项目代码行数
整个项目源代码行数大概30W行,其中代码13.5W行(占比45%),注释12.7W行(占比42%),空行3.5W行。分层设计注释详细。
13.9 编译ffmpeg
13.9.1 本地编译
第一步:下载好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
如果提示 ERROR: freetype2 not found 需要安装 sudo apt install libfreetype6-dev
./configure --prefix=host --enable-shared --disable-static --disable-doc --enable-ffplay
其他常用参数 --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目录,生成的文件都在这里,拿去用吧。
13.9.2 交叉编译
在宿主主机交叉编译ffmpeg,只需要增加指定编译器路径 --cross-prefix=... --arch=arm --target-os=linux。完整命令:./configure --prefix=host --enable-shared --disable-static --disable-doc --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
在宿主主机交叉编译x264,完整命令:./configure --prefix=/home/liu/host --enable-shared --disable-asm --host=arm-linux --cross-prefix=/usr/local/arm-linux-gcc-4.9.2/gcc-linaro-arm-linux-gnueabihf-4.9-2014.08_linux/bin/arm-linux-gnueabihf-
在宿主主机交叉编译x265,完整命令:cmake -DCMAKE_TOOLCHAIN_FILE=crosscompile.cmake -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX="/home/liu/host" -DENABLE_SHARED:bool=on ../../source
在宿主主机交叉编译带264/265的ffmpeg:./configure --prefix=host --disable-static --enable-shared --disable-doc --enable-libx264 --enable-libx265 --enable-gpl --enable-rpath --disable-sdl2 --extra-cflags=-I/home/liu/host/include --extra-ldflags=-L/home/liu/host/lib --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
网上看到的其他几个参数:--extra-libs=-ldl --extra-cflags="-fPIC" --extra-ldflags=-Wl,-Bsymbolic --extra-libs="-lpthread -lm"
windows系统采用mingw编译ffmpeg https://blog.csdn.net/yp18792574062/article/details/108962638
13.9.3 编译x264/x265
在linux上默认编译ffmpeg出来的库支持h264/h265解码,但是并不支持264/265编码,所以需要单独加上x264/x265的库再编译。
如果用不上编码,比如监控摄像头rtsp视频流一般源头就是264/265裸流数据,不需要编码就可以直接保存到MP4,这些情况就无需编译264/265。
本地设备比如本地USB摄像头和本地桌面采集,因为源头不是264/265,所以这种场景下的保存必须编码。
首先要下载好x264/x265的源码包(https://www.videolan.org/developers/x264.html / http://ftp.videolan.org/pub/videolan/x265/ / https://www.x265.org/downloads/),解压到目录,切换到管理员权限(需要编译后拷贝库到/usr/lib)。
下面编译如果不强制 --prefix 指定编译后的目录,则默认存放在 /usr/local/lib 目录中,这个目录在默认的环境变量中。
编译libx264以便支持h264编码。
./configure --disable-asm --enable-shared --enable-static --enable-pic
make -j4
make install
编译libx265以便支持h265(hevc)编码。
定位到x265的build/linux目录
修改配置参数 ./make-Makefiles.bash (或者执行命令用来重新定义拷贝目录 cmake -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX="/home/liu/host" -DENABLE_SHARED:bool=on ../../source)
在刚才修改配置参数中,可以将是否编译动态库设置成OFF,这样可以只编译静态库。到时候就静态编译到ffmpeg库中。
make -j4
make install
如果提示cmake:command not found 需要安装 apt install cmake-curses-gui 。
编译ffmpeg加入x264/x265支持。
指定位置链接264/265头文件和库,--extra-cflags=“-I/usr/local/x264/include -I/usr/local/x265/include/” --extra-ldflags=“-L/usr/local/x264/lib -L/usr/local/x265/lib/” 。记住头文件是大写的i,库文件是大写的l。
完整命令行 ./configure --prefix=host --disable-static --enable-shared --disable-doc --enable-libx264 --enable-libx265 --enable-gpl --enable-rpath --enable-libfreetype --disable-vaapi --disable-vdpau --disable-sdl2 --extra-cflags=-I/home/liu/host/include --extra-ldflags=-L/home/liu/host/lib
如果头文件和库已经在系统目录中则不需要指定,比如默认编译不指定目录,执行install命令后会自动安装到环境变量目录中。
完整命令行 ./configure --prefix=host --disable-static --enable-shared --disable-doc --enable-libx264 --enable-libx265 --enable-gpl --enable-rpath --enable-libfreetype --disable-vaapi --disable-vdpau --disable-sdl2 。
ffmpeg6.1开始默认drawtext滤镜强制依赖harfbuzz,需要主动加上 --enable-libharfbuzz 。
ffmpeg7.0开始支持vvc解码,但是编译未必成功,需要禁用 --disable-decoder=vvc 。
如果需要滤镜支持比如文字水印用到了drawtext,还依赖freetype库,还需要加上 --enable-libfreetype。
如果环境中有sdl的库则编译ffmpeg的时候默认会开启依赖sdl,avdevice库依赖他,也可以手动指定禁用sdl --disable-sdl2。
有个便捷的方法,不需要自己编译,直接安装开发库即可,命令行 apt install libx264-dev libx265-dev,安装后会在环境中安装有 /usr/lib/x86_64-linux-gnu/libx264.a libx265.a libx264.so libx265.so ,没有带具体的版本号。这个命令的前提是环境要联网,而且对应系统远端包服务器要存在该文件,不存在也无法安装,测试ubuntu14只有264,从ubuntu16开始都有。
静态链接:./configure --pkg-config="pkg-config --static" --prefix=host --disable-static --enable-shared --disable-doc --enable-libx264 --enable-libx265 --enable-gpl --enable-rpath --enable-libfreetype --disable-vaapi --disable-vdpau --disable-sdl2 。
如果有需要可以对编译出来的ffmpeg可执行文件设置rpath以便文件和库在一起可以找到库并运行。
查看ffmpeg可执行文件rpath命令 readelf -d ffmpeg | grep 'RPATH' 。
修改ffmpeg可执行文件rpath命令 chrpath -r "$ORIGIN" ffmpeg 。
如果在ffmpeg/configure后提示找不到x264,可以尝试 export PKG_CONFIG_PATH=/home/liu/qt/host/lib/pkgconfig:$PKG_CONFIG_PATH 。
后面经过反复的测试验证,可以编译静态的264/265的库,然后在编译ffmpeg动态库的时候静态链接进去。前提是在编译264/265的库的时候只选择编译静态库,如果静态动态都编译了,优先取动态库,会导致预期失败。为了验证这个功能,至少各种情况叠加编译264/265/ffmpeg次数超过100次。
编译参数加上 --pkg-config="pkg-config --static" 可以强制指定采用静态库链接,默认是动态库。但是测试发现还是有问题,必须保证环境中只有静态库才好使。
在链接静态的265的时候,如果提示ERROR: x265 not found using pkg-config,可以打开编译的ffmpeg/ffbuild/config.log文件看具体原因,如果提示的是thread相关字样,需要打开 /usr/local/lib/pkgconfig/x265.pc文件,在Libs.private这行末尾加上 -lpthread ,保存文件,重启系统再编译。参考链接 https://blog.csdn.net/mls805379973/article/details/103425343 。
13.9.4 硬件解码
默认提供的windows平台的ffmpeg库内置了硬解码支持,走系统层的dxva2/d3d11va。
linux编译支持硬解码的ffmpeg,需要先安装对应的开发包,比如 sudo apt install libvdpau* 。
如果linux系统环境中装了libvdpau等,默认编译ffmpeg会开启硬解支持,但是这样意味着发布程序也必须带上对应so文件,有时候需要禁用则命令加上 --disable-vaapi --disable-vdpau 。
13.10 高分屏缩放
在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内置样式风格或者系统默认风格也一样。
1int 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%可以改变,但总归不是好办法),还有很多其他知名软件也是如此。
13.11 浏览器内核
本系统的电子地图模块支持三种浏览器内核: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 文件。
windows目录一般是 Qt5.7.1\5.7\msvc2013\bin\Qt5WebEngine.dll
linux对应目录一般是 Qt5.14.2/5.14.2/gcc_64/lib/libQt5WebEngine.so
13.12 ODBC数据源
本系统除了支持直连各种数据库比如mysql、postgresql、sqlserver、oracle数据库,也支持odbc数据源的形式连接以上各种数据库,在配置数据源的时候,记得区分32、64位,对应数据源后面带有32/64一起字样的说明该数据源可以同时支持32位和64位的程序访问,不带的要用对应位数的才能访问。数据库名称记得填写的是数据源对应的名称,而不是数据源连接的数据库名称,很多人会搞错。
13.13 摄像机音频设置
摄像机音频编码可选多种格式,建议选择用AAC格式。
@@ -795,7 +795,7 @@
13.16 linux-wayland
大概从ubuntu21开始,默认桌面系统采用wayland,这种桌面环境中无法抓取桌面,需要在登录的时候右下角选择Ubuntu on Xorg。
参考链接 https://blog.csdn.net/daocaokafei/article/details/117200692
13.17 --no-sandbox
如果在部分linux系统运行的时候提示 unning as root without --no-sandbox is not supported,说明当前是以root身份运行的程序,监控系统中用到了浏览器模块,该模块要求安全性沙箱运行,需要手动在运行的时候末尾加上指令。
13.18 秘钥控制
监控系统源码中包含了秘钥控制代码,对应的秘钥文件是源码下的 db/key.db,这个秘钥文件是去掉了任何限制的,所以拷贝过去不会有任何限制。
秘钥限制有两种机制,一种是通用秘钥文件,不依赖本地机器码,比如该秘钥内容只控制了限制最大设备数量。该秘钥文件通用该软件所有目标机器。一种是依赖机器码,开启后,会读取本地的机器码,和秘钥文件中的比较,不符合则弹出机器码,然后在秘钥工具中填入该机器码,生成秘钥文件,拷贝过来。
两种秘钥机制可以同时开启,分别对应文件 key.db和key.lic。
秘钥控制部分代码在 appinit.cpp中initOther()函数中,默认采用的常规秘钥key.db。
机器码秘钥步骤:
第一步,代码中开启机器码秘钥验证,在appinit.cpp中的initother函数,bool ok1 = CommonKey::checkLicense(QtHelper::appPath() + "/db/key.lic"); 编译程序。
第二步:发布程序后,运行,如果提示秘钥文件丢失,则在db目录下新建一个空白文本文件比如key.txt,打开填入123保存,重命名key.lic。再次运行程序,如果提示秘钥文件错误,请联系供应商! 已自动复制机器码字样,则粘贴出来机器码,发给厂家。
第三步:厂家用秘钥工具填入机器码,生成机器码秘钥文件,发给用户,同名文件替换即可。
13.19 去掉部分模块
本系统采用模块化的设计,各种核心模块放在core目录中,需要用的时候直接include包含pri文件即可,非常方便。
有时候可能不需要部分模块,比如去掉浏览器模块,因为有些嵌入式环境中可能没有浏览器模块。
能够去掉的模块标志位都放在pro文件中,只需要在pro中修改对应define标记即可,修改后务必记得彻底重新编译才能生效。
对应标志位在core.pri文件中有对应的包含组件文件,如果对应组件没有启用,可以删掉对应组件模块代码。在QtCreator中左侧树状列表也可以看到对应的组件是灰色的禁用状态。
去掉音频模块,audiox改成audiox1。
去掉opengl模块,openglx改成openglx1。
去掉解码模块,ffmpeg改成ffmpeg1。
去掉浏览器模块,启用nowebview。
13.20 Onvif事件设置
除了常规的开关联报警外,还可以设置各种智能检测。
这些智能识别事件可以在后台开启,开启后捕获到以后会通过onvif发给软件端。
这种由前端设备直接把人工智能运算处理掉的做法俗称边缘计算,这样可以大大分散中心端处理的压力。
也有很多场景是提供专门的算法盒子,由盒子统一处理,视频识别后辨别各种事件。
还有一种做法是统一中集成中心专门对所有的接入的视频进行处理,这就需要庞大的运算能力。
-
14 版本说明
14.0 后期规划
摄像机信息表的用户信息字段用起来,视频流地址不带用户信息,主动加入用户信息构建最终地址应用。
用户密码密文存储,防止泄露。
电子放大改成大华的处理方式,不要在原视频滤镜方式处理,而是搞个单独的窗体在视频控件中显示,可以拖动。
14.1 精益求精
V20240410
重写天气预报模块,采集源换成中央气象台,永远不过时。同时新增自动定位当前城市功能,定位到当前城市后自动采集当前软件所在的城市的天气数据。
无边框拖动类新增限定只能鼠标左键拖动。之前左键右键和鼠标中间按键按下都可以拖动。
将nativeevent处理提炼到单独的窗体类,需要的窗体继承即可。方便其他项目复用代码。
天气预报功能激活改成立即应用。
修复部分城市天气预报不能采集的bug。
设备树状显示模块增加搜索功能,可以输入关键字对设备数搜索。支持回车触发、单击搜索按钮触发、单击清空按钮触发。父节点下所有子节点没有匹配关键字的则父节点也隐藏。
增加ffmpeg7的支持,今天ffmpeg7刚发布,据说性能有巨大提升。
修复密码文本框控件,输入内容超过右侧密码按钮的bug。增加了setTextMargins设置文本区域的边距。
内核ffmpeg增加了getimage函数用于从实时流中获取图片,一般用于人工智能运算用,之前已经有snap截图接口,但是会保存图片文件,频繁的抓图运算是不需要保存的,避免不必要的磁盘性能损失。
修复当填入的网络地址或者视频流地址前缀非小写的时候,媒体地址类型判断失败的bug。保存推流文件也增加这个过滤。比如地址填RTSP://xxx会判断成其他类型,正确的做法是前缀全部转为小写再判断。
悬浮条参数增加设备IP地址选项,如果地址中存在IP地址则取出IP地址,不存在则不显示。
改进滤镜处理,将 av_buffersrc_add_frame 换成 av_buffersrc_add_frame_flags 函数并指定参数 AV_BUFFERSRC_FLAG_KEEP_REF,默认参数是0表示不会保持引用,这样下面再去用解码后的原始数据帧转图片可能是黑屏。
彻底修复在开启大量滤镜后,尤其是人工智能运算后,需要频繁更新一堆rect区域绘制,在同时开启多路分辨率很大的通道时候,可能崩溃的bug。核心原因是事件处理来不及,openglwidget窗体绘制那边,引用了解码后的yuv数据,而这边刚好又释放了导致bug。之前用的是延迟2帧绘制策略,这样看起来很明显在重新应用滤镜后会缺失2帧画面,越是频繁越感觉卡。终极方案是搞个缓存帧队列,当到了缓存队列末尾的时候,再开始释放滤镜帧,非常完美,再频繁再多通道都毫无压力。有个缺点就是增加了一部分内存占用,这个影响不大,会在解码线程结束后立即释放。
V20240330
修复ffmpeg内核不支持采集虚拟声卡的bug,现在支持虚拟声卡,直接内录电脑声卡声音数据,和桌面同步采集录制保存或者推流。
纠正地址中带视频编码缩放参数可能为空值的情况。
修复录像计划中添加的通道数超过最大通道,开启录像存储崩溃的bug。
增加screen-capture-recorder录屏时支持帧率设置。
修复保存文件命名中如果文件名中有mp4字样会被替换成拓展名的bug。
视频回放增加avi/mov/mkv类型的文件。比如vlc内核在保存pcm音频格式的视频流,文件格式会自动改成avi,mpv内核在保存pcm音频格式的视频流,文件格式要求用mov保存才行,否则保存的文件不能播放。
V20240315
修复样式表不支持utf8以及带BOM格式的文件,换成采用QTextStream文本流来读取。之前如果用户在qtcreator中打开样式表修改后保存成了非ANSII格式,导致file.readAll()读取后执行出错,样式表失效。
本地摄像头保存MP4文件增加音频存储,之前由于本地设备音视频存储不同步的问题一直默认去除了音频存储,只有视频存储。近期才发现原来是由于写入的时候调用的av_interleaved_write_frame,默认会缓存,导致可能音频越来越慢。改成av_write_frame即可。
增加保存裸流文件名判断机制,如果设置的强转264,则裸流文件名是h264,如果设置了强转265,则裸流文件名是h265,其他则按照源头是什么格式就对应什么格式。
修复Qt6.4.3/Qt6.5.3等版本中openglwidget和webengine共存出现地图黑屏的bug。
搜索设备后自动选择末尾行,在单播的时候特别有用,省去用户还要去手动选择搜索结果进行一键获取。
新增国网绿配色方案。
新增宇视NVR自动识别格式批量添加。
批量添加NVR到对应通道,通道编号改成按照传过来的真实通道号,之前是索引号,不够准确。
V20240305
去掉了EncodeType编码策略枚举和对应参数,合并到视频编码枚举参数,EncodeVideo增加EncodeVideo_None枚举。
增加判断文件是否有B帧静态函数。如果是有B帧,则推流的时候建议转码,否则推流后拉流出来的视频很可能是抽搐的。
调整编码策略,现在支持rtsp+pcma/pcmu数据保存到mp4文件,音频不用转码。
视频控件悬浮条录制中字样做了修改,区分是保存到文件还是推流,对应字样 录制中/推流中。
重新调整音视频同步策略。
默认同步;
rtsp视频流默认不同步,以最快速度解码;
本地设备(本地摄像头和桌面)采集不同步;
设置了最快速度解码则不同步;
设置了质量优先解码则同步;
纯音频永远同步;
这些策略按照优先级从低到高;
比如是视频文件,但是又设置了最快速度解码,则不同步;
比如是rtsp视频流或者本地设备采集,又设置了质量优先解码,则同步;
比如是本地音频文件,设置了最快解码,因为是纯音频,则同步;
视频文件最快速度解码不同步,是为了测试本机的解码性能,一直不停的读取和解码显示。
V20240205
将编码参数合并成编码信息结构体,放到了基类中。
修复内核ffmpeg强制转码保存分辨率不支持奇数的bug。增加了自动调整到偶数的策略。
将ffmpegsave类拆分出来ffmpegsavehelper类,专门存放保存相关的静态函数。
将ffmpegthread类拆分出来ffmpegthreadhelper类,专门存放解码相关的静态函数。
将ffmpeg所有函数接口支持到ffmpeg6,将废弃函数全部换成了新的,自动识别是何种ffmpeg版本自动调用对应的函数接口。对应各种版本不同的函数接口调用都放在ffmpeghelper类中。
保存264/265裸流增加sps/pps信息,保证所有解码出来的流保存成裸流文件都能正确解析。
保存视频文件信号中的文件名参数改成了真实的文件名(之前是传入的文件名/不够准确/因为可能会自动调整到真实的拓展名),比如纯音频文件是wav拓展名,裸流文件是h264/h265拓展名。
保存文件策略中将纯音频的保存统一编码保存到wav文件,保证所有音频格式解码后都能正确保存到wav文件。
保存文件增加了超时回调,防止在推流的时候碰到流媒体服务器不通或者有问题,导致卡主很久。
V20240125
修复无声卡电脑关闭视频的时候崩溃的bug。
修复主界面在注释掉部分停靠窗体后,加载界面可能导致界面索引溢出的bug。
修复倍速播放的时候声音可能产生呲呲声音的bug,采用同步修改采样率,比如采样率44100,倍速2,则音频播放设备采样率=44100乘以2。
内核ffmpeg增加倍速保存,比如60s的文件可以加速编码保存成30s的文件。如果保存的文件存在音频则最大2倍速,仅有视频则倍速可以到8倍。该机制同样适用于推流。
改进音视频同步线程是否启动机制,只有存在视频则启动视频同步,存在音频才启动音频同步。并且都要求开启了音视频同步标志位的情况下启动。
改进音频振幅控件,自动计算宽高绘制振幅,垂直则绘制垂直状的振幅。
第三方录屏screen-capture-recorder,由于不支持设置桌面索引和分辨率,改成从源头修改分辨率和帧率等参数。
修复重连阶段,开启了悬浮音柱的情况下,音柱没有隐藏的bug。
修改绘制背景策略,只要是启动了线程就清空背景,停止了线程就绘制背景。这样可以直观的察觉当前是否已经启动了线程。
音频组件中的音频振幅控件增加渐变颜色。
音频播放组件增加变速不变调处理,采用的sonic库做运算。可以变速不变调,也可以不变速变调,还可以不改变声卡音量的情况下,通过声音数据运算,强制提高音量。
增加通道默认颜色为黑色。之前是透明色。
新增了全景通道布局,放在y布局大类中,就是上下4个通道,中间一个长方形的大通道。
V20240118
轮询期间新增禁止录像策略。停止轮询后恢复设置的状态。
修复轮询视频期间,没有应用声音大小和静音状态的机制。
修复声音大小设置时机可能不准确的bug。
新增打印信息开关,可以控制视频解码线程、保存线程、onvif线程中的打印信息是否开启。
修复在设置了setCodecForLocale编码下,采集指定中文标题的时候可能失败的bug。
增加自适应解码器采集各种本地摄像头设备,优先尝试用mjpeg解码本地摄像头设备,失败后则不指定解码器再重新打开一次。保证任何时候都能正常打开。
新增了devicehelper类,专门用于获取本地视音频输入设备名称集合。
将core_videobase组件拆分成core_videobase/core_videohelper两个组件,将辅助相关的类放到了core_videohelper组件中,分类更精准,更易学习。
批量添加模块增加自动获取本地视音频设备名称,可以指定视音频设备地址添加。
本地设备地址增加解码器名称列,可以直接通过url地址指定是mjpeg/h264/默认值几种解码器来打开设备。
V20240112
去掉1通道0_1标识,改成x布局中增加1_1x1这种万能方式,同时调整主界面底部1通道按钮选中逻辑。
带音柱通道,悬浮音柱模式下,增加判断如果当前视频没有音频,则不显示音柱。
新增音柱背景颜色透明度配置参数,默认全透明=0,0-255范围值。
修复在设备树节点选中的情况下,从本地文件夹拖曳文件播放后,可能出现选中节点也拖曳的的情况。
考虑到视频相关的参数配置越来越多,将视频参数配置单独起一个界面。
新增音柱背景透明度和悬浮条背景透明度值在视频参数配置中,调整后立即应用。
修复在没有开启视频存储的时候,当手动录像期间,到了整半小时(处于0分钟或者30分钟的时候)的时候会被终止录像的bug。
新增mac上获取cpu序列号,用于秘钥文件。
修复开启共享解码线程模式下,地图上点开的视频,会停止采集的bug。这是近期新增的电子放大功能引入的bug,目前策略是除了主界面视频通道窗体外,其他弹出的视频窗体全部不采用共享解码,实际上也只有主界面才需要共享解码线程。
修复频繁大量打开关闭通道可能造成内存泄漏的bug,该bug是Qt本身的bug,qaudiooutput在线程中执行释放不干净,需要进行特殊处理。
声音播放线程增加过滤,没有声音索引的媒体文件,不会启动该线程,之前是默认启动。
V20240105
音频振幅和实时码率改成了立即应用,可以通过基类的视频控件以及视频采集线程设置。这样只在需要统计实时码率的时候才会去真正统计,大大节约CPU运算。
重新调整videobox视频布局盒子类,将changeVideo信号改成changeLayout,更贴切。其他很多函数名和变量也做了对应更改,包括配置参数的videoType改成了layoutType,之前的命名很容易误解成视频类型,其实是为了表示画面布局类型,比如当前1_6通道显示。
将videoUrl改成mediaUrl,VideoType改成MediaType,使得描述更准确,媒体地址可以是视频地址也可以是音频地址等。
将纯音频标志位onlyAudio判断改成了解析中判断,最终解析后只有音频没有视频才认定是纯音频,有些网络视频流也是纯音频,比如m3u8格式的hls流。要最终解析完成后才能判断。
统一约定只有本地mp3文件才需要解析封面并绘制封面。
悬浮条信息增加视频模式,由于不同解析内核会自动调整视频显示的模式,比如设置的绘制,由于该内核不支持绘制,调整成句柄,方便查看最终何种视频展示模式。
统一了本地设备采集包括本地摄像头和桌面采集的url规则,各种视频解析内核通用,调整了对应相关的函数接口逻辑。
修复桌面录屏在ffmpeg5以下版本不支持指定窗口中文标题的BUG,需要转换成toLocal8Bit。
统一设备采集标识Device_Audio/Device_Video/Device_Screen三种。
媒体类型MediaType_Desktop改成MediaType_Screen,描述更准确。同时将桌面采集对应地址前缀desktop=改成screen=。
配置参数增加悬浮条背景透明度,可以通过设置对应的值控制悬浮条的透明度。
V20240101
本地设备采集增加本地音频输入设备采集,现在可以指定 video=USB Video Device:audio=麦克风 (USB Audio Device) 这种格式采集摄像头和音频一起。
增加采集音频参数设置。
增加对 screen-capture-recorder 设备的采集,一个第三方高效录屏库。
使用 screen-capture-recorder 桌面采集的同时可以录制音频。
新增各种保存路径配置参数,可以在其他设置中配置录像文件路径、报警视频路径、抓拍图片路径、报警图片路径。支持中文路径等。
通道报警后,对应抓图或者存储报警视频,按照设置的路径存储,同时存储警情记录到数据库,记录带报警图片或者报警视频的路径,在日志记录查询中可以双击查阅。如果当前触发的报警存储了报警视频则优先取报警视频路径。
本地摄像头采集增加强制设置成mjpeg格式,由于一些小分辨率下默认是rawvideo格式,不支持滤镜,所以换成mjpeg格式都支持滤镜。
悬浮条显示的文本信息,新增了结构体参数,可以设置哪些信息需要显示,比如分辨率、帧率、封装格式、视频解码格式、音频解码格式、实时码率、硬解名称等。默认只开启分辨率显示。
新增配置参数用于配置悬浮条可以显示哪些信息。
功能激活复选框改成放到列表中,方便后期拓展更多可控的激活功能,包括悬浮条哪些参数可以显示。
音柱位置新增上下左右排列等多种布局,可以在系统设置中选择。
删除两个配置参数,音频振幅AudioLevel(用音柱位置参数VolumePosition替换/0表示不启用/>0表示启用),统计实时码率CountKps(用悬浮条参数RealBitRate替换,一旦开启了显示悬浮条码率参数,则必须开启)。
新增音柱尺寸策略,可以选自动设置,也可以设置固定的值,以便适应各种用户需求。
增加纯麦克风采集音频支持,可以指定音频输入设备比如麦克风采集。
音柱位置间隙根据悬浮条位置自动留出间隙,以便悬浮条有足够空间。
系统设置中的视频参数变化,悬浮条位置切换、音柱尺寸等参数变化,改变后立即应用。
音柱尺寸增加用户自定义值,用户可以通过直接修改配置文件指定一个特殊的值。由于下拉框中的值都是一些常规值,用户如果找不到对应的值可以通过修改配置文件更改,对应指定的值也会自动添加到下拉框。
系统设置中各种悬浮条信息配置改成勾选后立即应用。
V20231205
增加通用地址格式规范,url|transport|encodeType|encodeVideo|encodeVideoRatio|encodeVideoScale,可以直接在播放地址中指定通信协议、是否编码保存、编码帧率等信息,具体可以参见说明书中的地址格式说明。
对大华的NVR增加自适应计算配置文件个数,有些是2个有些是3个,需要自适应,计算后按照对应的规则添加NVR的通道。
鼠标拾取限定鼠标左键操作。
悬浮条增加判断,如果处于电子放大期间则鼠标移开不自动隐藏,方便标记当前哪些通道处于电子放大期间。
鼠标画矩形增加坐标换算,鼠标可能是从左上角到右下角,也可能是从右侧到左侧,而QRect只支持左上角右下角参数,需要自动换算,用户有可能是从右下角到左上角,这些特殊情况也要支持。
新增切换声卡接口,已经实现了qmedia、vlc、mpv、ffmpeg等内核对应切换声卡接口。有些用户希望每个通道可以指定到不同的声卡来播放声音。
通道布局类重新调整接口,将2通道和3通道布局移动到x布局中,同时增加自定义x布局接口函数,比如可以手动指定3x6布局这种,非常灵活,方便垂直屏幕展示。
新增自定义y布局,之前自定义x布局专门是固定行列数的布局,可以自行添加,将一些特殊定制的布局放在自定义y布局中,同时调整诸多函数接口。
V20231125
视频监控布局类videobox新增了指定行数列数接口,新增了指定行列数的默认布局,比如1_2x4表示通道1开始按照2行4列排列,方便垂直屏幕展示比如手机上或者竖屏。
优化本地摄像头和桌面采集的暂停策略,和文件一样,暂停期间不需要去实时采集。而视频流这种暂停期间必须实时采集不解码。
修复http地址中带空格的地址无法正常播放的BUG,需要用QUrl().toEncoded转码。
鼠标按下发送对应源图像坐标信号增加事件类型参数,鼠标按下、鼠标松开、鼠标移动三种都能够发出信号,以便外部用于动态绘制矩形区域,相当于拿到对应的矩形区域在下发处理。
内核增加电子放大功能,鼠标按下拾取区域,作为crop滤镜,实现电子放大。移除该滤镜可以恢复。
屏幕采集增加自定义区域采集规则,约定屏幕索引255则取用户填入的自定义区域进行采集。
组件onvif增加错误数据返回信号,可以查看具体错误数据信息,方便分析问题,比如是否是用户信息不对导致的。
悬浮条增加电子放大按钮,直接开启电子放大和结束电子放大,电子放大期间,在视频画面上选择区域后自动对该区域放大。
V20231105
内核ffmpeg中保存类型SaveVideoType_H264改成了SaveVideoType_Stream,表示裸流类型,可以是264/265。
保存裸流情况下增加区分264/265拓展名。
内核ffmpeg/qtav/easyplayer/海康sdk等增加逐帧播放功能。
内核ffmpeg增加缓存大小的参数传入,对应buffer_size参数,可以通过参数配置。有些极大帧率或者分辨率的设备需要这个参数设置才能正常运行,否则很可能缓存不够导致花屏。
修正onvif组件在设备没有回传时区TimeZone节点信息的时候无法正确设置时间的BUG,改成默认用东八区去计算。
V20231010
修复部分视频文件在循环播放的时候失效的BUG,经查阅这种文件一般前面会缺失一些数据帧,导致播放定位失败,改成通过videofirstpts时间判断。
修复在win10及以上系统中CPU使用率采集和任务管理器不一致的BUG,改成了命令行typeperf获取。
修复了ffmpeg内核opengl绘制yuv数据在部分很老的硬件上绿屏的BUG,将 GL_RED 全部换成了 GL_LUMINANCE 以便支持旧版本的opengl。比如部分配置低的手机。
修复linux系统上采集本地摄像头无法设置分辨率的BUG。
本地文件回放增加拖曳播放,方便用于测试从NVR下载的视频文件。
内核ffmpeg增加自动获取本地音视频设备文件名的接口。
V20230915
彻底解决应用滤镜后可能出现崩溃的BUG,比如在频繁大量切换新的滤镜过程中,刚好界面这边在绘制画面数据,导致数据冲突引发的BUG,之前绘制模式和硬解码模式不崩溃是因为,绘制模式用的是painter绘制图片,没有用opengl绘制,硬解码是因为取出来的帧数据就是中转过的,不会出现数据冲突的情况。所以在没有硬解码情况下的opengl绘制模式,增加了一个avframe用于中转数据,同时在新切换滤镜后的延迟1-2帧(时间大概0.03s)应用新的滤镜,这样就再也不会出现opengl绘制数据冲突崩溃情况。也考虑过传递给opengl绘制的数据拷贝一份,肯定可以终极解决问题,但是每次帧数据都拷贝一份那就增加了不少CPU,不可取。
将录播监控类型去掉,配置参数新增了AudioLevel用于开启音频振幅,开启后,主界面每个通道右侧会显示对应的音频振幅,分左右通道。
桌面采集改成永远不共享解码策略。
新增摄像机和录像机默认名称配置参数。
双击NVR父节点打开该节点下面的所有摄像机,增加延时,防止不延时情况下在部分电脑上可能崩溃的BUG。
V20230906
修复本地桌面地址默认分辨率问题,当没有指定分辨率的时候取当前鼠标所在的屏幕区域作为分辨率。支持多屏幕,包括虚拟机中分辨率奇数问题,自动取偶数。
重新调整桌面录屏的XY坐标策略,设置值永远是正数值,根据当前屏幕所在位置进行偏移(左上角X=0 Y=0),多屏幕情况下坐标可能是负数,而且屏幕可以是横向还可能是竖向,自动程序计算,这样用户只需要填入从当前屏幕左上角开始偏移多少就行,而不需要去计算具体的值。同时纠正超过屏幕区域的采集分辨率,以设定的偏移值开始到右下角结束进行裁剪。
桌面采集增加手动支持屏幕索引参数,在XY坐标偏移值后面,不指定则以鼠标所在当前屏幕为准,指定则以指定的索引为准,屏幕索引大于屏幕数量则以鼠标所在当前屏幕为准。这样相当于可以对每个屏幕分开采集,每个屏幕都是在一个独立的通道显示。
测试发现在linux系统上如果使用ffmpeg静态库,会报错提示avfilter不成功,需要调整库链接顺序才行,之前是 -lavformat -lavcodec -lavfilter -lswscale -lavutil -lswresample,统一改成 -lavformat -lavfilter -lavcodec -lswresample -lswscale -lavutil ,通过查阅ffmpeg的示例代码的链接顺序得知。
测试发现在ubuntu18/20/22等系统上编译程序设置rpath失败,导致编译后的程序只能编译运行,不能双击运行。查阅资料原来是新版的系统修改了对应的rpath设置机制,https://blog.csdn.net/random_repick/article/details/122980119 ,需要在编译参数加上 -disable-new-dtags 参数即可。之前是 QMAKE_LFLAGS += "-Wl,-rpath,'$$ORIGIN/lib'" ,改成 QMAKE_LFLAGS += "-Wl,-rpath,'$$ORIGIN/lib',-disable-new-dtags" 。
滤镜osd增加了背景颜色参数,支持透明度。
修正linux系统桌面采集对应偏移值没起作用的BUG,需要通过设备名传入,比如 :0.0+0,0 后面的 0,0 才是表示偏移值。
V20230818
所有密码框全部提升为自定义文本框控件,全局样式加入密码按钮,单击显示密码,再次单击密文显示。登录窗体、登出窗体、数据库管理等界面。
数据库组件增加access数据库的支持。
通过远程设备回放rtsp视频流,增加进度条显示,可以切换进度条,一般海康大华等厂家的NVR支持rtsp视频流回放,而且带了时长,可以切换回放的进度,但是不能倍速。
将带柱状声音条的视频面板重命名为 frmvideowidgetvolume,带播放进度条和时长的视频面板命名为 frmvideowidgetslider,视频预览窗体重命名为 frmvideowidgetpreview,因为这三者属于独立的视频控件窗体,在多处独立使用。
远程回放rtsp视频流增加同步播放进度,勾选后,切换某个通道进度,其他几个通道自动切换到对应播放进度,这样可以查看回放通道同一时刻的监控画面。
更新地图秘钥,之前的秘钥文件由于使用者太多,会出现未授权地图字样。
修复onvif报警事件触发的报警录像存储文件前缀标识不正确的BUG,当通道显示的主码流而系统设置默认打开子码流的情况下会发生。
日志记录中备注字段用于存储报警图片文件或者报警视频文件的文件名称,报警视频优先级大于报警图片。双击预览报警图片或者报警视频。
修复报警日志中弹出预览失败的情况,当文件被删除后要先判断文件是否存在。
回放界面增加了播放按钮,可以暂停和继续播放当前回放的视频。
将报警视频预览单独一个函数,带播放进度条,回放报警时候的时候,可以暂停和继续播放。
日志记录增加按照通道查询。报警日志存入的时候都统一换成两位字符串作为通道存入,比如 01/02/03/16,统一长度对齐。
修复实时视频流查看的时候,没有时长的BUG,不要去获取时长,是个很大的负数。只有回放的视频流才有时长。
V20230802
轮询管理中添加轮询通道的时候,对应分组以右侧选中的分组为准,选中的哪个分组则对应添加的时候就添加到对应轮询分组中。
轮询管理中左侧表格增加右键菜单(全部选中、反向选中、全部不选),执行对应的操作。
增加自定义密码文本框,可设置双击显示明文/失去焦点自动恢复,以及右侧显示密码按钮,单击切换明文密文显示。
修复ffmpeg内核录像阶段硬解码模式下各种滤镜信息没有保存到文件的BUG。
修复ffmpeg内核录像阶段硬解码模式下保存的视频文件,播放期间渐渐变模糊的BUG。
core_qui组件更名为core_qthelper,里面的类名也全部重新更换,比如quihelper改成了qthelper,表达更精确。
内核ffmpeg增加视频流地址末尾加通信协议(tcp/udp),有些视频流必须用tcp或udp协议才能加载成功,可以手动指定,已经有全局的视频配置参数,地址中带的协议优先级最高,没有带则采用全局配置的。
彻底解决时区时间不对导致部分摄像头设备不能onvif交互的问题,如果本地时区设置的和设备设置的时区不一致,需要转换后再统一用标准时间去下发onvif指令,之前写死的东八区8小时,应该根据系统环境去获取,而且还要区分夏令时(时区-1),还要区分半小时制的时区(5.30时区),一套组合拳打下来,彻底解决问题。嵌入式板子很多不是东八区或者linux系统也可能是其他时区。这个细节市面上99%的onvif协议监控软件都没有考虑(一运行就崩溃或者无法正常加载onvif设备),必须要求运行软件的环境和设备所在环境的时区时间一致。
V20230718
各种内核都增加音视频轨道参数,可以读取和设置,在节目流ts文件非常有用,可以手动指定音视频轨道。
通信协议增加none选项,有些rtsp视频流不支持设置tcp/udp通信参数。
内核ffmpeg增加设置旋转角度功能,比如现场传过来的原视频是倒的,可以主动设置旋转角度旋转成正的,而且保存视频文件也可以一起应用这个设置。
修复大分辨率视频采用GPU绘制模式开启大量滤镜下可能崩溃的BUG。频繁更新滤镜,会和opengl绘制冲突,如果是painter绘制,不影响。如果采用硬解码,也没有这个问题。
重写云台仪表盘控件,在现有换肤下更精美,新增了边距和渐变边框等属性,修复了鼠标按下时候可能崩溃的BUG。
新增配置参数控制是否通道名字用摄像头的名字,默认通道01/通道02字样。
配置参数增加公司网址/公司电话,可以自定义,在弹出关于对话框中显示。
修复当设备树状列表不开启码流子节点的时候,左侧通道选中,设备列表选中节点不正确的BUG。
将标签信息停靠窗体改成按钮弹出来,不放在主界面悬停窗体组合中。
新增网络信息配置窗体,用于查询和修改设备的网络信息比如IP地址子网掩码等。
V20230705
增加265裸流文件的正常解析。
去掉串口模块的依赖,备用,有些msvc套件编译这个模块会报错。
增加两个开关,顶部标题右键菜单和悬停模块右键菜单,可以在系统设置中勾选开启。
增加了2/3分屏显示。可选择是否启用,默认关闭。
修复当单独使用解码线程类(没有视频显示窗体)的时候,无法正常关闭的BUG。因为之前不存在单独使用解码线程类。
内核ffmpeg保存视频增加指定分辨率和缩放比,这样可以大大减少文件体积,比如显示采用1920x1080分辨率,保存采用640x480,还可以指定等比例缩放比,比如0.5缩放比则是等比例减少一半,保持宽高等比例。
内核ffmpeg保存视频增加仅仅发送数据包标志位,这样可以在保存的时候进行多路推流和保存到其他文件。也就是打开一个视频地址可以保存到多个不同的文件或者推流到多路。
视频监控增加打开失败信号,参数对应错误枚举值,可以对应查看枚举值定义找出具体错误原因。
内核ffmpeg视频保存类在推流模式下增加自动重连机制,流媒体服务器中断恢复后自动重连继续推流。
内核ffmpeg视频保存类增加保存开始/保存结束/保存失败信号,方便推流的时候根据信号做出反应。
修复多屏幕在上下屏情况下右下角弹出框位置不正确的BUG,此问题N多知名软件也存在,可能上下屏的用户情况比较少。
增加了云台移动类型下拉框,默认隐藏,可以配置文件VisiblePtzStep打开,可选绝对移动/相对移动/连续移动,默认连续移动,所有厂家都会实现连续移动,大部分厂家未实现其他两种移动。
V20230611
增强解码的健壮性,比如在ffmpeg中未找到对应的解码器,取消对应视音频的处理,比如没找到G.722.1的音频解码器(AV_CODEC_ID_NONE),则不处理音频数据,直接保留处理视频数据即可。之前是直接打开失败不做任何处理。
内核ffmpeg增加了清空缓存接口,在切换播放进度前执行。测试发现有极少数文件切换进度后存在缓存数据导致画面发抖1-2s。
滤镜初始化增加锁,防止大量通道启用大量滤镜,界面切换和尺寸发生变化的时候导致的可能崩溃的BUG。
设备播放模块增加自动自增通道号功能,一般从NVR打开1路以后接下来就是打开第二路,递增即可。
修复带旋转角度的视频在绘制模式以及抓图下画面不正确的BUG。
onvif组件修复当rtsp端口不是554的时候的地址获取错误的BUG,统一调整即支持外网映射交互整个onvif组件,也支持内网包括修改过端口的。
将filehttp改成fileweb类型,因为rtsp视频流也有时长的时候,有些回放视频流是rtsp格式带了时长,可以任意切换播放位置。
增加删除和修改摄像机信息后,视频通道对应更新状态,比如删除了某个设备,该设备如果处于播放阶段则停止播放。
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视频流,而且生成的文件不标准没有文件属性分辨率信息等。
统一的打印格式,完整的信号通知,友好的接口设计。
14.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大类:black、dark、flat、light、normal、other。
xxxxxxxxxx
261void GlobalStyle::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
+ 14 版本说明
14.0 后期规划
摄像机信息表的用户信息字段用起来,视频流地址不带用户信息,主动加入用户信息构建最终地址应用。
用户密码密文存储,防止泄露。
电子放大改成大华的处理方式,不要在原视频滤镜方式处理,而是搞个单独的窗体在视频控件中显示,可以拖动。
14.1 精益求精
V20240420
本地回放文件,增加不区分大小写前缀,为了兼容旧的系统保存的文件。
调整部分处理函数到不同的类文件,更合理,管理更方便。
修复视频回放模块,如果视频文件没有音频,切换倍速的时候崩溃的bug。
将linux上的ffmpeg库,改成了静态链接264/265库,这样打包发布不需要带上libx264.so/libx265.so。
V20240410
重写天气预报模块,采集源换成中央气象台,永远不过时。同时新增自动定位当前城市功能,定位到当前城市后自动采集当前软件所在的城市的天气数据。
无边框拖动类新增限定只能鼠标左键拖动。之前左键右键和鼠标中间按键按下都可以拖动。
将nativeevent处理提炼到单独的窗体类,需要的窗体继承即可。方便其他项目复用代码。
天气预报功能激活改成立即应用。
修复部分城市天气预报不能采集的bug。
设备树状显示模块增加搜索功能,可以输入关键字对设备数搜索。支持回车触发、单击搜索按钮触发、单击清空按钮触发。父节点下所有子节点没有匹配关键字的则父节点也隐藏。
增加ffmpeg7的支持,今天ffmpeg7刚发布,据说性能有巨大提升。
修复密码文本框控件,输入内容超过右侧密码按钮的bug。增加了setTextMargins设置文本区域的边距。
内核ffmpeg增加了getimage函数用于从实时流中获取图片,一般用于人工智能运算用,之前已经有snap截图接口,但是会保存图片文件,频繁的抓图运算是不需要保存的,避免不必要的磁盘性能损失。
修复当填入的网络地址或者视频流地址前缀非小写的时候,媒体地址类型判断失败的bug。保存推流文件也增加这个过滤。比如地址填RTSP://xxx会判断成其他类型,正确的做法是前缀全部转为小写再判断。
悬浮条参数增加设备IP地址选项,如果地址中存在IP地址则取出IP地址,不存在则不显示。
改进滤镜处理,将 av_buffersrc_add_frame 换成 av_buffersrc_add_frame_flags 函数并指定参数 AV_BUFFERSRC_FLAG_KEEP_REF,默认参数是0表示不会保持引用,这样下面再去用解码后的原始数据帧转图片可能是黑屏。
彻底修复在开启大量滤镜后,尤其是人工智能运算后,需要频繁更新一堆rect区域绘制,在同时开启多路分辨率很大的通道时候,可能崩溃的bug。核心原因是事件处理来不及,openglwidget窗体绘制那边,引用了解码后的yuv数据,而这边刚好又释放了导致bug。之前用的是延迟2帧绘制策略,这样看起来很明显在重新应用滤镜后会缺失2帧画面,越是频繁越感觉卡。终极方案是搞个缓存帧队列,当到了缓存队列末尾的时候,再开始释放滤镜帧,非常完美,再频繁再多通道都毫无压力。有个缺点就是增加了一部分内存占用,这个影响不大,会在解码线程结束后立即释放。
V20240330
修复ffmpeg内核不支持采集虚拟声卡的bug,现在支持虚拟声卡,直接内录电脑声卡声音数据,和桌面同步采集录制保存或者推流。
纠正地址中带视频编码缩放参数可能为空值的情况。
修复录像计划中添加的通道数超过最大通道,开启录像存储崩溃的bug。
增加screen-capture-recorder录屏时支持帧率设置。
修复保存文件命名中如果文件名中有mp4字样会被替换成拓展名的bug。
视频回放增加avi/mov/mkv类型的文件。比如vlc内核在保存pcm音频格式的视频流,文件格式会自动改成avi,mpv内核在保存pcm音频格式的视频流,文件格式要求用mov保存才行,否则保存的文件不能播放。
V20240315
修复样式表不支持utf8以及带BOM格式的文件,换成采用QTextStream文本流来读取。之前如果用户在qtcreator中打开样式表修改后保存成了非ANSII格式,导致file.readAll()读取后执行出错,样式表失效。
本地摄像头保存MP4文件增加音频存储,之前由于本地设备音视频存储不同步的问题一直默认去除了音频存储,只有视频存储。近期才发现原来是由于写入的时候调用的av_interleaved_write_frame,默认会缓存,导致可能音频越来越慢。改成av_write_frame即可。
增加保存裸流文件名判断机制,如果设置的强转264,则裸流文件名是h264,如果设置了强转265,则裸流文件名是h265,其他则按照源头是什么格式就对应什么格式。
修复Qt6.4.3/Qt6.5.3等版本中openglwidget和webengine共存出现地图黑屏的bug。
搜索设备后自动选择末尾行,在单播的时候特别有用,省去用户还要去手动选择搜索结果进行一键获取。
新增国网绿配色方案。
新增宇视NVR自动识别格式批量添加。
批量添加NVR到对应通道,通道编号改成按照传过来的真实通道号,之前是索引号,不够准确。
V20240305
去掉了EncodeType编码策略枚举和对应参数,合并到视频编码枚举参数,EncodeVideo增加EncodeVideo_None枚举。
增加判断文件是否有B帧静态函数。如果是有B帧,则推流的时候建议转码,否则推流后拉流出来的视频很可能是抽搐的。
调整编码策略,现在支持rtsp+pcma/pcmu数据保存到mp4文件,音频不用转码。
视频控件悬浮条录制中字样做了修改,区分是保存到文件还是推流,对应字样 录制中/推流中。
重新调整音视频同步策略。
默认同步;
rtsp视频流默认不同步,以最快速度解码;
本地设备(本地摄像头和桌面)采集不同步;
设置了最快速度解码则不同步;
设置了质量优先解码则同步;
纯音频永远同步;
这些策略按照优先级从低到高;
比如是视频文件,但是又设置了最快速度解码,则不同步;
比如是rtsp视频流或者本地设备采集,又设置了质量优先解码,则同步;
比如是本地音频文件,设置了最快解码,因为是纯音频,则同步;
视频文件最快速度解码不同步,是为了测试本机的解码性能,一直不停的读取和解码显示。
V20240205
将编码参数合并成编码信息结构体,放到了基类中。
修复内核ffmpeg强制转码保存分辨率不支持奇数的bug。增加了自动调整到偶数的策略。
将ffmpegsave类拆分出来ffmpegsavehelper类,专门存放保存相关的静态函数。
将ffmpegthread类拆分出来ffmpegthreadhelper类,专门存放解码相关的静态函数。
将ffmpeg所有函数接口支持到ffmpeg6,将废弃函数全部换成了新的,自动识别是何种ffmpeg版本自动调用对应的函数接口。对应各种版本不同的函数接口调用都放在ffmpeghelper类中。
保存264/265裸流增加sps/pps信息,保证所有解码出来的流保存成裸流文件都能正确解析。
保存视频文件信号中的文件名参数改成了真实的文件名(之前是传入的文件名/不够准确/因为可能会自动调整到真实的拓展名),比如纯音频文件是wav拓展名,裸流文件是h264/h265拓展名。
保存文件策略中将纯音频的保存统一编码保存到wav文件,保证所有音频格式解码后都能正确保存到wav文件。
保存文件增加了超时回调,防止在推流的时候碰到流媒体服务器不通或者有问题,导致卡主很久。
V20240125
修复无声卡电脑关闭视频的时候崩溃的bug。
修复主界面在注释掉部分停靠窗体后,加载界面可能导致界面索引溢出的bug。
修复倍速播放的时候声音可能产生呲呲声音的bug,采用同步修改采样率,比如采样率44100,倍速2,则音频播放设备采样率=44100乘以2。
内核ffmpeg增加倍速保存,比如60s的文件可以加速编码保存成30s的文件。如果保存的文件存在音频则最大2倍速,仅有视频则倍速可以到8倍。该机制同样适用于推流。
改进音视频同步线程是否启动机制,只有存在视频则启动视频同步,存在音频才启动音频同步。并且都要求开启了音视频同步标志位的情况下启动。
改进音频振幅控件,自动计算宽高绘制振幅,垂直则绘制垂直状的振幅。
第三方录屏screen-capture-recorder,由于不支持设置桌面索引和分辨率,改成从源头修改分辨率和帧率等参数。
修复重连阶段,开启了悬浮音柱的情况下,音柱没有隐藏的bug。
修改绘制背景策略,只要是启动了线程就清空背景,停止了线程就绘制背景。这样可以直观的察觉当前是否已经启动了线程。
音频组件中的音频振幅控件增加渐变颜色。
音频播放组件增加变速不变调处理,采用的sonic库做运算。可以变速不变调,也可以不变速变调,还可以不改变声卡音量的情况下,通过声音数据运算,强制提高音量。
增加通道默认颜色为黑色。之前是透明色。
新增了全景通道布局,放在y布局大类中,就是上下4个通道,中间一个长方形的大通道。
V20240118
轮询期间新增禁止录像策略。停止轮询后恢复设置的状态。
修复轮询视频期间,没有应用声音大小和静音状态的机制。
修复声音大小设置时机可能不准确的bug。
新增打印信息开关,可以控制视频解码线程、保存线程、onvif线程中的打印信息是否开启。
修复在设置了setCodecForLocale编码下,采集指定中文标题的时候可能失败的bug。
增加自适应解码器采集各种本地摄像头设备,优先尝试用mjpeg解码本地摄像头设备,失败后则不指定解码器再重新打开一次。保证任何时候都能正常打开。
新增了devicehelper类,专门用于获取本地视音频输入设备名称集合。
将core_videobase组件拆分成core_videobase/core_videohelper两个组件,将辅助相关的类放到了core_videohelper组件中,分类更精准,更易学习。
批量添加模块增加自动获取本地视音频设备名称,可以指定视音频设备地址添加。
本地设备地址增加解码器名称列,可以直接通过url地址指定是mjpeg/h264/默认值几种解码器来打开设备。
V20240112
去掉1通道0_1标识,改成x布局中增加1_1x1这种万能方式,同时调整主界面底部1通道按钮选中逻辑。
带音柱通道,悬浮音柱模式下,增加判断如果当前视频没有音频,则不显示音柱。
新增音柱背景颜色透明度配置参数,默认全透明=0,0-255范围值。
修复在设备树节点选中的情况下,从本地文件夹拖曳文件播放后,可能出现选中节点也拖曳的的情况。
考虑到视频相关的参数配置越来越多,将视频参数配置单独起一个界面。
新增音柱背景透明度和悬浮条背景透明度值在视频参数配置中,调整后立即应用。
修复在没有开启视频存储的时候,当手动录像期间,到了整半小时(处于0分钟或者30分钟的时候)的时候会被终止录像的bug。
新增mac上获取cpu序列号,用于秘钥文件。
修复开启共享解码线程模式下,地图上点开的视频,会停止采集的bug。这是近期新增的电子放大功能引入的bug,目前策略是除了主界面视频通道窗体外,其他弹出的视频窗体全部不采用共享解码,实际上也只有主界面才需要共享解码线程。
修复频繁大量打开关闭通道可能造成内存泄漏的bug,该bug是Qt本身的bug,qaudiooutput在线程中执行释放不干净,需要进行特殊处理。
声音播放线程增加过滤,没有声音索引的媒体文件,不会启动该线程,之前是默认启动。
V20240105
音频振幅和实时码率改成了立即应用,可以通过基类的视频控件以及视频采集线程设置。这样只在需要统计实时码率的时候才会去真正统计,大大节约CPU运算。
重新调整videobox视频布局盒子类,将changeVideo信号改成changeLayout,更贴切。其他很多函数名和变量也做了对应更改,包括配置参数的videoType改成了layoutType,之前的命名很容易误解成视频类型,其实是为了表示画面布局类型,比如当前1_6通道显示。
将videoUrl改成mediaUrl,VideoType改成MediaType,使得描述更准确,媒体地址可以是视频地址也可以是音频地址等。
将纯音频标志位onlyAudio判断改成了解析中判断,最终解析后只有音频没有视频才认定是纯音频,有些网络视频流也是纯音频,比如m3u8格式的hls流。要最终解析完成后才能判断。
统一约定只有本地mp3文件才需要解析封面并绘制封面。
悬浮条信息增加视频模式,由于不同解析内核会自动调整视频显示的模式,比如设置的绘制,由于该内核不支持绘制,调整成句柄,方便查看最终何种视频展示模式。
统一了本地设备采集包括本地摄像头和桌面采集的url规则,各种视频解析内核通用,调整了对应相关的函数接口逻辑。
修复桌面录屏在ffmpeg5以下版本不支持指定窗口中文标题的BUG,需要转换成toLocal8Bit。
统一设备采集标识Device_Audio/Device_Video/Device_Screen三种。
媒体类型MediaType_Desktop改成MediaType_Screen,描述更准确。同时将桌面采集对应地址前缀desktop=改成screen=。
配置参数增加悬浮条背景透明度,可以通过设置对应的值控制悬浮条的透明度。
V20240101
本地设备采集增加本地音频输入设备采集,现在可以指定 video=USB Video Device:audio=麦克风 (USB Audio Device) 这种格式采集摄像头和音频一起。
增加采集音频参数设置。
增加对 screen-capture-recorder 设备的采集,一个第三方高效录屏库。
使用 screen-capture-recorder 桌面采集的同时可以录制音频。
新增各种保存路径配置参数,可以在其他设置中配置录像文件路径、报警视频路径、抓拍图片路径、报警图片路径。支持中文路径等。
通道报警后,对应抓图或者存储报警视频,按照设置的路径存储,同时存储警情记录到数据库,记录带报警图片或者报警视频的路径,在日志记录查询中可以双击查阅。如果当前触发的报警存储了报警视频则优先取报警视频路径。
本地摄像头采集增加强制设置成mjpeg格式,由于一些小分辨率下默认是rawvideo格式,不支持滤镜,所以换成mjpeg格式都支持滤镜。
悬浮条显示的文本信息,新增了结构体参数,可以设置哪些信息需要显示,比如分辨率、帧率、封装格式、视频解码格式、音频解码格式、实时码率、硬解名称等。默认只开启分辨率显示。
新增配置参数用于配置悬浮条可以显示哪些信息。
功能激活复选框改成放到列表中,方便后期拓展更多可控的激活功能,包括悬浮条哪些参数可以显示。
音柱位置新增上下左右排列等多种布局,可以在系统设置中选择。
删除两个配置参数,音频振幅AudioLevel(用音柱位置参数VolumePosition替换/0表示不启用/>0表示启用),统计实时码率CountKps(用悬浮条参数RealBitRate替换,一旦开启了显示悬浮条码率参数,则必须开启)。
新增音柱尺寸策略,可以选自动设置,也可以设置固定的值,以便适应各种用户需求。
增加纯麦克风采集音频支持,可以指定音频输入设备比如麦克风采集。
音柱位置间隙根据悬浮条位置自动留出间隙,以便悬浮条有足够空间。
系统设置中的视频参数变化,悬浮条位置切换、音柱尺寸等参数变化,改变后立即应用。
音柱尺寸增加用户自定义值,用户可以通过直接修改配置文件指定一个特殊的值。由于下拉框中的值都是一些常规值,用户如果找不到对应的值可以通过修改配置文件更改,对应指定的值也会自动添加到下拉框。
系统设置中各种悬浮条信息配置改成勾选后立即应用。
V20231205
增加通用地址格式规范,url|transport|encodeType|encodeVideo|encodeVideoRatio|encodeVideoScale,可以直接在播放地址中指定通信协议、是否编码保存、编码帧率等信息,具体可以参见说明书中的地址格式说明。
对大华的NVR增加自适应计算配置文件个数,有些是2个有些是3个,需要自适应,计算后按照对应的规则添加NVR的通道。
鼠标拾取限定鼠标左键操作。
悬浮条增加判断,如果处于电子放大期间则鼠标移开不自动隐藏,方便标记当前哪些通道处于电子放大期间。
鼠标画矩形增加坐标换算,鼠标可能是从左上角到右下角,也可能是从右侧到左侧,而QRect只支持左上角右下角参数,需要自动换算,用户有可能是从右下角到左上角,这些特殊情况也要支持。
新增切换声卡接口,已经实现了qmedia、vlc、mpv、ffmpeg等内核对应切换声卡接口。有些用户希望每个通道可以指定到不同的声卡来播放声音。
通道布局类重新调整接口,将2通道和3通道布局移动到x布局中,同时增加自定义x布局接口函数,比如可以手动指定3x6布局这种,非常灵活,方便垂直屏幕展示。
新增自定义y布局,之前自定义x布局专门是固定行列数的布局,可以自行添加,将一些特殊定制的布局放在自定义y布局中,同时调整诸多函数接口。
V20231125
视频监控布局类videobox新增了指定行数列数接口,新增了指定行列数的默认布局,比如1_2x4表示通道1开始按照2行4列排列,方便垂直屏幕展示比如手机上或者竖屏。
优化本地摄像头和桌面采集的暂停策略,和文件一样,暂停期间不需要去实时采集。而视频流这种暂停期间必须实时采集不解码。
修复http地址中带空格的地址无法正常播放的BUG,需要用QUrl().toEncoded转码。
鼠标按下发送对应源图像坐标信号增加事件类型参数,鼠标按下、鼠标松开、鼠标移动三种都能够发出信号,以便外部用于动态绘制矩形区域,相当于拿到对应的矩形区域在下发处理。
内核增加电子放大功能,鼠标按下拾取区域,作为crop滤镜,实现电子放大。移除该滤镜可以恢复。
屏幕采集增加自定义区域采集规则,约定屏幕索引255则取用户填入的自定义区域进行采集。
组件onvif增加错误数据返回信号,可以查看具体错误数据信息,方便分析问题,比如是否是用户信息不对导致的。
悬浮条增加电子放大按钮,直接开启电子放大和结束电子放大,电子放大期间,在视频画面上选择区域后自动对该区域放大。
V20231105
内核ffmpeg中保存类型SaveVideoType_H264改成了SaveVideoType_Stream,表示裸流类型,可以是264/265。
保存裸流情况下增加区分264/265拓展名。
内核ffmpeg/qtav/easyplayer/海康sdk等增加逐帧播放功能。
内核ffmpeg增加缓存大小的参数传入,对应buffer_size参数,可以通过参数配置。有些极大帧率或者分辨率的设备需要这个参数设置才能正常运行,否则很可能缓存不够导致花屏。
修正onvif组件在设备没有回传时区TimeZone节点信息的时候无法正确设置时间的BUG,改成默认用东八区去计算。
V20231010
修复部分视频文件在循环播放的时候失效的BUG,经查阅这种文件一般前面会缺失一些数据帧,导致播放定位失败,改成通过videofirstpts时间判断。
修复在win10及以上系统中CPU使用率采集和任务管理器不一致的BUG,改成了命令行typeperf获取。
修复了ffmpeg内核opengl绘制yuv数据在部分很老的硬件上绿屏的BUG,将 GL_RED 全部换成了 GL_LUMINANCE 以便支持旧版本的opengl。比如部分配置低的手机。
修复linux系统上采集本地摄像头无法设置分辨率的BUG。
本地文件回放增加拖曳播放,方便用于测试从NVR下载的视频文件。
内核ffmpeg增加自动获取本地音视频设备文件名的接口。
V20230915
彻底解决应用滤镜后可能出现崩溃的BUG,比如在频繁大量切换新的滤镜过程中,刚好界面这边在绘制画面数据,导致数据冲突引发的BUG,之前绘制模式和硬解码模式不崩溃是因为,绘制模式用的是painter绘制图片,没有用opengl绘制,硬解码是因为取出来的帧数据就是中转过的,不会出现数据冲突的情况。所以在没有硬解码情况下的opengl绘制模式,增加了一个avframe用于中转数据,同时在新切换滤镜后的延迟1-2帧(时间大概0.03s)应用新的滤镜,这样就再也不会出现opengl绘制数据冲突崩溃情况。也考虑过传递给opengl绘制的数据拷贝一份,肯定可以终极解决问题,但是每次帧数据都拷贝一份那就增加了不少CPU,不可取。
将录播监控类型去掉,配置参数新增了AudioLevel用于开启音频振幅,开启后,主界面每个通道右侧会显示对应的音频振幅,分左右通道。
桌面采集改成永远不共享解码策略。
新增摄像机和录像机默认名称配置参数。
双击NVR父节点打开该节点下面的所有摄像机,增加延时,防止不延时情况下在部分电脑上可能崩溃的BUG。
V20230906
修复本地桌面地址默认分辨率问题,当没有指定分辨率的时候取当前鼠标所在的屏幕区域作为分辨率。支持多屏幕,包括虚拟机中分辨率奇数问题,自动取偶数。
重新调整桌面录屏的XY坐标策略,设置值永远是正数值,根据当前屏幕所在位置进行偏移(左上角X=0 Y=0),多屏幕情况下坐标可能是负数,而且屏幕可以是横向还可能是竖向,自动程序计算,这样用户只需要填入从当前屏幕左上角开始偏移多少就行,而不需要去计算具体的值。同时纠正超过屏幕区域的采集分辨率,以设定的偏移值开始到右下角结束进行裁剪。
桌面采集增加手动支持屏幕索引参数,在XY坐标偏移值后面,不指定则以鼠标所在当前屏幕为准,指定则以指定的索引为准,屏幕索引大于屏幕数量则以鼠标所在当前屏幕为准。这样相当于可以对每个屏幕分开采集,每个屏幕都是在一个独立的通道显示。
测试发现在linux系统上如果使用ffmpeg静态库,会报错提示avfilter不成功,需要调整库链接顺序才行,之前是 -lavformat -lavcodec -lavfilter -lswscale -lavutil -lswresample,统一改成 -lavformat -lavfilter -lavcodec -lswresample -lswscale -lavutil ,通过查阅ffmpeg的示例代码的链接顺序得知。
测试发现在ubuntu18/20/22等系统上编译程序设置rpath失败,导致编译后的程序只能编译运行,不能双击运行。查阅资料原来是新版的系统修改了对应的rpath设置机制,https://blog.csdn.net/random_repick/article/details/122980119 ,需要在编译参数加上 -disable-new-dtags 参数即可。之前是 QMAKE_LFLAGS += "-Wl,-rpath,'$$ORIGIN/lib'" ,改成 QMAKE_LFLAGS += "-Wl,-rpath,'$$ORIGIN/lib',-disable-new-dtags" 。
滤镜osd增加了背景颜色参数,支持透明度。
修正linux系统桌面采集对应偏移值没起作用的BUG,需要通过设备名传入,比如 :0.0+0,0 后面的 0,0 才是表示偏移值。
V20230818
所有密码框全部提升为自定义文本框控件,全局样式加入密码按钮,单击显示密码,再次单击密文显示。登录窗体、登出窗体、数据库管理等界面。
数据库组件增加access数据库的支持。
通过远程设备回放rtsp视频流,增加进度条显示,可以切换进度条,一般海康大华等厂家的NVR支持rtsp视频流回放,而且带了时长,可以切换回放的进度,但是不能倍速。
将带柱状声音条的视频面板重命名为 frmvideowidgetvolume,带播放进度条和时长的视频面板命名为 frmvideowidgetslider,视频预览窗体重命名为 frmvideowidgetpreview,因为这三者属于独立的视频控件窗体,在多处独立使用。
远程回放rtsp视频流增加同步播放进度,勾选后,切换某个通道进度,其他几个通道自动切换到对应播放进度,这样可以查看回放通道同一时刻的监控画面。
更新地图秘钥,之前的秘钥文件由于使用者太多,会出现未授权地图字样。
修复onvif报警事件触发的报警录像存储文件前缀标识不正确的BUG,当通道显示的主码流而系统设置默认打开子码流的情况下会发生。
日志记录中备注字段用于存储报警图片文件或者报警视频文件的文件名称,报警视频优先级大于报警图片。双击预览报警图片或者报警视频。
修复报警日志中弹出预览失败的情况,当文件被删除后要先判断文件是否存在。
回放界面增加了播放按钮,可以暂停和继续播放当前回放的视频。
将报警视频预览单独一个函数,带播放进度条,回放报警时候的时候,可以暂停和继续播放。
日志记录增加按照通道查询。报警日志存入的时候都统一换成两位字符串作为通道存入,比如 01/02/03/16,统一长度对齐。
修复实时视频流查看的时候,没有时长的BUG,不要去获取时长,是个很大的负数。只有回放的视频流才有时长。
V20230802
轮询管理中添加轮询通道的时候,对应分组以右侧选中的分组为准,选中的哪个分组则对应添加的时候就添加到对应轮询分组中。
轮询管理中左侧表格增加右键菜单(全部选中、反向选中、全部不选),执行对应的操作。
增加自定义密码文本框,可设置双击显示明文/失去焦点自动恢复,以及右侧显示密码按钮,单击切换明文密文显示。
修复ffmpeg内核录像阶段硬解码模式下各种滤镜信息没有保存到文件的BUG。
修复ffmpeg内核录像阶段硬解码模式下保存的视频文件,播放期间渐渐变模糊的BUG。
core_qui组件更名为core_qthelper,里面的类名也全部重新更换,比如quihelper改成了qthelper,表达更精确。
内核ffmpeg增加视频流地址末尾加通信协议(tcp/udp),有些视频流必须用tcp或udp协议才能加载成功,可以手动指定,已经有全局的视频配置参数,地址中带的协议优先级最高,没有带则采用全局配置的。
彻底解决时区时间不对导致部分摄像头设备不能onvif交互的问题,如果本地时区设置的和设备设置的时区不一致,需要转换后再统一用标准时间去下发onvif指令,之前写死的东八区8小时,应该根据系统环境去获取,而且还要区分夏令时(时区-1),还要区分半小时制的时区(5.30时区),一套组合拳打下来,彻底解决问题。嵌入式板子很多不是东八区或者linux系统也可能是其他时区。这个细节市面上99%的onvif协议监控软件都没有考虑(一运行就崩溃或者无法正常加载onvif设备),必须要求运行软件的环境和设备所在环境的时区时间一致。
V20230718
各种内核都增加音视频轨道参数,可以读取和设置,在节目流ts文件非常有用,可以手动指定音视频轨道。
通信协议增加none选项,有些rtsp视频流不支持设置tcp/udp通信参数。
内核ffmpeg增加设置旋转角度功能,比如现场传过来的原视频是倒的,可以主动设置旋转角度旋转成正的,而且保存视频文件也可以一起应用这个设置。
修复大分辨率视频采用GPU绘制模式开启大量滤镜下可能崩溃的BUG。频繁更新滤镜,会和opengl绘制冲突,如果是painter绘制,不影响。如果采用硬解码,也没有这个问题。
重写云台仪表盘控件,在现有换肤下更精美,新增了边距和渐变边框等属性,修复了鼠标按下时候可能崩溃的BUG。
新增配置参数控制是否通道名字用摄像头的名字,默认通道01/通道02字样。
配置参数增加公司网址/公司电话,可以自定义,在弹出关于对话框中显示。
修复当设备树状列表不开启码流子节点的时候,左侧通道选中,设备列表选中节点不正确的BUG。
将标签信息停靠窗体改成按钮弹出来,不放在主界面悬停窗体组合中。
新增网络信息配置窗体,用于查询和修改设备的网络信息比如IP地址子网掩码等。
V20230705
增加265裸流文件的正常解析。
去掉串口模块的依赖,备用,有些msvc套件编译这个模块会报错。
增加两个开关,顶部标题右键菜单和悬停模块右键菜单,可以在系统设置中勾选开启。
增加了2/3分屏显示。可选择是否启用,默认关闭。
修复当单独使用解码线程类(没有视频显示窗体)的时候,无法正常关闭的BUG。因为之前不存在单独使用解码线程类。
内核ffmpeg保存视频增加指定分辨率和缩放比,这样可以大大减少文件体积,比如显示采用1920x1080分辨率,保存采用640x480,还可以指定等比例缩放比,比如0.5缩放比则是等比例减少一半,保持宽高等比例。
内核ffmpeg保存视频增加仅仅发送数据包标志位,这样可以在保存的时候进行多路推流和保存到其他文件。也就是打开一个视频地址可以保存到多个不同的文件或者推流到多路。
视频监控增加打开失败信号,参数对应错误枚举值,可以对应查看枚举值定义找出具体错误原因。
内核ffmpeg视频保存类在推流模式下增加自动重连机制,流媒体服务器中断恢复后自动重连继续推流。
内核ffmpeg视频保存类增加保存开始/保存结束/保存失败信号,方便推流的时候根据信号做出反应。
修复多屏幕在上下屏情况下右下角弹出框位置不正确的BUG,此问题N多知名软件也存在,可能上下屏的用户情况比较少。
增加了云台移动类型下拉框,默认隐藏,可以配置文件VisiblePtzStep打开,可选绝对移动/相对移动/连续移动,默认连续移动,所有厂家都会实现连续移动,大部分厂家未实现其他两种移动。
V20230611
增强解码的健壮性,比如在ffmpeg中未找到对应的解码器,取消对应视音频的处理,比如没找到G.722.1的音频解码器(AV_CODEC_ID_NONE),则不处理音频数据,直接保留处理视频数据即可。之前是直接打开失败不做任何处理。
内核ffmpeg增加了清空缓存接口,在切换播放进度前执行。测试发现有极少数文件切换进度后存在缓存数据导致画面发抖1-2s。
滤镜初始化增加锁,防止大量通道启用大量滤镜,界面切换和尺寸发生变化的时候导致的可能崩溃的BUG。
设备播放模块增加自动自增通道号功能,一般从NVR打开1路以后接下来就是打开第二路,递增即可。
修复带旋转角度的视频在绘制模式以及抓图下画面不正确的BUG。
onvif组件修复当rtsp端口不是554的时候的地址获取错误的BUG,统一调整即支持外网映射交互整个onvif组件,也支持内网包括修改过端口的。
将filehttp改成fileweb类型,因为rtsp视频流也有时长的时候,有些回放视频流是rtsp格式带了时长,可以任意切换播放位置。
增加删除和修改摄像机信息后,视频通道对应更新状态,比如删除了某个设备,该设备如果处于播放阶段则停止播放。
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视频流,而且生成的文件不标准没有文件属性分辨率信息等。
统一的打印格式,完整的信号通知,友好的接口设计。
14.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大类:black、dark、flat、light、normal、other。
x1void GlobalStyle::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内核下本地摄像头格式自动纠正,如果采用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的远程回放地址,其他地址计算算法调整。
新增界面模块功能启用配置参数。
新增主界面顶部导航模块中间界面,用于不同的运行模式加载不同的模块。
14.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
增加云台控制功能,可以上下左右等八个方位控制云台,默认采用相对移动,云台中间按下表示复位。
系统设置增加码流类型选择,默认子码流,切换完自动应用。
云台控制增加速度功能,值越大,速度越快。
增加焦距控制,可放大缩小,速度也可控制。