From 7dea99b1b092c202cccafbe81493b11020bba3fa Mon Sep 17 00:00:00 2001 From: feiyangqingyun Date: Mon, 4 Jul 2022 14:50:37 +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/bigscreen/index.html | 11 ++--- docs/video_system/index.html | 85 +++++++++++++++++++++++++++++++++++- 2 files changed, 87 insertions(+), 9 deletions(-) diff --git a/docs/bigscreen/index.html b/docs/bigscreen/index.html index 040eea5..1c4fb18 100644 --- a/docs/bigscreen/index.html +++ b/docs/bigscreen/index.html @@ -22,8 +22,6 @@ body.typora-export { padding-left: 30px; padding-right: 30px; } @media screen and (max-width: 500px) { body.typora-export { padding-left: 0px; padding-right: 0px; } #write { padding-left: 20px; padding-right: 20px; } - .CodeMirror-sizer { margin-left: 0px !important; } - .CodeMirror-gutters { display: none !important; } } #write li > figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } @@ -51,7 +49,7 @@ sup.md-footnote a, sup.md-footnote a:hover { color: inherit; text-transform: inh #write input[type="checkbox"] { cursor: pointer; width: inherit; height: inherit; } figure { overflow-x: auto; margin: 1.2em 0px; max-width: calc(100% + 16px); padding: 0px; } figure > table { margin: 0px; } -tr { break-inside: avoid; break-after: auto; } +thead, tr { break-inside: avoid; break-after: auto; } thead { display: table-header-group; } table { border-collapse: collapse; border-spacing: 0px; width: 100%; overflow: auto; break-inside: auto; text-align: left; } table.md-table td { min-width: 32px; } @@ -73,6 +71,7 @@ div.hr:focus { cursor: none; } #write.fences-no-line-wrapping .md-fences.mock-cm { white-space: pre; overflow-x: auto; } .md-fences.mock-cm.md-fences-with-lineno { padding-left: 8px; } .CodeMirror-line, twitterwidget { break-inside: avoid; } +svg { break-inside: avoid; } .footnotes { opacity: 0.8; font-size: 0.9rem; margin-top: 1em; margin-bottom: 1em; } .footnotes + .footnotes { margin-top: 0px; } .md-reset { margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: top; background: 0px 0px; text-decoration: none; text-shadow: none; float: none; position: static; width: auto; height: auto; white-space: nowrap; cursor: inherit; -webkit-tap-highlight-color: transparent; line-height: normal; font-weight: 400; text-align: left; box-sizing: content-box; direction: ltr; } @@ -87,7 +86,7 @@ blockquote > :first-child, li > :first-child { margin-top: 0px; } #write .footnote-line { white-space: pre-wrap; } @media print { body, html { border: 1px solid transparent; height: 99%; break-after: avoid; break-before: avoid; font-variant-ligatures: no-common-ligatures; } - #write { margin-top: 0px; padding-top: 0px; border-color: transparent !important; } + #write { margin-top: 0px; padding-top: 0px; border-color: transparent !important; padding-bottom: 0px !important; } .typora-export * { -webkit-print-color-adjust: exact; } .typora-export #write { break-after: avoid; } .typora-export #write::after { height: 0px; } @@ -130,6 +129,7 @@ p > .md-image:only-child { display: inline-block; width: 100%; } } a.md-toc-inner { font-size: inherit; font-style: inherit; font-weight: inherit; line-height: inherit; } .footnote-line a:not(.reversefootnote) { color: inherit; } +.reversefootnote { font-family: ui-monospace, sans-serif; } .md-attr { display: none; } .md-fn-count::after { content: "."; } code, pre, samp, tt { font-family: var(--monospace); } @@ -538,11 +538,8 @@ code { html { font-size: 13px; } - table, pre { page-break-inside: avoid; - } - pre { word-wrap: break-word; } } diff --git a/docs/video_system/index.html b/docs/video_system/index.html index a393652..6d32559 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; @@ -594,7 +675,7 @@ header, .context-menu, .megamenu-content, footer{ contains(QT_ARCH, arm) { DEFINES -= videoffmpeg }
  • Qt6.2的mingw版本的multimedia模块不可用,msvc版本的正常。
  • 推荐用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/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 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 视频文件

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

    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.7.6 监控设备

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

    0.7.6.1 海康
    0.7.6.2 大华
    0.7.6.3 常规

    0.8 版本说明

    0.8.1 精益求精

    0.8.2 破茧成蝶

    V20220625

    1. 在之前支持NVR所有通道批量添加基础上,增加自动添加NVR信息到表,这样每个NVR都会自动添加,如果有手动添加好的则取添加好的,以IP地址为准。
    2. 修复设备在线状态处理,在同一个NVR下IP地址相同的不同通道视频,不会处理在线状态的BUG。
    3. 修复在postgresql数据库和oracle数据库下,QSqlTableModel对应setTable设置表名严格区分大小写的BUG。

    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模块代码和数据库结构。
    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。

    10.1 windows-mingw

    10.2 windows-msvc

    10.3 linux-ubuntu

    10.4 linux-fedora

    10.5 linux-centos

    10.6 linux-uos

    10.7 linux-kylin

    10.8 linux-neokylin

    10.9 linux-newstart

    10.10 unix-mac

    11 程序框架说明

    备注:下面的截图和说明未必是最新的,但是大部分是一致的,整体的框架不会改变,可能会有新增加子模块和代码,或者部分类文件有调整或者删除,具体以最新的代码为准。

    11.1 整体代码结构

    本系统采用模块化的设备,有用到第三方开源类库比如串口通信qextserialport,全部放在3rd下面,有用到很多自己封装完善的通用类库比如ffmpeg视频监控,全部放在core下面,设备通信和辅助处理全部放在class下面,所有界面全部放在ui下面,相当于一个个小的组件合起来,最终形成了整个监控系统的完整代码。

    11.2 主模块说明

    名称说明
    3rd一些第三方开源的类库,比如串口通信qextserialport。
    class存放系统初始化、样式控制、自定义控件、设备通信等。
    core本人一直持续更新完善的通用的类库,比如ffmpeg视频监控。
    ui所有的界面都分门别类放在这里。

    11.3 子模块说明

    11.3.1 第三方类库

    这里放的全部是第三方开源的轮子,感谢开源、感谢github、gitee等开源社区。

    名称说明
    3rd_qextserialport第三方串口通信qextserialport,这个类比较稳定可靠,经过了几十个项目持续数十年运行的考验,不用Qt自带的串口类。

    具体代码不做过多说明。

    11.3.2 通信及辅助类

    这里放的都是一些系统初始化、设备通信相关的类。

    名称说明
    api存放数据库表映射成对应的全局队列数据、通用的辅助函数类。
    app全局配置参数管理类、秘钥管理类、通用函数。
    devicecustom用户自定义设备通信管理,比如机器人通信、无人机通信等。
    devicevideo视频监控相关处理类,包括设备地图、表格消息、线程UI通信、人工智能处理等。
    usercontrol当前系统的自定义控件全部放在这里,其中包括云台仪表盘、天气面板等控件。
    11.3.2.1 模块-api
    名称说明
    dbdata将数据库表映射到全局变量数据队列,比如将摄像机表ipcinfo转成QStringList存放一行行数据,这样在程序中运算比较速度极快,直接内存比较,不用每次都去读取数据库。
    dbquery所有的数据库查询插入更新等操作都在这里,比如查询摄像机表、插入日志记录等。
    11.3.2.2 模块-app
    名称说明
    appconfig配置参数类,整个系统的配置参数存放在ini文件中,跨平台,所有参数都对应一个变量,读取配置参数的时候将值赋值给变量,写入的时候将变量值写入到配置文件。
    appdata全局变量类,系统中无可避免需要一些全局变量方便处理,都放在此类,比如版本号、录像机类型、摄像机类型、当前用户信息、地图宽度高度、左侧右侧顶部底部宽高等。
    appevent全局事件转发类,系统越复杂信号需要传递的层级越多,所以需要一个全局事件转发类,用来中转这些事件,这样永远只需要两层就可以收到信号进行处理,而且整个系统看起来干净整洁,不会说一个信号传递到了N个地方乱七八糟,建议需要跨层级传递的信号都放在这里中转。比如软件退出信号,可能多个界面需要收到退出信号进行保存和其他处理,如果从关闭界面发出信号传递给需要的界面,那不知道要中间层层传递多少次,有了这个全局事件转发类,你只需要将事件传给appevent,需要接收事件的地方关联这个信号就行,appevent为全局单例类,整个系统唯一。通用的一些信号有软件退出、全局样式改变、主窗体变化(0-最小化 1-最大化 2-恢复 3-关闭 4-移动 5-尺寸变化)等。
    appinit程序初始化类,在main函数中,会先执行这个初始化的类,比如初始化皮肤、字体、数据库、样式等操作,这些都是要优先在窗体加载前执行的,执行完毕以后再打开窗体主界面。
    appstyle全局样式管理类,整个系统的样式全部放在这里,一般加载流程是先读取样式表文件,然后将本系统独特的样式(比如开关按钮、视频监控、云台仪表盘)内容追加到后面,最后统一设置全局样式,在main函数中加载,和appinit类一样放在最前面执行。
    appurl视频监控系统中常用的默认的视频地址集合。
    11.3.2.3 模块-devicecustom
    名称说明
    devicerobot机器人串口通信管理类。
    devicerobot2机器人串口通信管理类2,有串口数据转发功能。
    deviceuavsserver无人机后端服务类,当前为空,用户自己添加。
    deviceuavsvideo无人机视频监控类,将视频控件设置过来,然后就可以将自己人工智能算法处理后的图片传过来进行绘制,类似于实时视频效果。
    11.3.2.4 模块-devicevideo
    名称说明
    devicehelper整个系统设备管理辅助类,比如插入窗口消息、加载设备列表、加载图片地图、加载设备按钮、初始化视频控件等。
    devicemap设备图片地图管理类,相当于一次性加载所有图片到内存,当要切换或者显示的时候,直接从内存取出来设置即可,速度极快,瞬间相应,纯粹是为了加快相应速度以及可能在图片上进行绘制增加的功能,比从文件系统读取图片文件显示快N倍。
    deviceonvif设备onvif通信管理类,比如获取当前选中通道的onvif地址、开启事件订阅、校对时间、重启设备、获取视频参数、设置视频参数、云台控制等,这里是具体的需要和摄像机信息表及视频通道关联的处理,所以不能放到通用的onvif模块中。
    devicethreadui演示线程通知UI更新,包括每隔一段时间插入消息、异步调用添加表格消息和图文警情、设备GPS移动、报警闪烁、指定通道编号设置视频和通道交换等。
    devicevideosmart人工智能处理类,最常见的应用就是设置一个视频控件,然后在视频控件上绘制人脸框、文字信息等,比如设备的实时运行状态。
    11.3.2.5 模块-usercontrol
    名称说明
    gaugecloud云台仪表盘控件。
    cityhelper省市县联动类,通过从json文件读取省市县信息。
    weather城市天气类,最后显示在标题栏上,实时显示设置的城市的最近几天的天气。
    widgetsound声音面板控件,主界面右下角单击弹出音量条。

    11.3.3 核心通用类库

    这里放的全部是个人一直持续更新完善的独创的轮子,所有的项目都公用这些轮子,用到哪个就包含哪个进来,更新只需要更新轮子代码就行。

    视频监控系统包含的轮子超级丰富给力,物超所值,涵盖了数据导出模块、数据库应用、视频监控、ONVIF通信、TCP文件传输、地图应用、通用浏览器内核等。

    名称说明
    core_common通用函数,包括通用秘钥、通用导航、通用样式、声音播放、日志记录、运行时间记录等。
    core_control通用自定义控件,很多系统经常用到的控件全部放在这里,比如开关按钮、设备容器、设备按钮、颜色下拉框等。
    core_dataout数据导入导出到xls/pdf和打印类库,极速、跨平台、无依赖。
    core_db数据库通用类库比如数据库线程管理、数据清理、数据采集等。
    core_ffmpeg视频监控内核ffmpeg版本,本系统默认采用的内核。
    core_vlc视频监控内核vlc版本,本系统自带该内核。
    core_mpv视频监控内核mpv版本,需要额外购买,不在视频监控系统中。
    core_haikang视频监控内核海康sdk版本,需要额外购买,不在视频监控系统中。
    core_map地图综合应用类库,百度地图(支持在线离线)和echart封装类等。
    core_onvifonvif功能封装类,包括设备搜索、云台控制、设备参数设置等。
    core_openglopengl封装类,支持打开yuv/nv12文件,绘制yuv/nv12帧数据,一般搭配ffmpeg视频内核视频,直接走GPU绘制。
    core_qui通用的辅助类,包括自定义对话框,全局辅助函数,图形字体等。
    core_tcpfile文件多线程收发类,支持多个并发。
    core_video通用的视频监控管理类,封装了通用的视频控件和多通道统一管理。
    core_webview通用浏览器控件类,同时支持webkit、wenengine、miniblink三种内核,打通了所有的Qt版本。
    11.3.3.1 模块-core_common
    名称说明
    base64helper图片及文字和base64编码之间转换的类。
    commonkey通用秘钥管理类,指定校验秘钥文件,可设置运行时间、设备数量等限制,支持根据硬件指纹特征生成机器码文件等。
    commonnav通用菜单导航管理类,用来控制和显示顶部导航栏、左侧导航栏的样式。很多子界面需要用到,所以封装成一个专门管理这个的类。
    commonstyle通用样式管理类,比如Qt自带类窗体样式、自定义控件样式、分页导航样式、导航按钮样式、开关按钮样式等。相当于将多个项目常用的自定义样式封装一起做成通用。
    framelesswidget2无边框窗体拉伸类,边框四周八个方位都可以自由拉伸,可设置是否允许拖动和拉伸。
    playwav声音文件播放类,通用Qt456,自动识别当前Qt版本使用对应的类,Qt4采用QSound,Qt5以上采用QSoundEffect,嵌入式采用对应的命令行aplay、mpv来播放。
    savelog日志钩子类,将系统中所有的打印信息转为日志存储或者输出到网络等,可以开启用来打印输出日志信息。
    saveruntime保存运行时间类,用来存储系统启动后每隔一段时间就输出一条记录用来记录启动后软件运行了多久,方便分析问题。
    11.3.3.2 模块-core_control
    名称说明
    bottomwidget通用底部状态栏控件,可以设置软件名称、版本号、运行时间等。
    colorcombobox颜色下拉框控件,在系统设置中有。
    cpumemorylabelCPU和内存使用情况标签控件,主界面右上角显示。
    customtitlebar停靠窗体自定义标题栏控件。
    devicebutton设备按钮控件,比如图片地图模块中用到,可设置不同的图标样式和状态等,双击发出信号进行相应处理比如弹出对应窗体等。
    lcddatetime软件右上角显示时间的控件。
    panelwidget面板容器控件,主界面子模块表格消息,就用到此控件,用于将一堆widget放到此容器进行管理,自动形成滚动条等。
    switchbutton开关按钮控件,在系统设置中存在大量该控件。
    xslider滑动条控件,在原有滑动条基础上增加了鼠标按下立即定位等。
    11.3.3.3 模块-core_dataout
    名称说明
    datacreat通用数据报表内容创建类,比如生成表格格式的html内容,然后赋值给dataprint直接打印,里面举例了图文混排的报告内容,后期会不断增加其他模板,也可以自行增加其他模板数据。
    datacsv导入导出数据,csv格式,可设置分隔符。拓展名。过滤条件等。
    datahead当前组件通用头文件。
    datahelper辅助类,比如校验规则函数,通用数据导出+打印函数。
    dataprint数据打印到pdf及纸张,支持多线程。
    dataxls数据导出到xls类,支持多线程导出。
    11.3.3.4 模块-core_db
    名称说明
    dbcleanthread自动清理数据线程类。
    dbconnthread数据库通信管理线程类。
    dbdelegate自定义委托全家桶,包括复选框、下拉框、密码框、按钮等。
    dbhead当前组件通用头文件。
    dbhelper各种数据库应用函数封装,比如初始化数据库、执行sql语句等。
    dbhttpthread网络请求数据采集类。
    dbpage数据库通用翻页类。
    dbpagemodel数据库翻页类数据模型。
    navpage分页导航控件。
    11.3.3.5 模块-core_ffmpeg
    名称说明
    ffmpegconvert各种转换处理函数封装。
    ffmpeghead当前组件通用头文件。
    ffmpeghelper辅助类,包括版本号,校验url地址、获取流索引等。
    ffmpegsync音视频同步类,包括了同步以及发出当前播放进度信号。
    ffmpegthread核心解码类,主要代码都在这,包括音视频的解码。
    ffmpegtool工具类,用于执行ffmpeg的命令获取结果。
    ffmpegwidget视频显示窗体类,解码后到这里显示,依赖ffmpegthread。
    videoffmpeg多通道管理类。
    11.3.3.6 模块-core_map
    名称说明
    echartjsechart模块中用到的json文件转js文件,获取js文件中的名字和经纬度等处理。
    echartsechart封装类,可加载仪表盘、闪烁点图、迁徙图、世界地图、区域地图等,每个点可自定义颜色和提示信息等。
    mapbaidu百度地图封装类,支持在线和离线两种模式。
    11.3.3.7 模块-core_onvif
    名称说明
    onvifbase基础类,用于获取设备信息、服务文件地址、能力文件地址、媒体文件地址、视频流地址等。
    onvifdevice设备类,核心处理及管理,包括设置用户信息请求onvif地址、获取设备信息、云台控制、事件订阅、抓拍图片等。
    onvifevent事件订阅具体实现类,可设置请求超时时间等。
    onvifhead当前组件通用头文件。
    onvifhelper辅助类,比如获取UUID用于请求、判断IP合法、获取本机IP地址集合、管理系统中所有onvif设备对象等。
    onvifmedia获取媒体文件具体解析类。
    onvifother其他处理类,比如系统重启、NTP校时、获取和设置网络信息、获取和设备时间、获取和设置图片参数等。
    onvifptz云台控制实现类,包括绝对移动、相对移动等。
    onvifquery数据查询类,用于将接收到的xml数据解析,并赋值字符串比如命名空间、设备地址、媒体地址、事件地址等。
    onvifrequest网络请求类,包括设置用户信息、获取用户token数据、获取xml头部数据等,通用的请求数据返回结果函数。
    onvifsearch设备搜索类,支持广播搜索、指定地址搜索,可获取设备信息集合、获取设备地址集合。
    onvifservices服务类,用于获取媒体地址、云台地址等。
    onvifsnap图片抓拍实现类,包括获取抓图地址、抓拍图片等。
    11.3.3.8 模块-core_opengl
    名称说明
    openglhead当前组件通用头文件。
    nv12glwidget继承自QGLWidget的NV12格式OPENGL绘制窗体。
    nv12openglwidget继承自QOpenGLWidget的NV12格式OPENGL绘制窗体。
    yuvglwidget继承自QGLWidget的YUV格式OPENGL绘制窗体。
    yuvopenglwidget继承自QOpenGLWidget的YUV格式OPENGL绘制窗体。
    11.3.3.9 模块-core_form
    名称说明
    formhelper封装的导入导出、导出数据到xls/pdf和打印数据、自动备份数据、保存最后打开的文件夹等。
    frmconfigdb通用数据库管理界面类,可选不同的数据库类型,填入用户信息,执行检测连接和初始化数据操作。
    frmconfiguser通用用户管理界面类,可添加、删除、修改用户信息,包括权限分配等,可导入导出打印用户信息。
    frmlogin通用用户登录界面类,包括自动登录和记住密码复选框,多次密码错误校验,记住当前用户信息等。三次错误关闭,下拉可选用户,内置超级密码。
    frmlogout通用用户退出界面类,三次错误关闭,下拉可选用户,内置超级密码。
    userhelper通用用户权限管理类,内置7种类型权限,对应权限名称可自定义,一般在用户切换对应界面或者单击了对应功能按钮的时候触发。
    11.3.3.10 模块-core_qui

    本组件涵盖的功能较多,所以采用了分层管理代码结构。

    名称说明
    iconhelper万能图形字体类,可传入多种图形字体文件,一个类通用所有图形字体。
    quiconfig存储当前组件的配置参数信息,比如全局的字体名称、字号、无边框窗体的最小化最大化关闭等图标、样式表的颜色值。
    quihead当前组件通用头文件。
    quistyle当前组件通用样式设置管理类,可以指定枚举类型样式、传入样式内容设置、获取样式表文件对应的颜色值等。当前组件样式相关的处理函数都放在这里,统一管理。
    名称说明
    quiabout关于系统对话框,可传入软件标题、版本、版权、网址等信息。
    quidateselect自定义日期范围选择对话框。
    quiinputbox自定义输入框窗体,可指定不同的输入类型比如文本框、下拉框等。
    quimessagebox自定义信息消息框窗体,可设置关闭倒计时,不同的类型比如信息框、询问框、错误框等。
    quisplash自定义弹出提示信息,提示完自动消息关闭。
    quitipbox自定义右下角信息对话框,可设置对齐方式、关闭倒计时等。
    quiwidget自定义无边框窗体,可设置标题,各种图标等。
    名称说明
    quihelper项目通用辅助类,各种常用函数的封装,比如获取当前屏幕分辨率、设置字体、设置编码、加载翻译文件、各种进制数据转换、弹出各种对话框、设置延时时间等。
    quihelpercore获取当前桌面分辨率,设置编码、字体、翻译文件等。
    quihelperdata16进制、2进制、10进制互相转换,16进制字符串、字节数组互相转换,字节数组转int和short,CRC校验等。
    quihelperfile选择文件、保存文件、选择目录等对话框,复制文件、删除文件等。
    quihelperform设置无边框窗体、边框阴影,弹出信息框、错误框、询问框、日期选择框、关于对话框、中间提示框等。
    quihelperimage获取等比例缩放图片,通用设置logo图片,支持资源文件、本地图片、图形字体、svg自动变色等多种形式。
    quihelpernet获取本机IP地址集合,获取外网IP地址,判断IP、MAC等是否合法,下载网络文件,IP地址字符串与整型互相转换。
    quihelperother初始化数据库文件,设置系统时间、开机启动,设置图标到按钮,写入临时消息的文本文件等。
    11.3.3.11 模块-core_tcpfile
    名称说明
    tcpfilehead当前组件通用头文件。
    tcpfilehelper辅助类,包括将字节转为MB单位、初始化表格控件、生成表格行、数据加密解密、解压文件、重启系统等。
    tcpreceivefileserver接收文件服务类,管理多个接收文件线程,支持监听端口被动接收文件和主动连接服务器接收文件。
    tcpreceivefilethread接收文件线程类,根据发送的文件名、包编号、块大小、挨个接收数据最终形成文件,可设置保存文件夹等。
    tcpsearchfileserver搜索文件服务类,目前没用,用于接收请求搜索文件是否存在。
    tcpsendfilethread发送文件线程类,按照 文件开始符+文件大小+文件内容+文件结束符 逐个分包发送,可对文件的每个包进行加密传输。
    11.3.3.12 模块-core_video
    名称说明
    commonvideomanage通用视频管理类,比如定时器排队打开视频、排队重连视频,可设置超时时间、打开间隔、重连间隔等。
    commonvideowidget通用视频控件类,视频监控系统支持多种内核,每种内核对应的视频控件接口一样,根据预定义关键字识别具体的视频控件类,搞个通用的视频控件类,就不用每个用到该控件的代码文件去挨个判断预定义变量生成对应的视频控件,很大减少重复冗余代码量。
    11.3.3.13 模块-core_webview
    名称说明
    webcore.pri通用的根据不同的Qt版本、不同的编译器环境、不同的操作系统,加载对应的浏览器内核模块和定义不同的变量。
    miniblinkminiblink封装处理类。
    webhelper经纬度转换、获取小数点经纬度值等常用处理函数。
    webjsdata通用的浏览器控件和Qt程序交互数据中转类。
    webview通用浏览器控件,支持webkit、webengine、miniblink。

    11.3.4 界面UI

    界面说明

    名称说明
    frmconfig系统设置模块,包括基本设置、录像机管理、摄像机管理、轮询管理、用户管理、视频上传等。
    frmdata日志查询模块,包括本地日志、设备日志等。
    frmdemo演示demo示例,用于演示具体控件或者功能的使用,方便学习参考,比如视频图片、视频控件、视频存储都单独的使用demo。
    frmipc存放摄像机处理相关的模块,比如设备控制,云台控制、预置位、巡航设置等。之前放在frmmodule模块中,后面独立出来管理更方便。
    frmmain主界面模块,包括登录登出界面、主界面、右上角时间组件、欢迎组件等。
    frmmap地图模块,包括通用地图内核界面、图片地图、在线地图、离线地图、路径规划等。
    frmmodule停靠子窗体模块,包括停靠窗体管理核心类、设备列表、窗口信息、图文警情、设备轨迹、网页浏览等模块。将摄像机、机器人、无人机相关的模块放到了对应的模块文件夹,这里放的是系统通用的模块。
    frmrobot无人机模块,包括图像增强、飞行监控等模块。
    frmuavs无人机模块,包括图像增强、飞行监控等模块。
    frmvideo视频监控模块,所有视频监控相关的都放在这里,包括主界面的视频监控布局窗体、视频回放、远程回放、图片回放等。
    11.3.4.1 模块-frmconfig
    名称说明
    frmconfig系统设置模块主界面,采用堆栈窗体形式,加载多个子界面比如摄像机管理、轮询管理等。
    frmconfigipc摄像机管理,可以增加、删除、修改、清空、导入、导出、打印摄像机信息。
    frmconfigipcsearchonvif设备搜索,独立出来的窗体,可以搜索局域网内的所有onvif摄像机信息,搜索完以后获取摄像机的视频流地址等,最后可以单个添加或者批量选中添加到摄像机信息表格中。
    frmconfignvr录像机管理,可以增加、删除、修改、清空、导入、导出、打印录像机信息。
    frmconfigpoll轮询管理,可以增加、删除、修改、清空、导入、导出、打印轮询点信息。可以按照设定规则批量生成轮询点信息。
    frmconfigpollplus将轮询管理中的轮询参数配置、分组管理、批量添加等独立出来的界面,方便管理和拓展。
    frmconfigsave录像计划,目前空的,等想好了怎么设计好在实现。
    frmconfigsystem系统设置,包括基本设置、视频参数、数据库设置、地图配置、功能激活、颜色配置、串口配置、网络配置等。
    11.3.4.2 模块-frmdata
    名称说明
    frmdata日志查询模块主界面,采用堆栈窗体形式,加载多个子界面包括本地日志、设备日志等。
    frmdatadevice设备日志,通过私有协议从NVR取对应设备日志信息。
    frmdatauser本地地址,用户操作的日志信息,可查询和导出打印数据记录。
    11.3.4.3 模块-frmdemo
    名称说明
    frmdemo单独的功能演示示例主窗体,加载多个子界面比如视频控件等。
    frmdemoqui通用辅助示例,主要演示qui通用组件中封装的函数如何使用,比如各种消息框、提示框等。
    frmdemovideoimage视频图片示例,从图片文件夹读取图片集合,定时器绘制取出图片发给视频控件绘制。
    frmdemovideoplus视频叠加示例,多个视频控件叠加在一起同时播放,可以设置在四个角落位置。
    frmdemovideosave视频保存示例,演示如何对视频控件进行视频保存,可动态保存。
    frmdemovideowidget视频控件示例,演示视频控件如何使用。
    11.3.4.4 模块-frmipc
    名称说明
    frmipccontrol设备控制模块,可对选中设备进行图片参数调节、NTP校时、设备重启、抓拍图片(ONVIF抓图)等。
    frmipcnavigate巡航管理模块,暂未实现,后期完善。
    frmipcreset预置位管理模块,暂未实现,后期完善。
    frmipcptz云台控制模块,可对选中的摄像机进行云台控制。
    11.3.4.5 模块-frmmain
    名称说明
    frmmain系统主界面,采用堆栈窗体,加载各个子模块。
    frmmain1备用模块1界面,根据参数设置决定是否启用。
    frmtimecpu右上角日期时间+CPU内存显示。
    frmwelcome右上角欢迎信息界面。
    11.3.4.6 模块-frmmap
    名称说明
    frmmap地图管理主界面,采用堆栈窗体形式,加载各个子界面比如图片地图、在线地图、离线地图、路径规划等。
    frmmapcore通用百度地图内核界面,用来加载百度地图,可设置在线、离线模式,有很多个窗体用到类似功能特意封装到一个类,重复利用,比如悬浮地图、飞行轨迹、路径规划等模块都用到了此内核。
    frmmapdevice通用的设备地图界面,在线地图和离线地图界面公用这个界面,唯一区别就是设置下地图的模式是在线还是离线。
    frmmapimage图片地图界面,设备作为一个个按钮点显示在对应地图上,可以拖动,双击弹出预览实时视频。
    frmmaplocal离线地图界面,可更新经纬度值、模拟运动轨迹等。
    frmmapweb在线地图界面,可更新经纬度值、模拟运动轨迹等。
    frmmaproute路径规划界面,可查询路线得到路线的经纬度坐标集合。
    11.3.4.7 模块-frmmodule
    名称说明
    frmdevicegps设备轨迹模块,对设定的设备随机模拟轨迹,也可传入经纬度坐标值自动移动并绘制轨迹线条,不同设备可以不同颜色。
    frmdevicetree设备列表模块,读取设备信息加载形成树状列表,双击或者拖动到视频监控窗体直接播放视频,提供右键菜单作为演示如何使用。
    frmmodule主界面中心部分窗体,采用QMainWindow类,中间加载的视频监控面板,其余new出来每个子模块,子模块可停靠和悬浮拖动等。不同工作模式下的各种子模块都在此加载。同时负责管理模块的显示隐藏菜单。
    frmmsglist图文警情模块,也叫消息列表模块,带有右键菜单添加、删除、清空列表中的消息,双击可以弹出大图预览。
    frmmsglistitem图文警情模块子类,都是由一个个item组成放到panelwidget面板控件中,自动形成滚动条。
    frmmsgtable窗口消息模块,也叫表格消息模块,表格形式显示打印信息,不同的内容可以不同颜色区分。
    frmwebview网页浏览模块,传入一个url地址打开对应的网页,比如打开一个3D的网页。
    11.3.4.8 模块-frmrobot
    名称说明
    frmrobotdata仿真数据模块,启动机器人通信服务,接收数据解析显示。
    frmrobotdebug数据调试模块,可模拟发送轨迹数据测试解析类。
    frmrobotdebug2新数据调试模块,打印多个串口数据,不同颜色显示。
    frmrobotemulate运动仿真模块,预留给用户实现,一般放个3D效果。
    frmrobotlog机器人实时数据模块,预留给用户实现。
    11.3.4.9 模块-frmvideo
    名称说明
    frmvideo视频回放模块主界面,堆栈窗体形式,加载多个子界面比如本地回放、远程回放、设备播放等。
    frmvideopanel视频监控面板,主界面中间部分,这是核心,管理多个通道,通道可移除删除,拖曳打开,拖曳交换等。
    frmvideopaneltool视频监控底部工具栏,独立出来一个类专门管理。
    frmvideoplayimage图片回放模块,按照规则查询图片目录,然后可设定播放速度进行图片序列播放。
    frmvideoplaylocal本地回放模块,查询对应通道的本地存储的视频文件,双击播放,可暂停和拖动进度条位置。
    frmvideoplaynvr设备播放模块,通过RTSP视频流的形式从远程设备取视频进行播放,支持摄像机和录像机,手动填入地址也行。
    frmvideoplayweb远程回放模块,需要用厂家sdk去实现,从NVR回放录像。
    frmvideopreview视频预览窗体,比如图片或者地图上双击设备弹出的视频预览,可以多个,关闭的时候自动释放资源。
    frmvideoupload视频上传,将本地存储的视频文件上传到服务器。

    12 二次开发说明

    12.1 通用开发环境搭建

    1. 第一步:安装系统,推荐用vmware虚拟机。
    2. 第二步:安装qt环境,可以直接用官方下载的run安装包安装,有些要求用命令行安装。
    3. 第三步:写个空白窗体程序测试下是否环境正常。
    4. 第四步:编译ffmpeg,生成对应的动态库或者静态库。
    5. 第五步:打开video_system.pro项目进行编译。
    6. 第六步:打包发布,为了发布方便,推荐用静态编译的Qt+静态编译的ffmpeg,这样打包发布很清爽,就一个可执行文件。

    12.2 不同系统注意事项

    12.3 监控系统组件示例

    本系统功能比较多,封装了多个控件,尤其是核心的视频监控控件,所以特意安排了独立的使用示例演示如何使用,可以在main函数找到 AppConfig::IndexStart = 0; 改成AppConfig::IndexStart = 1;即可,这样编译运行的是监控系统组件示例。

    12.3.1 通用辅助

    演示通用组件比如qui封装的类的使用。

    12.3.2 视频图片

    演示加载图片文件夹,进行图片序列的播放。

    12.3.3 视频控件

    演示通用视频控件如何使用,包括打开、关闭、暂停、继续、截图、自动抓拍等功能。

    12.3.4 视频存储

    演示视频控件如何存储视频文件到本地,单击开始按钮开始存储视频,单击关闭则关闭存储。

    12.3.5 视频叠加

    演示如何用多个视频控件做视频叠加播放,可以设置叠加的位置在四个角落。

    12.4 人工智能集成

    13 其他说明

    13.1 海康onvif设置

    新版的海康的摄像机,默认onvif是关闭的,需要手动开启,开启以后记得添加onvif用户,并重启摄像机应用。提示:海康旗下的萤石目前暂时不支持onvif协议。

    13.2 大华onvif设置

    大华摄像机,需要在用户管理中添加onvif用户,添加好以后建议重启摄像机应用。

    13.3 国际onvif工具

    工具的名字叫ONVIF Device Manager,可以自行搜索下载,此工具位国际官方工具,如果此工具搜索不到摄像机,则说明该摄像机不是真正的onvif摄像机,不是标准的摄像机,目前市面上的绝大部分网络摄像机都支持onvif。具体用法可以参考 https://www.cnblogs.com/lsdb/p/9157302.html

    现在大部分厂家的NVR也逐渐支持onvif,并将每个通道都可以单独列出来。

    13.4 报警输入设置

    操作说明

    13.5 环境使用qt+vs

    打开项目:QT VS TOOLS – Open Qt Project File 选择 video_system.pro,然后等待项目加载完毕。