From aa68126313f95443cf29d940445fb928b08a4b3e Mon Sep 17 00:00:00 2001 From: feiyangqingyun Date: Sun, 27 Feb 2022 09:16:34 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/video_system/index.html | 85 +++++++++++++++++++++++++++++++++++- 1 file changed, 83 insertions(+), 2 deletions(-) diff --git a/docs/video_system/index.html b/docs/video_system/index.html index 2144c83..f7e975d 100644 --- a/docs/video_system/index.html +++ b/docs/video_system/index.html @@ -201,6 +201,87 @@ mark .md-meta { color: rgb(0, 0, 0); } .md-inline-math-container mjx-container { zoom: 0.95; } +.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; @@ -593,11 +674,11 @@ header, .context-menu, .megamenu-content, footer{ Qt编写的视频监控系统开发及使用说明
-
  • 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. 程序本身是个客户端(直接从摄像机取rtsp视频流)并不是服务器程序。
    2. 摄像机管理没有限制摄像机的数量,理论上10000路肯定没有问题,就是个数据库记录。
    3. 实时显示具体能支持多少路,和具体的电脑配置有关(亲测1.8G主频8G内存I5子码流64路,总之比海康大华客户端要更优秀)。
    4. 程序实时显示界面最大可以到64路,每个通道都是打开的时候才会去建立连接取视频流,而不是一开始就建立了连接。
    5. 系统采用onvif协议+rtsp视频流机制,并不限定支持哪家的摄像机,只要符合这两种协议的都支持,市面上99%的网络摄像机都支持这两种基础协议,包括但不限于海康、大华、宇视、天地伟业、华为等各种安防厂家的摄像机。
    6. 本系统没有内置人脸识别等任何相关算法,提供的是相关的接口,比如自己的算法识别到人脸区域后,将区域坐标传入视频控件自动绘制。
    7. 本系统适用于安防行业,所有录制视频也是针对摄像机的视频流,包括摄像机自身的rtsp格式视频流,摄像机重新推流的rtmp或者http的视频流,凡是源头不是摄像机的视频流一概不存储或者存储不成功,因为可能编码格式不一样。比如中央卫视、大雄兔等视频流是不存储的,因为源头不是摄像机。任何监控厂家的视频监控系统都是只存储监控摄像机的视频,其他一概不存储甚至添加都没法添加到系统中因为过滤掉了。
    8. 系统采用纯QtWidget(非qml)编写,解码采用ffmpeg,搜索采用onvif协议,视频播放采用rtsp协议,所有源码开放,并非有封装的库。
    9. 同时集成了数据库,多线程,串口通信,网络通信,音视频解码,网页地图、界面美化、UI布局等众多知识点。
    10. 未经本人许可不可将本项目源码扩散,如有发现本人将追究法律责任,谢谢配合。

    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.html
    7. 体验地址:https://pan.baidu.com/s/1d7TH_GEYl5nOecuNlWJJ7g 提取码:01jf 文件名:bin_video_system.zip。

    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. 可保存视频,可选定时存储或者单文件存储,可选存储间隔时间。
    24. 可设置视频流通信方式tcp+udp,可设置视频解码是速度优先、质量优先、均衡等。
    25. 可设置软件中文名称、英文名称、LOGO图标等。
    26. 存储的视频文件支持导出到指定目录,支持批量上传到服务器。

    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. 支持xp、win7、win10、linux、mac、各种国产系统(UOS、中标麒麟、银河麒麟等)、嵌入式linux等系统。
    17. 注释完整,项目结构清晰,超级详细完整的使用开发手册,精确到每个代码文件的功能说明,不断持续迭代版本。

    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. windows上Qt5.6以上的版本需要msvc编译器的版本才有,其余系统都会有。
    3. 如果没有则电子地图模块不可用,但是其余功能全部可用没有任何影响。
    4. 本人亲测4.7、4.8、5.5、5.6、5.7、5.9、5.12、5.13、5.14、5.15、6.1等。
    5. 2021-1-6开始集成了miniblink浏览器内核,意味着mingw版本的qt5.6以上版本也全部支持,这样就所有系统都有浏览器模块不需要担心没有电子地图的问题。
    6. 部分构建套件可能不支持预编译头,预编译头仅仅是为了加快编译速度,和程序本身无关。比如在win+Qt5.5 5.6就发现不支持,也可能是支持的不够全面,如果编译发生错误可以试着打开pro文件注释掉PRECOMPILED_HEADER = head.h 这行。
    7. 源码如果在嵌入式linux arm上编译,默认取消了视频监控内核ffmpeg,如果已经交叉编译好了对应arm的ffmpeg库,可以在pro中注释掉这个限制。 +

    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. 程序本身是个客户端(直接从摄像机取rtsp视频流)并不是服务器程序。
    2. 摄像机管理没有限制摄像机的数量,理论上10000路肯定没有问题,就是个数据库记录。
    3. 实时显示具体能支持多少路,和具体的电脑配置有关(亲测1.8G主频8G内存I5子码流64路,总之比海康大华客户端要更优秀)。
    4. 程序实时显示界面最大可以到64路,每个通道都是打开的时候才会去建立连接取视频流,而不是一开始就建立了连接。
    5. 系统采用onvif协议+rtsp视频流机制,并不限定支持哪家的摄像机,只要符合这两种协议的都支持,市面上99%的网络摄像机都支持这两种基础协议,包括但不限于海康、大华、宇视、天地伟业、华为等各种安防厂家的摄像机。
    6. 本系统没有内置人脸识别等任何相关算法,提供的是相关的接口,比如自己的算法识别到人脸区域后,将区域坐标传入视频控件自动绘制。
    7. 本系统适用于安防行业,所有录制视频也是针对摄像机的视频流,包括摄像机自身的rtsp格式视频流,摄像机重新推流的rtmp或者http的视频流,凡是源头不是摄像机的视频流一概不存储或者存储不成功,因为可能编码格式不一样。比如中央卫视、大雄兔等视频流是不存储的,因为源头不是摄像机。任何监控厂家的视频监控系统都是只存储监控摄像机的视频,其他一概不存储甚至添加都没法添加到系统中因为过滤掉了。
    8. 系统采用纯QtWidget(非qml)编写,解码采用ffmpeg,搜索采用onvif协议,视频播放采用rtsp协议,所有源码开放,并非有封装的库。
    9. 同时集成了数据库,多线程,串口通信,网络通信,音视频解码,网页地图、界面美化、UI布局等众多知识点。
    10. 未经本人许可不可将本项目源码扩散,如有发现本人将追究法律责任,谢谢配合。

    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.html
    7. 体验地址:https://pan.baidu.com/s/1d7TH_GEYl5nOecuNlWJJ7g 提取码:01jf 文件名:bin_video_system.zip。

    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. 可保存视频,可选定时存储或者单文件存储,可选存储间隔时间。
    24. 可设置视频流通信方式tcp+udp,可设置视频解码是速度优先、质量优先、均衡等。
    25. 可设置软件中文名称、英文名称、LOGO图标等。
    26. 存储的视频文件支持导出到指定目录,支持批量上传到服务器。

    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. 支持xp、win7、win10、linux、mac、各种国产系统(UOS、中标麒麟、银河麒麟等)、嵌入式linux等系统。
    17. 注释完整,项目结构清晰,超级详细完整的使用开发手册,精确到每个代码文件的功能说明,不断持续迭代版本。

    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. windows上Qt5.6以上的版本需要msvc编译器的版本才有,其余系统都会有。
    3. 如果没有则电子地图模块不可用,但是其余功能全部可用没有任何影响。
    4. 本人亲测4.7、4.8、5.5、5.6、5.7、5.9、5.12、5.13、5.14、5.15、6.1等。
    5. 2021-1-6开始集成了miniblink浏览器内核,意味着mingw版本的qt5.6以上版本也全部支持,这样就所有系统都有浏览器模块不需要担心没有电子地图的问题。
    6. 部分构建套件可能不支持预编译头,预编译头仅仅是为了加快编译速度,和程序本身无关。比如在win+Qt5.5 5.6就发现不支持,也可能是支持的不够全面,如果编译发生错误可以试着打开pro文件注释掉PRECOMPILED_HEADER = head.h 这行。
    7. 源码如果在嵌入式linux arm上编译,默认取消了视频监控内核ffmpeg,如果已经交叉编译好了对应arm的ffmpeg库,可以在pro中注释掉这个限制。 contains(QT_ARCH, arm) { DEFINES -= videoffmpeg }
    8. Qt6.2的mingw版本的multimedia模块不可用,msvc版本的正常。
    9. 推荐用64位的Qt搭配64位的ffmpeg,目前绝大部分系统都是64位的,能获得最大性能提升,本人亲自对比测试32位和64位,64位无论资源占用和操作响应等体验都更优。

    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_ffmpeg,在ffmpeg.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,解决办法详细见文档中其他说明。
    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/1d7TH_GEYl5nOecuNlWJJ7g 提取密码:01jf 文件名称:bin_map_tiles.zip

    使用说明

    1. 将压缩包下的两个文件夹复制到对应可执行文件下的config文件夹下,和map.js文件同一级目录。
    2. tiles文件夹是街道图,tiles_hybrid文件夹是卫星图。
    3. 默认提供的是上海市徐汇区的瓦片地图,如果自己用万能地图下载器下载的百度地图的瓦片文件,也可以对应替换就行。
    4. 要注意的是格式,默认是jpg,如果下载的瓦片地图格式是png则需要打开config文件夹下的map_load.js文件,将.jpg改成.png保存即可。

    0.7 视频格式

    0.7.1 USB摄像头

    1. 内核ffmpeg写法:video=USB2.0 PC CAMERA(具体要看设备名)。
    2. 内核vlc写法:dshow://:dshow-vdev=Default (或者填USB2.0 PC CAMERA)
    3. 带参数写法:2020-12-12以后增加USB摄像头直接url带分辨率帧率写法,默认分辨率640x480。

    写法举例

    1. video=USB2.0 PC CAMERA|1920x1080|30(表示1920*1080分辨率30帧)
    2. video=USB2.0 PC CAMERA|640x480(表示640*480分辨率)
    3. dshow://:dshow-vdev=USB2.0 PC CAMERA(表示打开视频设备USB2.0 PC CAMERA、其他参数全部默认)
    4. dshow://:dshow-vdev=USB2.0 PC CAMERA:dshow-adev=麦克风 (USB Audio Device):dshow-size=1920*1080:live-caching=300(表示打开视频设备USB2.0 PC CAMERA、打开音频设备麦克风 (USB Audio Device)、分辨率640x480、缓存时间300毫秒)

    0.7.2 网络地址

    1. 下面的地址有时候会失效,可以自行网上找找其他的地址,网络视频地址建议在晚上测试会更流畅。
    2. 大雄兔:rtsp://184.72.239.149/vod/mp4://BigBuckBunny_175k.mov
    3. 大雄兔:http://r.ossrs.net/live/bbb.flv
    4. 海康萤石:https://hls01open.ys7.com/openlive/6e0b2be040a943489ef0b9bb344b96b8.hd.m3u8
    5. 在线摄像机:http://vts.simba-cn.com:280/gb28181/21100000001320000002.m3u8
    6. 摄像机格式:https://blog.csdn.net/qq_38880380/article/details/80652697

    0.7.3 中央卫视

    1. 中央卫视1:rtmp://58.200.131.2:1935/livetv/cctv1
    2. 中央卫视2:rtmp://58.200.131.2:1935/livetv/cctv2
    3. 中央卫视3:rtmp://58.200.131.2:1935/livetv/cctv3
    4. 中央卫视4:rtmp://58.200.131.2:1935/livetv/cctv4
    5. 中央卫视5:rtmp://58.200.131.2:1935/livetv/cctv5
    6. 中央卫视6:rtmp://58.200.131.2:1935/livetv/cctv6
    7. 中央卫视7:rtmp://58.200.131.2:1935/livetv/cctv7
    8. 中央卫视8:rtmp://58.200.131.2:1935/livetv/cctv8
    9. 中央卫视9:rtmp://58.200.131.2:1935/livetv/cctv9
    10. 中央卫视10:rtmp://58.200.131.2:1935/livetv/cctv10

    0.7.4 视频文件

    1. http://vfx.mtime.cn/Video/2019/02/04/mp4/190204084208765161.mp4
    2. http://vfx.mtime.cn/Video/2019/03/19/mp4/190319212559089721.mp4
    3. http://vfx.mtime.cn/Video/2019/03/17/mp4/190317150237409904.mp4
    4. http://vfx.mtime.cn/Video/2019/03/14/mp4/190314223540373995.mp4

    0.7.5 网友提供

    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.8 版本说明

    0.8.1 精益求精

    0.8.2 破茧成蝶

    V20220106

    1. 彻底修复全屏模式+webengine同时存在的情况下鼠标右键菜单无法弹出以及视频可能黑屏的BUG,这是Qt的BUG。
    2. 同时测试多屏幕下正常状态和全屏状态的情况,多屏幕不同分辨率。
    3. 增加其他设置界面,将串口设置、网络设置等移动到其他设置。随着功能越来越多,也很有必要单独拆分设置。
    4. 修复打印预览看不到文字的BUG,原来是设置了QGraphicsView的前景色导致的,把前景色和背景色设置成一样的了,其实是有文字的,鬼想得到QPrintPreviewDialog里面的预览原来用的是QGraphicsView绘制的。
    5. 修复qchart图表控件鼠标按下松开后会跟随窗体移动的BUG,因为qchart鼠标按下是UngrabMouse事件而不是MouseButtonRelease。

    V20211220

    1. 重新梳理整个onvif模块,调整对应的结构,删除多余的变量和设置等,对应云台控制等操作需要指定profile,通过参数传入。
    2. 对应图片参数操作需要指定videosource,通过参数传入。
    3. 去除数据库字段mediaurl、ptzurl,因为这两个数据每次都是更新重新获取的,通过getServices获取,这两个字段改成了videosource、profiletoken,用来从数据库读取出来,每次使用的时候自动下发。
    4. 预置位表格中的按钮样式调整,去掉圆角,增加边距,效果更完美。
    5. 新增nvr多个通道onvif支持,改动onvif模块代码和数据库结构。
    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。