From 2062fbc749e7c41d6b7dc3fbc3a70590dff722e8 Mon Sep 17 00:00:00 2001 From: feiyangqingyun Date: Wed, 16 Aug 2023 15:41:00 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- control/navbutton/iconhelper.cpp | 10 ++ control/navbutton/iconhelper.h | 6 + docs/video_system/index.html | 105 ++---------------- docs/video_system/snap/2-17-1.jpg | Bin 0 -> 125804 bytes .../qcustomplotdemo/frmcustom/iconhelper.cpp | 10 ++ third/qcustomplotdemo/frmcustom/iconhelper.h | 6 + ui/core_base/iconhelper.cpp | 10 ++ ui/core_base/iconhelper.h | 6 + ui/iconhelper/iconhelper.cpp | 10 ++ ui/iconhelper/iconhelper.h | 6 + ui/ui.zip | Bin 0 -> 466738 bytes video/videobox/videobox.cpp | 4 +- video/videopanel/videobox.cpp | 4 +- 13 files changed, 80 insertions(+), 97 deletions(-) create mode 100644 docs/video_system/snap/2-17-1.jpg create mode 100644 ui/ui.zip diff --git a/control/navbutton/iconhelper.cpp b/control/navbutton/iconhelper.cpp index 88795dc..1e703e6 100644 --- a/control/navbutton/iconhelper.cpp +++ b/control/navbutton/iconhelper.cpp @@ -272,6 +272,8 @@ void IconHelper::setStyle1(QWidget *widget, QList btns, QList } QString position = styleColor.position; + quint32 btnWidth = styleColor.btnWidth; + quint32 btnHeight = styleColor.btnHeight; quint32 iconSize = styleColor.iconSize; quint32 iconWidth = styleColor.iconWidth; quint32 iconHeight = styleColor.iconHeight; @@ -324,6 +326,14 @@ void IconHelper::setStyle1(QWidget *widget, QList btns, QList qss << QString("QWidget>QAbstractButton:checked{background-color:%1;color:%2;}") .arg(styleColor.checkedBgColor).arg(styleColor.checkedTextColor); + //按钮宽度高度 + if (btnWidth > 0) { + qss << QString("QWidget>QAbstractButton{min-width:%1px;}").arg(btnWidth); + } + if (btnHeight > 0) { + qss << QString("QWidget>QAbstractButton{min-height:%1px;}").arg(btnHeight); + } + //设置样式表 widget->setStyleSheet(qss.join("")); diff --git a/control/navbutton/iconhelper.h b/control/navbutton/iconhelper.h index 4a3b5d9..adcf69e 100644 --- a/control/navbutton/iconhelper.h +++ b/control/navbutton/iconhelper.h @@ -49,6 +49,9 @@ public: QString position; //位置 left right top bottom bool defaultBorder; //默认有边框 + quint32 btnWidth; //按钮宽度 + quint32 btnHeight; //按钮高度 + quint32 iconSize; //图标字体尺寸 quint32 iconWidth; //图标图片宽度 quint32 iconHeight; //图标图片高度 @@ -69,6 +72,9 @@ public: position = "left"; defaultBorder = false; + btnWidth = 0; + btnHeight = 0; + iconSize = 12; iconWidth = 15; iconHeight = 15; diff --git a/docs/video_system/index.html b/docs/video_system/index.html index 58c4d68..57feecc 100644 --- a/docs/video_system/index.html +++ b/docs/video_system/index.html @@ -205,87 +205,6 @@ mark .md-meta { color: rgb(0, 0, 0); } mjx-container { break-inside: avoid; } -.CodeMirror { height: auto; } -.CodeMirror.cm-s-inner { background: inherit; } -.CodeMirror-scroll { overflow: auto hidden; z-index: 3; } -.CodeMirror-gutter-filler, .CodeMirror-scrollbar-filler { background-color: rgb(255, 255, 255); } -.CodeMirror-gutters { border-right: 1px solid rgb(221, 221, 221); background: inherit; white-space: nowrap; } -.CodeMirror-linenumber { padding: 0px 3px 0px 5px; text-align: right; color: rgb(153, 153, 153); } -.cm-s-inner .cm-keyword { color: rgb(119, 0, 136); } -.cm-s-inner .cm-atom, .cm-s-inner.cm-atom { color: rgb(34, 17, 153); } -.cm-s-inner .cm-number { color: rgb(17, 102, 68); } -.cm-s-inner .cm-def { color: rgb(0, 0, 255); } -.cm-s-inner .cm-variable { color: rgb(0, 0, 0); } -.cm-s-inner .cm-variable-2 { color: rgb(0, 85, 170); } -.cm-s-inner .cm-variable-3 { color: rgb(0, 136, 85); } -.cm-s-inner .cm-string { color: rgb(170, 17, 17); } -.cm-s-inner .cm-property { color: rgb(0, 0, 0); } -.cm-s-inner .cm-operator { color: rgb(152, 26, 26); } -.cm-s-inner .cm-comment, .cm-s-inner.cm-comment { color: rgb(170, 85, 0); } -.cm-s-inner .cm-string-2 { color: rgb(255, 85, 0); } -.cm-s-inner .cm-meta { color: rgb(85, 85, 85); } -.cm-s-inner .cm-qualifier { color: rgb(85, 85, 85); } -.cm-s-inner .cm-builtin { color: rgb(51, 0, 170); } -.cm-s-inner .cm-bracket { color: rgb(153, 153, 119); } -.cm-s-inner .cm-tag { color: rgb(17, 119, 0); } -.cm-s-inner .cm-attribute { color: rgb(0, 0, 204); } -.cm-s-inner .cm-header, .cm-s-inner.cm-header { color: rgb(0, 0, 255); } -.cm-s-inner .cm-quote, .cm-s-inner.cm-quote { color: rgb(0, 153, 0); } -.cm-s-inner .cm-hr, .cm-s-inner.cm-hr { color: rgb(153, 153, 153); } -.cm-s-inner .cm-link, .cm-s-inner.cm-link { color: rgb(0, 0, 204); } -.cm-negative { color: rgb(221, 68, 68); } -.cm-positive { color: rgb(34, 153, 34); } -.cm-header, .cm-strong { font-weight: 700; } -.cm-del { text-decoration: line-through; } -.cm-em { font-style: italic; } -.cm-link { text-decoration: underline; } -.cm-error { color: red; } -.cm-invalidchar { color: red; } -.cm-constant { color: rgb(38, 139, 210); } -.cm-defined { color: rgb(181, 137, 0); } -div.CodeMirror span.CodeMirror-matchingbracket { color: rgb(0, 255, 0); } -div.CodeMirror span.CodeMirror-nonmatchingbracket { color: rgb(255, 34, 34); } -.cm-s-inner .CodeMirror-activeline-background { background: inherit; } -.CodeMirror { position: relative; overflow: hidden; } -.CodeMirror-scroll { height: 100%; outline: 0px; position: relative; box-sizing: content-box; background: inherit; } -.CodeMirror-sizer { position: relative; } -.CodeMirror-gutter-filler, .CodeMirror-hscrollbar, .CodeMirror-scrollbar-filler, .CodeMirror-vscrollbar { position: absolute; z-index: 6; display: none; outline: 0px; } -.CodeMirror-vscrollbar { right: 0px; top: 0px; overflow: hidden; } -.CodeMirror-hscrollbar { bottom: 0px; left: 0px; overflow: auto hidden; } -.CodeMirror-scrollbar-filler { right: 0px; bottom: 0px; } -.CodeMirror-gutter-filler { left: 0px; bottom: 0px; } -.CodeMirror-gutters { position: absolute; left: 0px; top: 0px; padding-bottom: 10px; z-index: 3; overflow-y: hidden; } -.CodeMirror-gutter { white-space: normal; height: 100%; box-sizing: content-box; padding-bottom: 30px; margin-bottom: -32px; display: inline-block; } -.CodeMirror-gutter-wrapper { position: absolute; z-index: 4; background: 0px 0px !important; border: none !important; } -.CodeMirror-gutter-background { position: absolute; top: 0px; bottom: 0px; z-index: 4; } -.CodeMirror-gutter-elt { position: absolute; cursor: default; z-index: 4; } -.CodeMirror-lines { cursor: text; } -.CodeMirror pre { border-radius: 0px; border-width: 0px; background: 0px 0px; font-family: inherit; font-size: inherit; margin: 0px; white-space: pre; overflow-wrap: normal; color: inherit; z-index: 2; position: relative; overflow: visible; } -.CodeMirror-wrap pre { overflow-wrap: break-word; white-space: pre-wrap; word-break: normal; } -.CodeMirror-code pre { border-right: 30px solid transparent; width: fit-content; } -.CodeMirror-wrap .CodeMirror-code pre { border-right: none; width: auto; } -.CodeMirror-linebackground { position: absolute; inset: 0px; z-index: 0; } -.CodeMirror-linewidget { position: relative; z-index: 2; overflow: auto; } -.CodeMirror-wrap .CodeMirror-scroll { overflow-x: hidden; } -.CodeMirror-measure { position: absolute; width: 100%; height: 0px; overflow: hidden; visibility: hidden; } -.CodeMirror-measure pre { position: static; } -.CodeMirror div.CodeMirror-cursor { position: absolute; visibility: hidden; border-right: none; width: 0px; } -.CodeMirror div.CodeMirror-cursor { visibility: hidden; } -.CodeMirror-focused div.CodeMirror-cursor { visibility: inherit; } -.cm-searching { background: rgba(255, 255, 0, 0.4); } -span.cm-underlined { text-decoration: underline; } -span.cm-strikethrough { text-decoration: line-through; } -.cm-tw-syntaxerror { color: rgb(255, 255, 255); background-color: rgb(153, 0, 0); } -.cm-tw-deleted { text-decoration: line-through; } -.cm-tw-header5 { font-weight: 700; } -.cm-tw-listitem:first-child { padding-left: 10px; } -.cm-tw-box { border-style: solid; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-color: inherit; border-top-width: 0px !important; } -.cm-tw-underline { text-decoration: underline; } -@media print { - .CodeMirror div.CodeMirror-cursor { visibility: hidden; } -} - - :root { --side-bar-bg-color: #fafafa; --control-text-color: #777; @@ -675,8 +594,8 @@ header, .context-menu, .megamenu-content, footer{ 视频监控系统开发及使用手册
-
  • 0 前言说明

    0.1 系统说明

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

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

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

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

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

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

    0.2 特别说明

    1. 程序本身是个客户端(直接从摄像机或者NVR等设备取rtsp视频流)并不是服务器程序。

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

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

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

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

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

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

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

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

    0.3 相关站点

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

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

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

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

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

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

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

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

    0.4 功能特点

    0.4.1 软件模块

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

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

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

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

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

    0.4.2 基础功能

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    18. 右下角音量条控件,失去焦点自动隐藏,音量条带静音图标。

    19. 支持视频截图,可指定单个或者对所有通道截图,底部小工具栏也有截图按钮。

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

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

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

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

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

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

    26. 可保存视频,可选定时存储或者单文件存储,可选存储间隔时间。

    27. 可设置视频流通信方式tcp+udp,可设置视频解码是速度优先、质量优先、均衡等。

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

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

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

    0.4.3 特色功能

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    0.5 目录说明

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

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

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

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

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

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

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

    0.6 编译说明

    0.6.1 特别提示

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

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

    3. 本人亲测Qt4.7到Qt6.4之间的所有版本(理论上支持后续所有版本),亲测msvc、mingw、gcc、clang、armgcc各种编译器,亲测xp、win7、win10、linux、mac、树莓派、香橙派、全志H3、cotex-A9、imx6等。

    4. 2021-1-6开始集成了miniblink浏览器内核,意味着mingw版本的qt5.6以上版本也全部支持,这样就所有系统都有浏览器模块不需要担心没有电子地图的问题。

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

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

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

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

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

    0.6.2 注意事项

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

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

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

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

    5. 如果是64位的qt则对应的dll时候拷贝dll_ffmpeg4_64目录下的。

    6. 如果使用的ffmpeg3则对应dll目录就是dll_ffmpeg3,在core_videoffmpeg.pri文件中可以看到具体启用的是ffmpeg3(支持XP)还是ffmpeg4(不支持XP),默认是ffmpeg4。

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

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

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

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

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

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

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

    0.6.3 离线地图

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

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

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

    使用说明

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

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

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

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

    0.7 视频格式

    0.7.1 本地摄像头

    1. 下面假定本地摄像头的设备名为 USB2.0 PC CAMERA。

    2. win系统如何查看设备名见本文档中13其他说明/13.7打开本地摄像头。

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

    4. 写法1:video=USB2.0 PC CAMERA,这种写法默认按照640x480分辨率打开摄像头。

    5. 写法2:video=USB2.0 PC CAMERA|1280x720|30,这种写法按照指定的分辨率1280x720以及采集帧率30来打开摄像头。

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

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

    0.7.2 电视频道

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

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

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

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

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

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

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

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

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

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

    0.7.3 视频文件

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

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

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

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

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

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

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

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

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

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

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

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

    百度视频

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

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

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

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

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

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

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

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

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

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

    时间很短的视频文件

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

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

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

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

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

    0.7.4 网友提供

    下面的地址几乎都失效

    1. rtmp://live.yihtc.com:10935/hls/stream_3

    2. rtmp://live.yihtc.com:10935/hls/stream_13

    3. rtmp://218.3.205.46/live/ggpd_sd

    4. rtmp://hls.hsrtv.cn/hls/hstv2

    5. rtmp://hls.hsrtv.cn/hls/hstv1

    6. rtmp://222.173.22.119:1935/live/jnyd_sd

    7. rtmp://222.173.22.119:1935/live/xwhd_hd

    8. rtmp://livetv.dhtv.cn:1935/live/peoples

    9. rtmp://livetv.dhtv.cn:1935/live/citylife

    10. rtmp://livetv.dhtv.cn:1935/live/financial

    11. rtmp://livetv.dhtv.cn:1935/live/news

    0.7.5 监控设备

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

    0.7.5.1 海康
    • 实时预览格式:rtsp://admin:12345@192.168.1.128:554/Streaming/Channels/101?transportmode=unicast

    • 视频回放格式:rtsp://admin:12345@192.168.1.128:554/Streaming/tracks/101?starttime=20120802t063812z&endtime=20120802t064816z

    • 流媒体视频流:rtsp://172.6.24.15:554/Devicehc8://172.6.22.106:8000:0:0?username=admin&password=12345

    • 日期时间格式:ISO 8601 表示Zulu(GMT) 时间 YYYYMMDD”T”HHmmSS.fraction”Z”,

    • 单播多播说明:unicast表示单播,multicast表示多播,默认单播,可以省略。

    • 通道码流说明:101,1是通道号,01是通道的码流编号,也可以是02、03,第2通道主码流=201,第16通道子码流=1602,依次类推。

    0.7.5.2 大华
    • 实时预览格式:rtsp://192.168.1.128:554/cam/realmonitor?channel=1&subtype=0&unicast=true&proto=Onvif

    • 视频回放格式:rtsp://admin:12345@192.168.1.128:554/cam/playback?channel=1&subtype=0&starttime=2021_03_18_11_36_01&endtime=2021_03_18_12_05_01

    • 格式内容说明:channel表示通道,subtype表示码流编号,日期时间字符串非常明确。

    0.7.5.3 常规
    • 实时预览格式:rtsp://admin:12345@192.168.1.128:554/live?channel=1&stream=1

    • 视频回放格式:rtsp://admin:12345@192.168.1.128:554/file?channel=1&start=1494485280&stop=1494485480

    • 其他通用格式:rtsp://admin:12345@192.168.1.128:554/0 0-主码流 1-子码流

    • 日期时间说明:先转换时间戳,1970年到该时间经过的秒数。

    0.8 版本说明

    0.8.1 精益求精

    后期规划

    1. 摄像机信息表的用户信息字段用起来,视频流地址不带用户信息,主动加入用户信息构建最终地址应用。

    2. 用户密码密文存储,防止泄露。

    V20230611

    1. 增强解码的健壮性,比如在ffmpeg中未找到对应的解码器,取消对应视音频的处理,比如没找到G.722.1的音频解码器(AV_CODEC_ID_NONE),则不处理音频数据,直接保留处理视频数据即可。

    2.  

    V20230605

    1. 内核ffmpeg保存视频类增加超时判断。

    2. 内核ffmpeg所有类打印错误信息参数增加带上错误码和错误详情,方便分析问题。

    3. 内核ffmpeg改进硬解码格式的合法性检查。

    4. 修复默认传入静音状态除了ffmpeg内核外其他内核没有生效的BUG。

    5. 标签文字水印增加了图形字体的支持,极大的丰富了文字水印的内容,可以将各种图形图案以文字的形式绘制到原图中。文本绘制的性能比图片高很多,可以将方框等各种图形转换成图形字体再以水印加到原图中。

    6. 内核ffmpeg增加硬解码失败自动转软解码策略。

    7. 内核ffmpeg增加图片滤镜功能,和之前各种文字水印和其他滤镜一起(文字水印和图片水印叠加功能折腾很久)。

    8. 重写保存视频线程,支持音视频同步合并保存到MP4文件,保存线程可选是否强制编码还是源数据保存。强制编码会增加CPU占用,但是有些情况必须强制编码,比如非264格式需要推流,重新改变保存文件体积大小,将OSD标签和图形信息存入文件或推流等。

    9. 内核ffmpeg保存视频支持不编码(源头是h264/h265+aac)、部分编码(参数指定视频或者音频编码)、完全编码(所有格式不符合则强制编码)等三种组合。

    10. 修复如果文件名称为rtmp/rtsp/http开头的时候地址类型解析不正确的BUG,要用rtmp://这种开头判断。

    11. 内核ffmpeg增加编码策略选项,可选自动(非264/265/aac则转码)、仅限文件(文件类型则转码)、所有转码,默认选择自动处理,可以大大节约CPU资源占用。

    12. 改进策略当选择最快速度播放的时候,文件类型的也全力解码数据并显示,不做任何的同步和延时。这样可以测试本机最大的解码能力。

    V20230522

    1. 组件onvif增加时间差值计算,有些设备在发送鉴权数据的时候需要以设备的时间为准,而不是以onvif客户端为准,很多设备可能时间在1970年或者2000年,意味着发送鉴权的时候对应时间要1970年或者2000年,不然会鉴权失败,所以在首次鉴权的时候需要获取设备的时间(主动设置时间后也需要获取一次),计算时间差值,下发鉴权的时候主动加上这个差值。

    2. 内核ffmpeg增加对指定窗口标题的窗口进行录屏,目前测试下来只支持英文的标题。

    3. 修复短时长(5s)视频文件播放在关闭的时候可能崩溃的BUG。

    4. 保存视频文件增加首帧必须关键帧的过滤,保证保存的视频文件在任何地方打开都不会绿屏。这个过滤机制会导致保存的视频文件缺少开始部分的帧,比如摄像头设置的I帧(关键帧)间隔是50则最大可能接近2s的帧丢失,这个丢失无法避免,因为开头部分的非关键帧无法正确计算得到完整的图片。

    5. 修复了开启了录像计划下,双击打开父节点视频后,录像计划线程停止后未开启的BUG。

    6. 视频回放查询功能增加过滤正在写入的文件,不要放入到文件列表。

    7. 修复部分265编码的视频流保存的时候时长不正确的BUG,因为视频流有平均帧率和基本帧率,保存的时候取基本帧率。

    8. 配置参数增加opengl类型选择,可选AA_UseOpenGLES防止有些电脑显卡驱动版本不够或者硬件显卡不支持的情况,启用AA_UseOpenGLES以后也可以正常使用opengl用来绘制视频数据。

    9. 增加用户没有填经纬度时自动以地图中心坐标为准的处理,防止没有经纬度坐标导致地图加载失败。

    10. 增加低分辨率下默认隐藏OSD标签管理悬停模块,该模块对界面高度有要求导致把整个界面撑起来而看不到底部。

    V20230510

    1. 增加文字水印单独示例,专门演示如何添加日期时间标签,文字标签,指定标签更新内容,以及显示实时码率文字水印。

    2. 内核ffmpeg增加实时码率计算,发出结果信号。

    3. 增加了OSD标签格式日期时间带毫秒枚举值。

    4. 增加统计实时码率开关,开启后,在人工智能开关开启状态下,会将实时码率信息以文字水印OSD的方式贴到视频上。

    5. 文字水印演示字体大小改成了以视频宽度比例为准,以便保证字体足够大能够看清。

    6. 内核ffmpeg增加保存视频压缩比率参数,可根据网络带宽需求调整清晰度,包括保存的视频文件大小和推流占用带宽。

    7. 增加保存视频压缩比率参数,可控保存后视频文件体积大小(只针对需要重新编码的场景)。

    8. 增加多镜头多通道摄像机的支持,有些摄像机带了多个镜头,每个镜头对应一个通道。

    9. 内核ffmpeg增加只推流的情况下手动切换实时预览(需要解码才能预览/推流不需要解码也可以推流/以便最小占用CPU)。

    V20230416

    1. 新增桌面录屏的支持,包括ffmpeg、vlc、qtav、easyplayer等内核。

    2. 桌面录屏可指定录屏区域位置。

    3. 完善easyplayer内核对各种视频流的支持。

    4. 重新优化视频类型的判断,http开头的地址可能是文件也可能是视频流,以最终时长作为判断依据。

    5. 增加了H264裸流视频文件倍速播放。

    6. 内核ffmpeg增加发送packet帧信号,一般用于推流的同时保存视频文件需要。

    7. 模块onvif增加osd相关处理,可以获取所有osd,并执行添加、删除、修改操作。

    8. 增加OSD管理悬停模块,可以增删改查OSD相关信息。

    V20230323

    1. onvif模块增加获取mac地址。

    2. 所有监控内核增加矫正视频类型,比如http开头的有文件长度的则强制设置为filehttp类型,方便后期其他判断处理。

    3. 新增主动设置文件时长和播放进度的函数,以便事件回调那边主动设置。

    4. 修复ffmpeg内核部分视频文件当分辨率不是常规分辨率时(比如分辨率426x240)回调取出图片不正确的BUG,转换需要做字节对齐设置,现在约定统一用4字节对齐,这样兼容了所有可能的分辨率。

    5. 修复ffmpeg内核在高倍速比如5倍速播放情况下,如果解码来不及导致播放进度计算不正确的BUG。

    6. 增加对http开头的地址对应视频类型的判断,有些是视频文件(有时长并且可以切换播放进度),有些是实时视频,尽管地址格式都是 http://xxxxxx/xx.m3u8 这种。

    V20230201

    1. 新增天气预报模块开关。

    2. 海康内核增加手动指定端口解析。

    3. 更新onvif相关处理,支持内网摄像头通过路由器端口映射公开到外网,以外网的IP地址形式访问。

    4. 设备搜索模块在单播的时候增加厂家为空则先获取设备信息获取到制造商名称并自动填入。

    5. 内核vlc增加图片和文字水印功能,从源头处理。

    6. 内核mpv增加文字水印功能。

    7. 内核ffmpeg增加网络访问视频文件头部消息user_agent=Mozilla,有些视频网站根据这个头部消息过滤不让ffmpeg访问。

    8. onvif单播搜索增加指定地址不存在的过滤。

    9. 增加对显卡禁用环境的识别,自动切换采用Qt::AA_UseOpenGLES,否则在禁用显卡环境中无法正常使用opengl。

    10. 增加当处于OpenGLES绘制下自动将硬解码改成none,防止无法正常显示视频画面。

    11. onvif组件搜索功能增加错误提示,比如绑定组播失败、单播地址不通等提示。

    12. 无人机移动演示模块增加过滤,还没有初始化好就不触发js交互。

    13. 增加对虚拟机环境的识别,自动切换采用Qt::AA_UseOpenGLES,否则在虚拟机中硬解码下无法使用AA_UseDesktopOpenGL。

    14. 录像计划批量按钮增加先清空再批量,否则通道数不一致。

    15. 本地回放等界面增加全选、全不选按钮,用于对查询出来的视频文件全部选中和不选中。

    16. 打包文件增加了wenquanyi.ttf字体文件,由于ffmpeg用到了滤镜,为了支持中文正确显示,依赖指定的中文字体文件,放到可执行文件同一目录即可。

    V20230108

    1. 内核ffmpeg实现了各种OSD标签和图形直接绘制到帧上,保存也带了对应的标签信息,之前是绘制在遮罩层上。

    2. 内核ffmpeg带旋转角度的视频旋转采用滤镜实现,之前是通过算法转换。

    3. 修复图文警情在清空后重新添加警情的时候最底部一个item可能高度不对的BUG。

    4. 批量添加NVR通道改进编号和摄像头名称策略,编号为NVR地址的后两个网段的值加上3位通道字符串,名称为通道001/通道002依次下去。这样符合现场跨网段的场景,一般现场有N多摄像机和NVR,很多都是跨网段的场景。

    5. 地图上设备单击弹出视频预览增加过滤,限制双击只允许单击。

    6. 增加配置参数控制设备树是否显示主码流子码流节点。

    7. 增加配置参数双击打开分组最大数量,0-最大通道数量 1-当前通道数量 2-自动调整数量。

    8. 增加配置参数记录最后展开的设备节点,下次打开自动应用。

    V20221212

    1. 改进实时监测设备在线情况逻辑,之前是一次性所有的处理,改成了排队处理,每次间隔0.1s,同时处理完一个来回后休息5s,这样在设备数据很多的时候尤其有效。

    2. 视频参数设置中新增离线检测开关和报警视频存储时间下拉框选择。

    3. 设备播放模块增加添加完一个通道后自动切换到下一个通道。

    4. 将批量添加单独做成窗体,通用于轮询管理和摄像机管理,可以很方便的批量添加摄像机,录像机通道递增等各种智能规则。

    5. 打开弹窗视频增加在线判断,没有开启在线检测则先检测再判断是否需要弹窗。

    6. 纠正图片参数调节中饱和度和对比度界面上名称标识写反了的BUG。

    V20221207

    1. 报警事件抓图后添加到图文警情,改成线程排队处理,之前在主线程处理,如果有多个同时,很可能卡主界面,而且还要等待抓图的文件生成才能正确显示图片。

    2. 新增警情字典表config/event.txt,格式 1,IsMotion,移动报警,移动结束 ,分别表示 事件等级/唯一标识/报警字样/解除字样 ,这样大大增强灵活性,每个不同厂家的设备可能有不同的关键字表示不同的警情,用户只需要在字典表中编辑好即可。

    3. 内核vlc彻底解决回调模式下视频流需要手动指定的问题,改成了在播放后拿到分辨率后去设置回调数据,完美解决。

    4. 修复内核vlc中打开视频流后多次触发读取媒体信息的BUG,包括中途视频流发生变化也会多次触发。

    5. 修复悬停模块透明度值应用不及时的BUG。

    6. 图文警情双击显示原图增加自适应图片大小策略,并限定最大分辨率。

    7. 增加了左右通道音频振幅分别计算,之前混在一起计算。单通道的则左右一样。

    8. 视频预览窗体增加自适应视频大小策略,并限定最大分辨率。

    9. 新增将选择的软件图标作为全局的左上角图标,选择后立即应用。

    10. 修复在共享解码线程中再次打开弹出的视频窗体声音大小和静音状态不一致的BUG,改成了和原共享解码线程一致。

    11. 弹出窗体自适应最大尺寸,如果视频尺寸超过了最大尺寸则等比例缩放到合适尺寸。

    12. 报警事件抓图按照日期文件夹存放,之前存放在image_alarm目录下挤在一起,多了就很难看。

    13. 新增每个视频控件都有共享解码属性,每个控件都可以控制是否需要共享解码,之前是统一全局的属性,有时候需要单独弹出的报警视频独立处理以及存储录像,此时就需要指定该控件不共享解码,极大的增加了自由度。

    14. 修复清空录像机信息后,设备列表无法正常加载的BUG,改成了自动生成一个默认的分组。

    15. 新增半透明轮询分组提示标签窗体,在轮询启动后显示停止轮询后隐藏,可以拖动到合适位置,自动记忆最后的位置。方便在全屏轮询阶段告知用户当前轮询到哪里。

    16. 增加开关量报警弹出报警视频,并录像存储,可在视频回放中查询对应的报警视频并回放。

    17. 报警视频弹窗窗体标题栏,如果指定了存储报警录像,则显示关闭倒计时字样。

    18. 修复在打开了未连接的视频通道,通道处于不断重连中,单击轮询崩溃的BUG。

    19. onvif组件增加唯一标识,打印信息更清晰,带上唯一标识和设备IP地址。

    V20221125

    1. onvif搜索增加超时时间参数,经过大量的现场应用反馈,少部分厂家的设备,在极端的网络环境中,返回的数据要慢,需要把之前写死在代码中的超时时间放出来作为参数设置可调节。

    2. 视频参数增加悬浮工具栏位置参数,可以设置视频控件的悬浮条位置在顶部、底部、左侧、右侧四个位置。

    3. 解决Qt6.4及以后版本比如Qt6.5上minibink和opengl冲突导致opengl黑屏的bug,此问题找了很久发现原来是和miniblink冲突了,改成了异步加载miniblink浏览器控件即可,代码 QMetaObject::invokeMethod(this, "initWebView", Qt::QueuedConnection);

    4. 对不启用任何解码内核增加过滤,没有指定内核则不用启动解码线程。

    5. 测试发现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。

    6. 使用示例增加音频频谱示例。

    7. 使用示例增加拖曳播放示例。

    8. 系统设置增加音频振幅开关,开启后视频右侧都会显示左右通道额音量条。

    9. 初始化结构体参数增加过滤机制,地址为空的不处理。

    10. 新增了视频通道拖动配置参数,可控是否允许拖动交换通道,防止误操作。

    11. 增加根据视频控件的高度自动调整音量条格子数量,比如4通道60个格子,64通道20个格子,保证音量条自适应。

    12. 音量条的圆角角度、格子高度、边距、间距等参数可自由设置。

    13. 静音状态约定只是声音不发送给音频输出设备播放,音频数据正常解析,包括音频频谱正常显示。

    14. 增加根据视频控件的宽度自动调整音量条的宽度,比如4通道的时候音量条可以宽一些,64通道音量条可以窄一些。以便留出更多的空间给视频显示而不会显得很拥挤。

    15. 增加根据视频控件的宽度自动设置悬浮条提示信息是否需要显示,宽度不够则不显示,比如悬浮条设定显示在左侧右侧由于宽度不够也不显示提示文字信息。

    16. 增加报警事件抓图显示在图文警情中。

    17. 增加udp://开头的视频流强制采用udp协议解析。

    18. 修复重连后默认的音量大小以及静音状态不正确的BUG。

    V20221121

    1. 新增图形字体文件可编辑,可以根据需要添加自己的图标到iconfont.ttf字体文件,需要借助fontcreator工具。

    2. 新增部分图标,把底部通道1-通道64的图标换成了数字模样的,整齐统一容易拓展。

    3. 修复ffmpeg内核声音播放的时候遇到标题栏或者UI按下卡住停顿0.5s的BUG,改成了线程中播放音频,无论UI如何卡丝毫不影响。

    4. 视频回放增加手动停止按钮以及静音切换按钮。

    5. 增加ffmpeg内核声音解码过滤,部分摄像机的音频流如果是48000采样会导致转换失败,增加过滤处理。

    6. 修复应用最后的音量大小和静音状态时候在ffmpeg内核下有时候不成功的BUG。

    7. 实时检测摄像机是否在线,增加其他端口的识别,默认554端口,也可能有其他端口。

    8. 改进默认音量大小和静音状态设置逻辑,如果采用QAudioOutput播放音频则初始化的时候传入对应参数,如果是内核自带声音静音接口的则在打开成功以后主动去设置默认的音量大小和静音状态。

    9. 本地回放增加停止播放和静音切换图标按钮,并优化对应的处理逻辑。

    10. 修复qmedia内核静音切换对应标志位没有改变的BUG。

    11. 对视频监控控件新增获取是否暂停状态、音量大小、静音状态等函数。

    12. 本地回放新增当用户按下播放按钮右侧又选择了对应的文件则自动触发双击播放。

    13. 修复本地回放中停止播放后当还不是末尾一个视频文件时还会自动播放下一个的BUG,因为有自动播放机制,需要增加标志位判断,只要按下过停止按钮则无需自动播放。

    14. 修复ffmpeg内核在快速拖动进度条期间切换播放进度后小概率出现播放暂停的BUG。之前复用的暂停标志位,由于很多地方用到并且可能修改了暂停标志位导致恰时间点的不正确,新增了切换进度标志位,专用于切换进度判断,完美解决。

    15. 增加onvif指令过滤重复机制,当队列中有相同的onvif地址和指令的时候,不需要加入队列。

    16. 内核ffmpeg增加了实时码率的计算,统计的一个周期内(帧率25就统计25个包)所有视频数据包的总大小。

    17. 重新更新全部说明书,包括截图和文字说明。

    V20221116

    1. 每个视频控件都可以手动开启和停止录像,开启的时候传入文件名即可。

    2. 修正视频控件边框大小计算当尺寸为奇数的时候不准确的情况,增加了偏移1个像素处理非常完美。

    3. 修复ffmpeg内核打开视频流中途分辨率变化后计算不正确的BUG,中途分辨率调整后策略改成重新打开。

    4. 修复ffmpeg内核在暂停阶段切换播放进度后会继续播放的BUG,应该是要继续处于暂停播放。

    5. 解码线程基类、保存线程基类都增加全局静态变量控制是否打印消息,由于解码线程等类中要打印的信息特别多,可以在需要的时候开启,几乎每一个重要的步骤或者可能出错的地方都会有对应打印信息,方便跟踪查找问题。有时候想关注其他地方的打印信息,为了避免给解码线程的打印信息冲掉,尤其是通道数量多的时候,信息类似涌过来,此时可以关闭解码线程的打印信息,专注于其他打印信息。

    6. 视频配置参数这块很多参数的设置改成了立即应用,比如边框大小、图片显示策略等,不能立即应用的也可以通过主界面中的停靠窗体设备控制单击刷新通道来应用。

    7. 录像计划改成了立即应用,添加、删除、修改后都会立即更新录像计划到视频管理线程类。

    8. 视频回放中的日期选择范围,改成了精确到分,无需精确到秒。

    9. 视频回放增加了倍速选项,可选0.5/1.0/2.0/4.0/8.0等倍速。设置完立即应用,下一个自动播放的也会立即应用该倍速。

    10. 视频管理线程类对切换保存文件的时间的精准度做了调整,比如30分钟一个文件,文件的时间是12:00:00到12:29:59,12:30:00到12:59:59,整半点开始,59秒结束。

    11. 目前的视频存储策略是中间存储的保证是30分钟的一个文件,头部和尾部,因为开启录像或者结束录像的时间未必是整半点,所以可能产生的录像文件的时间不一定的30分钟一个。

    12. 经过详细测试对比,如果是视频流,开启了变码流则视频大小未必一样,如果是定码流则几乎一样,变码流则文件大小相差比较大,视频中动静变化比较大或者颜色比较多的文件体积更大。

    13. 同样分辨率的视频流,用H265编码生成的视频文件体积比H264小很多(同一个摄像头同样主码流分辨率切换到H265存储体积大概是普通H264的40%,还有其他H264H/H264B之类的没有具体对比测试),本系统中的策略是源头是H264的就采用H264编码,源头是H265的就用H265编码存储。这样可以不用转码大大减轻CPU运算压力。

    14. 录像文件存储以本地时间为准,如果设备的时间和本地时间不一致,可能会看到摄像头视频文件上显示的时间和要求的时间不一致,在开启了onvif校时的情况下,大概会有3s左右的偏差,也就是说录像文件上显示的时间可能是走到10:30:03才结束,如果时间完全一致则应该是10:29:59。

    15. 增加目标秒数核对以便尽量保持录像时间以59秒结束,可以自行更改该目标秒数值保持一致。

    16. 所有下拉框中的通道字符串为了整齐统一改成了两位字符串比如 通道01、通道05、通道16,除了主界面通道文字是 通道1、通道5、通道16字样,其余全部两位。

    V20221111

    1. 新增录像计划,增加录像任务计划控件,支持星期一到星期日每天24小时勾选是否录像,精确到30分钟间隔。

    2. 任务策略表格支持直接右键菜单全部选中、反向选中、清空选中操作。

    3. 新增录像计划表RecordInfo,对应字段RecordCh表示通道0-64,RecordWeek1-RecordWeek7表示星期一到星期日的录像计划字符串表示,通过占位符表示该30分钟时间内是否录像,每天有48个小格式。

    4. 通道唯一标识统一ch01到ch64字样,录像文件以及截图都按照这个作为文件的前缀,方便查找。

    5. 调整了一个设备多路通道(比如NVR或者部分相机)搜索的结果组合的策略,以便配置成多个不同的通道。大部分厂家的规则是每个通道一路主码流一路子码流,依次顺序存放。

    6. 录像计划新增批量一键添加64通道7 * 24小时录像,绝大部分时候都是这个情况所以可以一键添加,添加好以后有特殊的可以自行调整。

    7. 演示示例demo新增了配置参数保存对应选择的视频地址。

    8. 视频参数设置做了重大调整,按照新的解码内核来设计,更合理更贴切,把一些不需要的删除了。

    V20220918

    构思和编码及测试花了一年时间,将所有视频监控内核重新架构重写,抽象视频解码线程类和视频窗体展示类,着重解决了视频解码线程复用。具体可参见文档中的内核模块说明。

    视频复用技术难点

    • 通道1打开视频流A,通道2也打开视频流A,通道3也打开视频流A,此时通道1负责打开视频流A,其他两个通道公用通道1的视频流数据。

    • 通道1关闭视频流A(仅仅是关闭映射,不能关闭视频流),通道2关闭视频流A(仅仅是关闭映射,不能关闭视频流),通道3关闭视频流A(关闭映射+关闭视频流)。

    • 首次打开视频流地址的通道负责打开视频流。

    • 末次关闭视频流地址的通道负责关闭视频流。

    主要改进功能点

    1. 共享解码线程,相同地址的已经打开过的,直接复用,大大减轻网络流量和推流设备的压力。

    2. 动态内核挂载,解码和展示分离,通过基类的公共接口设计,视频控件可以任意动态挂载任意的解码内核,在打开的时候指定即可,内部会根据指定的内核自动实例化对应解码线程解码。

    3. 悬浮工具栏控件,各种颜色设置,包括透明度,位置可以上下左右,内容可以自定义。单击事件发信号,常用的录像、抓图、静音、关闭等按钮内置了实现,其余自定义按钮可以自行拿到信号做处理。空白处显示对应通道的分辨率、录像状态等信息,提供接口设置对应提示信息。

    4. 自定义标签OSD,任意多个,有多种类型和属性参数。

    5. 自定义图形,任意多个,直接绘制到原图上,有多种类型和属性参数。

    6. 视频控件基类,参数极其丰富,包括边框大小、边框颜色、焦点颜色、背景颜色、文字颜色、填充颜色、背景文字、背景图片、是否拷贝图片、缩放显示模式、视频显示模式等。

    7. 解码线程基类,参数极其丰富,包括解析内核、视频地址、缓存分辨率、解码策略、硬件加速、通信协议、缓存时间、循环播放、读取超时时间、连接超时时间等。

    8. 除了常规的视频文件、网络文件、视频流,还支持本地摄像头、旋转了90度的手机视频文件、非H264的文件自动转码显示。

    9. 对ffmpeg内核做了极度优化,支持音频视频文件保存,之前只支持rtsp视频流,而且生成的文件不标准没有文件属性分辨率信息等。

    10. 统一的打印格式,完整的信号通知,友好的接口设计。

    0.8.2 破茧成蝶

    V20220625

    1. 在之前支持NVR所有通道批量添加基础上,增加自动添加NVR信息到表,这样每个NVR都会自动添加,如果有手动添加好的则取添加好的,以IP地址为准。

    2. 修复设备在线状态处理,在同一个NVR下IP地址相同的不同通道视频,不会处理在线状态的BUG。

    3. 修复在postgresql数据库和oracle数据库下,QSqlTableModel对应setTable设置表名严格区分大小写的BUG。

    4. 测试发现有些很老的设备支持的是onvif1.0,云台地址需要用getCapabilities才能拿到,改进这个处理,兼容任意版本。

    V20220612

    1. 修复qss中分组框QGroupBox标题位移的BUG,在linux系统表现不统一。

    2. 改进同样的内容导出到pdf和打印显示效果不一致的情况,统一设置分辨率为96。

    3. 摄像机管理增加多选删除,删除的时候除了删除摄像机表中对应记录,也同时删除轮询信息表中的记录。

    4. 初始化数据库按钮增加弹框确认,由于这个操作安全级别非常高,增加弹框确认很有必要。

    5. 所有QTableView+QSqlTableModel对应的保存按钮代码增加主动设置焦点,避免mac系统中当单元格处于编辑状态,再去单击保存按钮,数据依然是之前的数据的BUG。

    6. 样式表全局颜色增加悬停背景颜色QUIConfig::HoverBgColor和选中背景颜色QUIConfig::SelectBgColor用于自定义委托。

    7. 对于加深的样式,重新设置单元格等item选中和悬停颜色 默认悬停-DarkColorEnd 选中-NormalColorEnd,加深颜色设置为相反。

    8. 增加全局参数控制是悬停颜色覆盖选中颜色还是选中颜色优先,默认选中颜色优先,这样选中的item鼠标移上去不会改变掉颜色。

    9. 增加过滤同名的NVR,之前会重复加载,现在限定同名的只加载一个,要求整个系统中NVR的名字必须唯一。

    10. 轮询管理中增加摄像机表的过滤条件,启用了的才显示在表格中。

    11. 增加播放记录开关,用于软件启动后,是否从播放记录url.txt读取历史记录进行播放。

    12. 增加播放记录url.txt过滤机制,只有摄像机表中存在且启用过的才可以播放。也可以改成只对rtsp开头的进行过滤。

    13. 增加选择列表通道的时候自动选中视频通道,高亮显示,这样很明确知道选择的哪个,同理,选中视频通道也高亮选中列表通道。相当于通道选中和列表选中联动。

    14. 增加设备列表在线离线不同图标显示,目前只对rtsp地址开头的进行实时监测上线离线状态,其他全部永远当做在线。离线图标颜色取系统设置中的报警图标颜色。

    15. 增加设备在线状态字段列表,实时监测设备状态期间先判断状态是否发生变化,只有发生变化了才需要去调用对应函数处理,大大减少无效的多余的处理。

    16. 修复设备列表双击空白处崩溃的BUG,需要过滤空节点item。

    17. 增加表格策略,单选按下编辑、多选双击编辑,有些用户需要多选摄像机列表删除。

    V20220515

    1. 将用户退出中的退出系统权限验证去掉,理论上对退出系统这个限制没啥意义,还可以通过任务管理器强制关闭进程。

    2. 将退出系统的权限名称改成调整布局,没有调整布局权限则不能调整拖动停靠窗体位置等。

    3. 视频面板窗体对象指针放到了全局静态变量,这样很多地方可以直接使用,比如声音控制、布局调整、视频轮询等。这样就不用繁琐的信号槽切换,可以省略很多不必要的代码,性能更高。

    4. 修复静音状态下调整音量可能不正确的BUG,静音状态下只改变音量值变量而不是正常改变音量。

    5. 实现右下角音量面板静音切换、音量值调整,全局视频控件应用。

    6. 改进默认地图算法,取第一个有背景地图的设备的图片作为默认图片,可能默认图片不存在则取图片列表中的第一张。

    7. 修复ffmpeg内核回调模式自动重连崩溃的BUG,此时图片不存在应该置为空。

    8. 增加识别秘钥有限制后限定标题栏带试用字样。

    9. 重写通用的视频地址类videourl,将通道改成0开始,分隔符改成英文逗号,视频地址集合通过指定枚举值选择不同类型添加。

    10. 增加自动插入临时消息到数据库用户操作记录,增加参数控制是否需要显示临时消息的时候插入。

    V20220413

    1. 修复视频控件设置自定义背景颜色的时候,没有考虑边框的范围问题。

    2. 选项卡样式去掉悬停样式,经过观察对比Qt自带的样式都是没有悬停样式,直接是选中样式。

    3. 修复自定义委托复选框不居中的问题,之前计算不准确会有细微偏差。

    4. 自定义委托增加悬停颜色。

    5. 重写自定义委托禁用列,支持文字颜色、背景颜色、字体等特性。

    6. 修复用户登录、用户退出界面标题栏字体被放大的BUG,因为样式冲突了。

    7. 将NvrInfo和IpcInfo中的地址字段改名为mark备注字段,涵盖内容更广。

    8. 地图模块默认卫星图增加了叠加层,更符合实际需求,对应地图综合应用示例做了极大升级改善,比如下载离线地图改成了最新的地址,可以下载到和在线地图一样的瓦片图片文件,离线地图下载改成了多线程,速度提升10倍以上。

    9. 自定义委托增加quistyle标记,有该标记则自动代码内部引用换肤全局颜色变量,这样删除了大量的设置自定义委托背景颜色的代码。

    10. 修复Qt6中msvc编译器下,强制指定miniblink浏览器内核的时候编译通不过的BUG,其实这个操作有点吃饱了撑着,因为msvc下有webengine浏览器内核。但是就是因为有极个别人有这个需求,客户就是上帝。

    11. 增加用户管理权限。

    12. 将用户权限和用户信息相关类合并到通用的类userhelper中,做成通用的权限组件。

    13. 修复Qt6中自定义复选框委托,在设置了全局样式的情况下,会不断切换选中的BUG。

    14. 效果图重新截图,用最新的运行界面。

    15. 组件示例增加4通道视频同时播放,进度条控制。

    V20220106

    1. 彻底修复全屏模式+webengine同时存在的情况下鼠标右键菜单无法弹出以及视频可能黑屏的BUG,这是Qt的BUG。

    2. 同时测试多屏幕下正常状态和全屏状态的情况,多屏幕不同分辨率。

    3. 增加其他设置界面,将串口设置、网络设置等移动到其他设置。随着功能越来越多,也很有必要单独拆分设置。

    4. 修复打印预览看不到文字的BUG,原来是设置了QGraphicsView的前景色导致的,把前景色和背景色设置成一样的了,其实是有文字的,鬼想得到QPrintPreviewDialog里面的预览原来用的是QGraphicsView绘制的。

    5. 修复qchart图表控件鼠标按下松开后会跟随窗体移动的BUG,因为qchart鼠标按下是UngrabMouse事件而不是MouseButtonRelease。

    6. 修复表格行按下后自定义委托颜色在部分样式方案下设置不正确的BUG。

    7. 增加视频弹窗按钮,封装的统一的视频弹窗静态函数,直接传入url地址即可。

    8. 修复鼠标按下视频预览底部工具栏也能拖曳视频的BUG。

    9. 海康内核解析增加对通道的解析,比如可能是一个摄像机有多个通道,或者NVR多个通道。同时完善主码流子码流的解析,可以解析多个码流,之前只能解析主码流子码流两个。

    10. 海康内核句柄模式下增加等比例缩放自适应。

    11. onvif模块修复部分厂家摄像机比如天地伟业,搜索返回的媒体地址等一系列请求地址,没有加onvif节点的BUG。

    V20211220

    1. 重新梳理整个onvif模块,调整对应的结构,删除多余的变量和设置等,对应云台控制等操作需要指定profile,通过参数传入。

    2. 对应图片参数操作需要指定videosource,通过参数传入。

    3. 去除数据库字段mediaurl、ptzurl,因为这两个数据每次都是更新重新获取的,通过getServices获取,这两个字段改成了videosource、profiletoken,用来从数据库读取出来,每次使用的时候自动下发。

    4. 预置位表格中的按钮样式调整,去掉圆角,增加边距,效果更完美。

    5. 新增nvr多个通道onvif支持,改动onvif模块代码和数据库结构。

    • 搜索设备后判断是否多个videosource,多个表示有多个视频源,一般是NVR,也有部分IPC自带多个视频源。

    • 有多个则根据不同厂家不同规则,找出对应的每个通道的videosource、profiletoken、rtspmain、rtspsub用分隔符 | 插入到临时表格中。

    • 摄像机管理界面接收到添加设备的时候,在addDevice槽函数中,判断发过来的数据,带了 | 要分别取出来作为通道添加到数据库中。

    1. 重新定义搜索的摄像机设备命名规则,按照摄像机#ip地址末尾数字的方式。

    2. 如果是NVR过来的摄像机,增加自动查找NVR的名称插入数据库。

    3. 获取预置位增加立即清空所有行,之前是先清空内容再根据读取到的预置位个数设置行数。

    4. 增加双击打开NVR(也叫分组)对应策略 0-最后空白通道 1-从头清空通道。

    5. 增加双击打开IPC(也叫设备)对应策略 0-最后空白通道 1-最后按下通道。

    6. 改进在分辨率不同缩放比例保持一致的UI体验,不受缩放比例的影响。

    7. 修正异或加密,增加对@String开头的密文进行过滤,防止高版本产生的配置文件到低版本的Qt程序不能正确解析的BUG。

    8. 如果打开视频流出错提示 Server returned 5XX Server Error reply 表示摄像机的码流满了,可能多个地方在拉取码流导致摄像机输出的视频流被占满,已经没有更多资源。

    V20211205

    1. 地图内核增加了海量点接口。

    2. 路径规划模块彻底重写,支持重新绘制、沿线移动等模式,数据表格显示。

    3. 设备轨迹模块改成从gps点集合文本文件加载进行循环动态模拟移动,默认飞机图标,以便转动角度。

    4. 设备播放增加保存视频开关配置参数,可以直接在界面上开启,开启后,通过rtsp从nvr取流比如回放视频,可以将回放的视频保存MP4文件到本地。

    5. 修正Qt6通过属性设置标签labtip不能居中对齐的BUG。

    6. 封装通用的设置一堆按钮比如添加、删除、保存、导入、导出等按钮图形字体的函数,直接传入父面板即可,自动查找对应的objname设置图标,省去一堆重复代码。

    7. 新增飞行轨迹模块frmDeviceGps2,之前的frmDeviceGps作为通过外部函数调用移动。

    8. 样式统一整理规范,分类6大类:normal、black、light、dark、flat、other。