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 }
使用说明
写法举例

万能办法,用谷歌或者谷歌内核的浏览器,打开时光网http://www.mtime.com/ ,随便打开个视频,这里一般是预告片,按F12切换到审查元素,顶部切换到网络,选中媒体,刷新网页,按照尺寸排列,最大的那个MP4文件就是,鼠标右键复制地址,这个地址就是完整的网络地址。
下面列出的是一些常用厂家的格式,不同厂家格式不一样,具体什么格式请咨询厂家索要对应的视频流格式,或者设备支持onvif的话,通过onvif工具搜索可以拿到视频流格式。
V20220625
V20220612
V20220515
V20220413
V20220106
V20211220
V20211205
x1void QUIStyle::getStyle(QStringList &styleNames, QStringList &styleFiles)2{3 static QStringList names;4 if (names.count() == 0) {5 names << "黑蓝色" << "软件黑" << "视频黑";6 names << "深黑色" << "深蓝色" << "深灰色";7 names << "扁平黑" << "扁平蓝" << "扁平灰";8 names << "浅黑色" << "浅蓝色" << "浅灰色";9 names << "普通黑" << "普通蓝" << "普通灰";10 names << "大蓝色" << "大紫色" << "大银色";11 }12
+https://pan.baidu.com/s/13LDRu6mXC6gaADtrGprNVA 提取码: ujm7。如果是64位的qt则对应的dll时候拷贝dll_ffmpeg4_64目录下的。 如果使用的ffmpeg3则对应dll目录就是dll_ffmpeg,在ffmpeg.pri文件中可以看到具体启用的是ffmpeg3(支持XP)还是ffmpeg4(不支持XP),默认是ffmpeg4。 如果编译运行提示miniblink文件不存在请先拷贝,则说明你当前用的Qt版本没有浏览器模块,要么没安装,要么不支持,你也不用担心啥,此时自动切换用的miniblink浏览器内核,你还需要将ffmpeg库下载的网盘的地方找到dll_miniblink.zip下载解压到可执行文件同一目录即可。 系统中所有的图标,都采用的图形字体,对照表在doc目录下的FontAwesome.png、FontAliBaBa.png,对应图形字体类IconHelper中加载的图形字体,后期如果还有增加的其他图形字体也是放在这里,一个类支持多种图形字体,通过不同的值范围自动设置。 如果发现地图打不开或者提示秘钥文件丢失,请先确认file目录下的所有文件有没有拷贝过去。 如果是用vs+qt可能报错 error LNK2026,解决办法详细见文档中其他说明。 默认用户名admin 密码admin。 系统配置参数在加载的时候会对节点值进行过滤判断,如果为空会自动用初始值生成新的配置文件,如果不想要显示版权所有公司,可以填xxx而不是删掉整个值。 如果是用vlc推流的rtsp地址,比如 rtsp://:8554/aabb,由于vlc推流默认写死的采用的udp协议,所以监控系统也必须在系统设置中通信方式选择udp才行(默认tcp)。 0.6.3 离线地图
- 离线地图可以用网上的瓦片地图下载器下载百度的离线地图放到对应目录即可。
- 也可以直接下载网盘中已经下载好的上海市的离线地图。
- 下载地址:https://pan.baidu.com/s/1ZxG-oyUKe286LPMPxOrO2A 提取码:o05q 文件名称:bin_map_tiles.tar.xz
使用说明
- 将压缩包下的两个文件夹复制到对应可执行文件下的config文件夹下,和map.js文件同一级目录。
- tiles文件夹是街道图,tiles_hybrid文件夹是卫星图,tiles_self是路网图,路网图和卫星图合并就是混合图。
- 默认提供的是上海市徐汇区的瓦片地图,如果自己用万能地图下载器下载的百度地图的瓦片文件,也可以对应替换就行。
- 要注意的是格式,默认是jpg,如果下载的瓦片地图格式是png则需要打开config文件夹下的map_load.js文件,将.jpg改成.png保存即可。
0.7 视频格式
0.7.1 USB摄像头
- 内核ffmpeg写法:video=USB2.0 PC CAMERA(具体要看设备名)。
- 内核vlc写法:dshow://:dshow-vdev=Default (或者填USB2.0 PC CAMERA)
- 带参数写法:2020-12-12以后增加USB摄像头直接url带分辨率帧率写法,默认分辨率640x480。
写法举例
- video=USB2.0 PC CAMERA|1920x1080|30(表示1920*1080分辨率30帧)
- video=USB2.0 PC CAMERA|640x480(表示640*480分辨率)
- dshow://:dshow-vdev=USB2.0 PC CAMERA(表示打开视频设备USB2.0 PC CAMERA、其他参数全部默认)
- 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 网络地址
- 下面的地址有时候会失效,可以自行网上找找其他的地址,网络视频地址建议在晚上测试会更流畅。
- 大雄兔:rtsp://184.72.239.149/vod/mp4://BigBuckBunny_175k.mov
- 大雄兔:http://r.ossrs.net/live/bbb.flv
- 海康萤石:https://hls01open.ys7.com/openlive/6e0b2be040a943489ef0b9bb344b96b8.hd.m3u8
- 在线摄像机:http://vts.simba-cn.com:280/gb28181/21100000001320000002.m3u8
- 摄像机格式:https://blog.csdn.net/qq_38880380/article/details/80652697
0.7.3 中央卫视
- 中央卫视1:rtmp://58.200.131.2:1935/livetv/cctv1
- 中央卫视2:rtmp://58.200.131.2:1935/livetv/cctv2
- 中央卫视3:rtmp://58.200.131.2:1935/livetv/cctv3
- 中央卫视4:rtmp://58.200.131.2:1935/livetv/cctv4
- 中央卫视5:rtmp://58.200.131.2:1935/livetv/cctv5
- 中央卫视6:rtmp://58.200.131.2:1935/livetv/cctv6
- 中央卫视7:rtmp://58.200.131.2:1935/livetv/cctv7
- 中央卫视8:rtmp://58.200.131.2:1935/livetv/cctv8
- 中央卫视9:rtmp://58.200.131.2:1935/livetv/cctv9
- 中央卫视10:rtmp://58.200.131.2:1935/livetv/cctv10
0.7.4 视频文件

万能办法,用谷歌或者谷歌内核的浏览器,打开时光网http://www.mtime.com/ ,随便打开个视频,这里一般是预告片,按F12切换到审查元素,顶部切换到网络,选中媒体,刷新网页,按照尺寸排列,最大的那个MP4文件就是,鼠标右键复制地址,这个地址就是完整的网络地址。
- http://vfx.mtime.cn/Video/2019/02/04/mp4/190204084208765161.mp4
- http://vfx.mtime.cn/Video/2019/03/19/mp4/190319212559089721.mp4
- http://vfx.mtime.cn/Video/2019/03/17/mp4/190317150237409904.mp4
- http://vfx.mtime.cn/Video/2019/03/14/mp4/190314223540373995.mp4
0.7.5 网友提供
- rtmp://live.yihtc.com:10935/hls/stream_3
- rtmp://live.yihtc.com:10935/hls/stream_13
- rtmp://218.3.205.46/live/ggpd_sd
- rtmp://hls.hsrtv.cn/hls/hstv2
- rtmp://hls.hsrtv.cn/hls/hstv1
- rtmp://222.173.22.119:1935/live/jnyd_sd
- rtmp://222.173.22.119:1935/live/xwhd_hd
- rtmp://livetv.dhtv.cn:1935/live/peoples
- rtmp://livetv.dhtv.cn:1935/live/citylife
- rtmp://livetv.dhtv.cn:1935/live/financial
- rtmp://livetv.dhtv.cn:1935/live/news
0.7.6 监控设备
下面列出的是一些常用厂家的格式,不同厂家格式不一样,具体什么格式请咨询厂家索要对应的视频流格式,或者设备支持onvif的话,通过onvif工具搜索可以拿到视频流格式。
0.7.6.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.6.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.6.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 精益求精
0.8.2 破茧成蝶
- 考虑增加mediaplayer内核,限定Qt5.有些嵌入式板子支持mediaplay硬解码。
- 考虑提取抽象视频控件类,可以将vlc、ffmpeg、mpv、海康等视频类移除大量重复代码。
V20220625
- 在之前支持NVR所有通道批量添加基础上,增加自动添加NVR信息到表,这样每个NVR都会自动添加,如果有手动添加好的则取添加好的,以IP地址为准。
- 修复设备在线状态处理,在同一个NVR下IP地址相同的不同通道视频,不会处理在线状态的BUG。
- 修复在postgresql数据库和oracle数据库下,QSqlTableModel对应setTable设置表名严格区分大小写的BUG。
- 测试发现有些很老的设备支持的是onvif1.0,云台地址需要用getCapabilities才能拿到,改进这个处理,兼容任意版本。
V20220612
- 修复qss中分组框QGroupBox标题位移的BUG,在linux系统表现不统一。
- 改进同样的内容导出到pdf和打印显示效果不一致的情况,统一设置分辨率为96。
- 摄像机管理增加多选删除,删除的时候除了删除摄像机表中对应记录,也同时删除轮询信息表中的记录。
- 初始化数据库按钮增加弹框确认,由于这个操作安全级别非常高,增加弹框确认很有必要。
- 所有QTableView+QSqlTableModel对应的保存按钮代码增加主动设置焦点,避免mac系统中当单元格处于编辑状态,再去单击保存按钮,数据依然是之前的数据的BUG。
- 样式表全局颜色增加悬停背景颜色QUIConfig::HoverBgColor和选中背景颜色QUIConfig::SelectBgColor用于自定义委托。
- 对于加深的样式,重新设置单元格等item选中和悬停颜色 默认悬停-DarkColorEnd 选中-NormalColorEnd,加深颜色设置为相反。
- 增加全局参数控制是悬停颜色覆盖选中颜色还是选中颜色优先,默认选中颜色优先,这样选中的item鼠标移上去不会改变掉颜色。
- 增加过滤同名的NVR,之前会重复加载,现在限定同名的只加载一个,要求整个系统中NVR的名字必须唯一。
- 轮询管理中增加摄像机表的过滤条件,启用了的才显示在表格中。
- 增加播放记录开关,用于软件启动后,是否从播放记录url.txt读取历史记录进行播放。
- 增加播放记录url.txt过滤机制,只有摄像机表中存在且启用过的才可以播放。也可以改成只对rtsp开头的进行过滤。
- 增加选择列表通道的时候自动选中视频通道,高亮显示,这样很明确知道选择的哪个,同理,选中视频通道也高亮选中列表通道。相当于通道选中和列表选中联动。
- 增加设备列表在线离线不同图标显示,目前只对rtsp地址开头的进行实时监测上线离线状态,其他全部永远当做在线。离线图标颜色取系统设置中的报警图标颜色。
- 增加设备在线状态字段列表,实时监测设备状态期间先判断状态是否发生变化,只有发生变化了才需要去调用对应函数处理,大大减少无效的多余的处理。
- 修复设备列表双击空白处崩溃的BUG,需要过滤空节点item。
- 增加表格策略,单选按下编辑、多选双击编辑,有些用户需要多选摄像机列表删除。
V20220515
- 将用户退出中的退出系统权限验证去掉,理论上对退出系统这个限制没啥意义,还可以通过任务管理器强制关闭进程。
- 将退出系统的权限名称改成调整布局,没有调整布局权限则不能调整拖动停靠窗体位置等。
- 视频面板窗体对象指针放到了全局静态变量,这样很多地方可以直接使用,比如声音控制、布局调整、视频轮询等。这样就不用繁琐的信号槽切换,可以省略很多不必要的代码,性能更高。
- 修复静音状态下调整音量可能不正确的BUG,静音状态下只改变音量值变量而不是正常改变音量。
- 实现右下角音量面板静音切换、音量值调整,全局视频控件应用。
- 改进默认地图算法,取第一个有背景地图的设备的图片作为默认图片,可能默认图片不存在则取图片列表中的第一张。
- 修复ffmpeg内核回调模式自动重连崩溃的BUG,此时图片不存在应该置为空。
- 增加识别秘钥有限制后限定标题栏带试用字样。
- 重写通用的视频地址类videourl,将通道改成0开始,分隔符改成英文逗号,视频地址集合通过指定枚举值选择不同类型添加。
- 增加自动插入临时消息到数据库用户操作记录,增加参数控制是否需要显示临时消息的时候插入。
V20220413
- 修复视频控件设置自定义背景颜色的时候,没有考虑边框的范围问题。
- 选项卡样式去掉悬停样式,经过观察对比Qt自带的样式都是没有悬停样式,直接是选中样式。
- 修复自定义委托复选框不居中的问题,之前计算不准确会有细微偏差。
- 自定义委托增加悬停颜色。
- 重写自定义委托禁用列,支持文字颜色、背景颜色、字体等特性。
- 修复用户登录、用户退出界面标题栏字体被放大的BUG,因为样式冲突了。
- 将NvrInfo和IpcInfo中的地址字段改名为mark备注字段,涵盖内容更广。
- 地图模块默认卫星图增加了叠加层,更符合实际需求,对应地图综合应用示例做了极大升级改善,比如下载离线地图改成了最新的地址,可以下载到和在线地图一样的瓦片图片文件,离线地图下载改成了多线程,速度提升10倍以上。
- 自定义委托增加quistyle标记,有该标记则自动代码内部引用换肤全局颜色变量,这样删除了大量的设置自定义委托背景颜色的代码。
- 修复Qt6中msvc编译器下,强制指定miniblink浏览器内核的时候编译通不过的BUG,其实这个操作有点吃饱了撑着,因为msvc下有webengine浏览器内核。但是就是因为有极个别人有这个需求,客户就是上帝。
- 增加用户管理权限。
- 将用户权限和用户信息相关类合并到通用的类userhelper中,做成通用的权限组件。
- 修复Qt6中自定义复选框委托,在设置了全局样式的情况下,会不断切换选中的BUG。
- 效果图重新截图,用最新的运行界面。
- 组件示例增加4通道视频同时播放,进度条控制。
V20220106
- 彻底修复全屏模式+webengine同时存在的情况下鼠标右键菜单无法弹出以及视频可能黑屏的BUG,这是Qt的BUG。
- 同时测试多屏幕下正常状态和全屏状态的情况,多屏幕不同分辨率。
- 增加其他设置界面,将串口设置、网络设置等移动到其他设置。随着功能越来越多,也很有必要单独拆分设置。
- 修复打印预览看不到文字的BUG,原来是设置了QGraphicsView的前景色导致的,把前景色和背景色设置成一样的了,其实是有文字的,鬼想得到QPrintPreviewDialog里面的预览原来用的是QGraphicsView绘制的。
- 修复qchart图表控件鼠标按下松开后会跟随窗体移动的BUG,因为qchart鼠标按下是UngrabMouse事件而不是MouseButtonRelease。
- 修复表格行按下后自定义委托颜色在部分样式方案下设置不正确的BUG。
- 增加视频弹窗按钮,封装的统一的视频弹窗静态函数,直接传入url地址即可。
- 修复鼠标按下视频预览底部工具栏也能拖曳视频的BUG。
- 海康内核解析增加对通道的解析,比如可能是一个摄像机有多个通道,或者NVR多个通道。同时完善主码流子码流的解析,可以解析多个码流,之前只能解析主码流子码流两个。
- 海康内核句柄模式下增加等比例缩放自适应。
- onvif模块修复部分厂家摄像机比如天地伟业,搜索返回的媒体地址等一系列请求地址,没有加onvif节点的BUG。
V20211220
- 重新梳理整个onvif模块,调整对应的结构,删除多余的变量和设置等,对应云台控制等操作需要指定profile,通过参数传入。
- 对应图片参数操作需要指定videosource,通过参数传入。
- 去除数据库字段mediaurl、ptzurl,因为这两个数据每次都是更新重新获取的,通过getServices获取,这两个字段改成了videosource、profiletoken,用来从数据库读取出来,每次使用的时候自动下发。
- 预置位表格中的按钮样式调整,去掉圆角,增加边距,效果更完美。
- 新增nvr多个通道onvif支持,改动onvif模块代码和数据库结构。
- 搜索设备后判断是否多个videosource,多个表示有多个视频源,一般是NVR,也有部分IPC自带多个视频源。
- 有多个则根据不同厂家不同规则,找出对应的每个通道的videosource、profiletoken、rtspmain、rtspsub用分隔符 | 插入到临时表格中。
- 摄像机管理界面接收到添加设备的时候,在addDevice槽函数中,判断发过来的数据,带了 | 要分别取出来作为通道添加到数据库中。
- 重新定义搜索的摄像机设备命名规则,按照摄像机#ip地址末尾数字的方式。
- 如果是NVR过来的摄像机,增加自动查找NVR的名称插入数据库。
- 获取预置位增加立即清空所有行,之前是先清空内容再根据读取到的预置位个数设置行数。
- 增加双击打开NVR(也叫分组)对应策略 0-最后空白通道 1-从头清空通道。
- 增加双击打开IPC(也叫设备)对应策略 0-最后空白通道 1-最后按下通道。
- 改进在分辨率不同缩放比例保持一致的UI体验,不受缩放比例的影响。
- 修正异或加密,增加对@String开头的密文进行过滤,防止高版本产生的配置文件到低版本的Qt程序不能正确解析的BUG。
- 如果打开视频流出错提示 Server returned 5XX Server Error reply 表示摄像机的码流满了,可能多个地方在拉取码流导致摄像机输出的视频流被占满,已经没有更多资源。
V20211205
- 地图内核增加了海量点接口。
- 路径规划模块彻底重写,支持重新绘制、沿线移动等模式,数据表格显示。
- 设备轨迹模块改成从gps点集合文本文件加载进行循环动态模拟移动,默认飞机图标,以便转动角度。
- 设备播放增加保存视频开关配置参数,可以直接在界面上开启,开启后,通过rtsp从nvr取流比如回放视频,可以将回放的视频保存MP4文件到本地。
- 修正Qt6通过属性设置标签labtip不能居中对齐的BUG。
- 封装通用的设置一堆按钮比如添加、删除、保存、导入、导出等按钮图形字体的函数,直接传入父面板即可,自动查找对应的objname设置图标,省去一堆重复代码。
- 新增飞行轨迹模块frmDeviceGps2,之前的frmDeviceGps作为通过外部函数调用移动。
- 样式统一整理规范,分类6大类:normal、black、light、dark、flat、other。
x1void QUIStyle::getStyle(QStringList &styleNames, QStringList &styleFiles)2{3 static QStringList names;4 if (names.count() == 0) {5 names << "黑蓝色" << "软件黑" << "视频黑";6 names << "深黑色" << "深蓝色" << "深灰色";7 names << "扁平黑" << "扁平蓝" << "扁平灰";8 names << "浅黑色" << "浅蓝色" << "浅灰色";9 names << "普通黑" << "普通蓝" << "普通灰";10 names << "大蓝色" << "大紫色" << "大银色";11 }12
13 //中文皮肤名称对应样式表文件14 static QStringList files;15 if (files.count() == 0) {16 files << ":/qss/blackblue.css" << ":/qss/blacksoft.css" << ":/qss/blackvideo.css";17 files << ":/qss/darkblack.css" << ":/qss/darkblue.css" << ":/qss/darkgray.css";18 files << ":/qss/flatblack.css" << ":/qss/flatblue.css" << ":/qss/flatgray.css";19 files << ":/qss/lightblack.css" << ":/qss/lightblue.css" << ":/qss/lightgray.css";20 files << ":/qss/normalblack.css" << ":/qss/normalblue.css" << ":/qss/normalgray.css";21 files << ":/qss/otherblue.css" << ":/qss/otherpurple.css" << ":/qss/othersilvery.css";22 }23
24 styleNames = names;25 styleFiles = files;26}
V20211111
- ONVIF组件增加图片参数范围获取,之前默认0-255,有些设备是0-100 0-128之类的,获取后设置到滑动条范围。
- ONVIF组件增加网络参数设置,比如IP地址,子网掩码、网关地址、DNS设置等。
- ONVIF组件将结构体定义统一移到一个头文件onvifstruct.h,方便后期拓展管理。
- 预置位模块,调用、添加(调用)、删除三种功能,改成了以三个按钮的形式加到每个预置位信息的后面直接单击使用。之前是先选中预置位所在行,然后单击下面的按钮。
- 通道轮询全部移动单独的悬停的模块。
- 视频面板窗体指针改成了全局变量,多处需要引用。
- 修复1通道轮询后,再次启动程序无法正确加载通道面板布局的BUG。
- 修复底部通道切换,部分样式效果悬停时候颜色不正确的BUG。改成了取报警图标颜色和已处理颜色。
- 路径规划模块增加模拟轨迹设备自动旋转角度移动。
- 路径规划模块模拟轨迹增加移动间隔下拉框选择。
- 修复Qt4对应webkit模块不支持返回数组的问题,改成字符串拼接用 ; 符隔开。
- 修复Qt4对应webkit模块不支持路径规划的BUG,因为开启了实时路况属性。
- 路径规划增加绘制实时轨迹线条,不同颜色显示。
V20211101
- 修正开启轮询后关闭所有视频通道不弹出提示信息。
- 所有信息框增加阴影边框区分突出显示,并跟随系统换肤自动更新边框阴影。
- 修正视频轮询分隔符,将|改成;因为如果是竖杠遇到带有参数的url则会出错。
- 将设备图片统一存放到config/device目录,之前在config目录下,随着越来越多非常凌乱。
- 修复之前通过信号执行通道切换,对应文字显示反了的BUG(通道1交换到通道2,新的通道2应该显示之前通道1的文本)。
- 将鼠标按下两个通道交换的处理代码,复用信号槽切换通道的函数。
- 将视频监控布局切换部分单独提取类VideoBox,专门负责管理各种通道布局切换,复用代码并且方便后期拓展,这部分代码和具体的处理无关,一直以来就想要单独提取出来进行管理,后期可以方便的增加其他异形布局以及255通道布局等,很多项目都用到了这个切换逻辑。
- 同时增加了布局切换子菜单比如13画面子菜单切换到52_64通道。
- 修复Qt6中视频控件悬浮条无法显示的BUG,因为Qt6将void enterEvent(QEvent *);改成了void enterEvent(QEnterEvent *);也不打个招呼。这种改变编译也不会提示的。
- 数据库组件修正sqlserver数据库必须设置数据源的不足,改成了dsn字符串形式,不需要新建数据源也能直接通信。
- 数据库组件修正mysql数据库必须存在默认数据库mysql的不足,改成了不需要默认数据库也能正常通信。
- 数据库组件修正没有默认数据库也能在建立连接后新建数据库操作。
- 数据库脚本执行将DROP DATABASE IF EXIST改成了DROP DATABASE ,这样无论什么时候都能先删除原来的数据库然后再新建数据库CREATE DATABASE。有些数据库不支持IF EXIST。
V20211005
- 修正ffmpeg内核,在播放地址不存在的情况下,打开容易卡主引起崩溃的BUG,在打开回调函数中增加对线程停止标志位的判断,一旦在打开的回调中识别到需要停止线程则立即返回结束。
- 增加临时信息中间弹出框提示信息,比如一次性关闭所有通道的时候,界面会卡主的期间提示。
- 增加忙碌鼠标图标切换显示,忙完以后自动恢复鼠标样式。
- 修正ffmpeg内核,开始时间记录可能出现问题的BUG,会导致部分特殊MP4文件打不开。
- 应用程序关闭,增加全局退出信号关联到视频通道管理类,先关闭所有视频通道再彻底退出应用程序。不这样处理的话,发现vlc内核在开启了视频存储的时候,会关不掉程序。
- 修复在没有声音播放的情况下主动调用停止播放造成崩溃的BUG。
- 修复在linux系统上QUIWidget弹出的无边框窗体带系统标题栏的BUG。
- 修复ffmpeg内核关闭视频后opengl窗体来不及隐藏的BUG。
- 修复重复立即刷新打开所有通道,前一次还没执行后一次又来了的BUG,改成了定时器处理,在立即执行前将上一次还没来得及执行的先停止。
- 增加about关于对话框窗体,显示版本号、版权所有、网址、电话等信息。
- 所有弹出窗体都跟随软件主窗体默认居中,这个特性非常棒。
- 所有皮肤增加右键菜单选中图标样式、右键菜单二级子菜单右侧小三角箭头图标样式,单选框、复选框、禁用状态图标全部更新,从图形字体绘制,极其统一舒服。
- 着重对日志类savelog增加了最大行数、最大文件大小等参数设置,可以设置按照行数或者大小来自动分割日志文件。
- 日志类增加了可过滤不同的消息类型,不同消息类型增加消息头。
- 经过大量对比测试发现,使用miniblink浏览器内核,容易卡,说不定什么时候就失效了,问题集中在32位,64位的目前没有发现这个现象,webengine暂时没有这个现象,但是加载打开摄像机的网页配置,还是miniblink更优秀。
- 中文标题栏支持换行,既可以副标题写在英文标题上,也可以同等大小字体写在中文标题上。
V20210922
- 视频控件边框增加0像素选项,这样看起来没有边框,有些场景需要无缝拼接。
- 修复当采用NVR通道作为摄像机视频流显示的时候,ONVIF处理索引越界崩溃的情况,因为一台NVR同一个IP地址对应多个摄像机。
- 所有样式17套皮肤更新边框颜色。
- 系统信息增加对应的编译器名字、位数、版本等。
- 演示demo增加视频叠加演示功能,比如在主视频的左上角、右上角、左下角、右下角在增加一个视频缩略图显示。
- 新增天气预报模块,可设置城市、采集间隔、展示样式等。
- 增加了vlc内核下USB摄像头格式自动纠正,如果采用ffmpeg的格式video=USB2.0 PC CAMERA|1920x1080自动纠正。
- 纠正vlc内核下USB摄像头不自动拉伸的BUG。
- 修正vlc内核动态保存视频文件,文件命名不符合规范,重新按照设定的重命名。
- 修复vlc内核中USB摄像头会当做rtsp视频流的BUG。
- 天气预报模块新增城市显示,新增双击弹出天气预报设置,含打印信息。
- 系统信息,增加秘钥文件的内容,比如允许的设备数量、到期日期等。
- 修复配置文件一旦新增加节点,之前节点全部初始值运行的BUG,应该是存在的节点则读取节点值,不存在的节点以初始值运行。
V20210705
- 改进窗体居中显示算法,可设置参照窗体,默认基于当前屏幕中心,可设置参照主窗体则基于参照窗体,在大分辨率屏幕效果非常好,不然主窗体很小,弹个窗找不到还在很远的地方,还以为没有弹呢。
- 将登陆窗体、登出窗体、用户管理等公用界面,做成了通用库core_form。
- 修复MAC系统上无边框窗体无法最小化的BUG。
- 增加超级管理员密码A具有所有权限的机制,避免管理员误将系统设置权限取消后无法再次进去系统设置的问题。
- 图片参数增加锐度,图片参数设置滑块调节松开立即设置。
- 修复当没有启用图片地图的时候对应界面隐藏的时候保存设备坐标位置报错BUG,因为没有启用的情况下没有设置对应的对象指针。
V20210603
- 将onvif搜索的用户密码,设备播放界面的设备密码等配置参数全部改成了密文存储。
- 大量修改代码,全部支持Qt4-Qt6所有版本。
- 调整onvif代码执行机制,改成了异步执行。
- 云台协议增加了连续移动。
- 增加了预置位相关处理,包括获取预置位、调用预置位、添加预置位、删除预置位。
- 自动巡航按照预置位集合进行,采用定时器去调用预置位队列。
- 增加图文警情行数、窗口信息行数配置,0行表示自动处理。
- 做了大量的代码改进,比如onvif内核换成了QDom对象处理,之前是采用的QXmlQuery查询,由于XmlPatterns这个模块逐渐废弃了,而且在Qt6中不再有,所以彻底移除了XmlPatterns相关的代码,改用其他处理方式实现。
- 增加了预置位和自动巡航处理,其中包括获取预置位集合、调用预置位、添加预置位、删除预置位、设置起始位、调用起始位等。
- ONVIF内核几乎全部重写,将数据改成了结构体,比如设备信息、预置位信息、事件信息等,可以存储更多的数据,拓展也非常灵活。
- onvif处理部分增加了对非onvif设备的过滤,通过判断是否存在onvif地址。这样可以大大加快处理速度,打开视频的时候去实例化onvif通信,关闭视频的时候删除对应的onvif类,这样可以动态响应。
- 所有onvif指令改成了线程处理,处理完成一个立马处理下一个,排队处理。
V20210425
- 配置文件密码改成密文存储。
- 增加了无敌的牛逼的万能的完美入微级自动分页导航控件。
- 日志记录表增加索引,速度提升100倍以上。
- 新增多个设备轨迹 不同颜色+传入经纬度 单独示例。
- 对地图核心类所有覆盖物都增加颜色+粗细+透明度的参数,可动态传入对应值。
- 系统设置增加用户管理模块,可分别设置对应的权限。
- 万能权限管理算法,通过设置不同需要授权的模块名称,对应切换的按钮自动计算。
- 增加了appkey秘钥类,用于校验秘钥是否正确,运行时间等。
V20210403
- 增加全局变量AppData::LastLiveTime,记住程序最后的活动时间-包括键盘+鼠标活动,用于两个判断,一个是超过多久没有操作全屏下隐藏鼠标光标,一个是超过多久没有操作如果没有全屏则自动全屏。
- 增加App::TimeAutoFull配置参数用来判断比较超时自动全屏。
- 重命名为TimeHideCursor表示程序多久未操作自动隐藏光标,TimeAutoFull程序多久未操作自动全屏界面,下拉框选项值增加0,表示不启用此功能。
- 增加信息列表模块frmMsgList,用于图文列表显示信息,对应兄弟类frmMsgTable用于表格显示消息。
- 大改版,将中间部分全部改成了QMainWindow,子模块全部采用停靠窗体,可以悬浮半透明,自动记忆每个模块的最后的位置,启动后自动应用。
- 移除大改版后的所有不需要用的变量和配置参数,重新调整配置参数。
- 增加透明度参数用于停靠窗体独立出来后的透明度。
- 将摄像机控制部分比如云台+控制+预置位+巡航,单独分类到ipc模块,方便管理。
- 限定操作员不能移动停靠窗体等,需要管理员设计好。
- 修复系统设置中工作模式等切换造成的自动重启会弹出退出和登录两个窗体的BUG。
- 修复自动登录用户计算不正确的BUG,要以最后登录的用户为准。
V20210322
- USB摄像头增加参数帧率,第二个参数是分辨率,第三个参数为帧率,不设置则采用默认的帧率,video=USB2.0 PC CAMERA|1920x1080|25。
- 增加独立的demo模块,专门用于测试监控系统中用到的组件和控件,演示如何使用,比如视频图片界面演示从文件夹读取图片绘制到窗体,视频窗体演示系统的核心组件视频控件的设置参数如何使用等。
- 增加了对其他数据库的支持,比如posgres、oracle、odbc、kingbase等数据库,理论上只要支持odbc数据源方式的都支持。
- 增加IndexStart启动窗体索引配置参数,0-主程序 1-演示示例。
V20210305
- 修复数据库有时候没加载到的BUG。
- 新增配置参数控制画面切换的菜单和快捷图标是否显示。
- ffmpeg内核增加了可动态保存机制,点击开始保存按钮启动保存,单击结束则生成视频文件,如此往复。
- 海康内核判断主码流子码流改成了 /101? 和 /main/ 同时判断。
- 新增多屏幕的支持,自动在对应屏幕最大化全屏,对话框位置,右下角提示框等。
- 再次分类存放代码文件,分成core ui class三大类。
- 系统配置更改视频控件参数,统一一个函数设置,initCommonVideoWidget函数中做了过滤,必须关闭状态的视频控件设置才起作用。
- 设备播放模块增加大华NVR的远程回放地址,其他地址计算算法调整。
- 新增界面模块功能启用配置参数。
- 新增主界面顶部导航模块中间界面,用于不同的运行模式加载不同的模块。
0.8.3 快速迭代
V20201212
- 增加USB摄像机分辨率设置,直接url带掉。
- 所有地图内核公用一个,复用代码。
- 增加地图默认级别和中心点坐标设置参数。
- 主界面四个模块独立出来,做成了可配置,这样后期可以任意位置放置自定义模块。
- 四个模块标题栏自定义。
- vlc内核和mpv内核的离线判断,当句柄模式下,统一为getLastTime,当调用该函数的时候自动查询播放状态,如果正在播放则自动更新时间为当前时间。
- 将各种在代码中define定义不同内核的代码全部优化,统一为一个类,很大减少代码量,统一为CommonVideoWidget和CommonVideoManage类。
V20201108
- 轮询点模块增加批量生成功能。
- 录像机、摄像机、轮询点,增加导入导出功能。
- ffmpeg内核增加读取帧回调,超时识别,可以快速识别掉线。
20200828
- 增加了云台控制过滤,没有打开的视频禁用云台。
- linux上全屏BUG修复,采用showfullscreen。
- 增加轮询点管理模块。
- 修正轮询的可能崩溃的BUG。
V20200730
- 系统设置增加了视频上传模块,用来将本地的视频文件传输到服务器,多线程并发。
- 视频监控内核新增MPV内核,修正了其他内核的部分函数和处理。
- 海康内核进行大改动,同时支持视频流和本地MP4文件播放,自动分析切换。
- 海康内核增加回调处理,可以拿到每一张图片。
- 海康内核进行了linux上的实验,可以正常播放。
- ffmpeg内核增加保存到MP4。
- 本地文件回放vlc部分增加进度切换等。
- 悬浮条关闭按钮增加实际处理,之前只是打印消息。
- 改进了vlc和mpv的事件回调机制,使其同时支持qt4+qt5。
V20200620
- 增加了opengl显示实时视频,CPU占用极低。
- 增加了地图上设备点位置的调整。
- 设备点双击弹出实时视频预览。
- 增加GPS运动轨迹显示。
- ffmpeg解码类增加了音频播放,采用的QAudioOutput。
V20191105
- 增加云台控制功能,可以上下左右等八个方位控制云台,默认采用相对移动,云台中间按下表示复位。
- 系统设置增加码流类型选择,默认子码流,切换完自动应用。
- 云台控制增加速度功能,值越大,速度越快。
- 增加焦距控制,可放大缩小,速度也可控制。
1 用户登录退出
1.1 用户登录

系统启动后,首先会弹出用户登录界面,从用户姓名的下拉框选择用户名,然后输入密码(默认用户名密码都是admin),单击登录按钮,密码正确则会进入到系统主界面,错误会弹出提示,错误超过三次自动关闭,需要重新打开软件。
在登录界面可以勾选是否记住密码,是否自动登录,如果勾选了记住密码,则下次启用软件会自动填入最后用户的密码,勾选了自动登录(以最后的用户信息作为当前登录用户)则启动后直接进入主界面。如果开启了自动登录,不会弹出登录界面,可以在系统设置中关闭自动登录和记住密码。
1.2 用户退出

在主界面单击右上角的关闭按钮,会弹出用户退出界面,需要输入密码验证防止误关闭,会自动填入登录的用户名,密码输入正确才会退出软件。用户登录和退出都内置了超级密码a防止管理员忘记密码。
2 主界面操作
@@ -618,7 +699,7 @@ header, .context-menu, .megamenu-content, footer{

本系统内置高达18套皮肤样式供用户选择,可以在系统设置中随意切换立即应用。
xxxxxxxxxx261void QUIStyle::getStyle(QStringList &styleNames, QStringList &styleFiles)2{3 static QStringList names;4 if (names.count() == 0) {5 names << "黑蓝色" << "软件黑" << "视频黑";6 names << "深黑色" << "深蓝色" << "深灰色";7 names << "扁平黑" << "扁平蓝" << "扁平灰";8 names << "浅黑色" << "浅蓝色" << "浅灰色";9 names << "普通黑" << "普通蓝" << "普通灰";10 names << "大蓝色" << "大紫色" << "大银色";11 }12
13 //中文皮肤名称对应样式表文件14 static QStringList files;15 if (files.count() == 0) {16 files << ":/qss/blackblue.css" << ":/qss/blacksoft.css" << ":/qss/blackvideo.css";17 files << ":/qss/darkblack.css" << ":/qss/darkblue.css" << ":/qss/darkgray.css";18 files << ":/qss/flatblack.css" << ":/qss/flatblue.css" << ":/qss/flatgray.css";19 files << ":/qss/lightblack.css" << ":/qss/lightblue.css" << ":/qss/lightgray.css";20 files << ":/qss/normalblack.css" << ":/qss/normalblue.css" << ":/qss/normalgray.css";21 files << ":/qss/otherblue.css" << ":/qss/otherpurple.css" << ":/qss/othersilvery.css";22 }23
-24 styleNames = names;25 styleFiles = files;26}
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_onvif onvif功能封装类,包括设备搜索、云台控制、设备参数设置等。 core_opengl opengl封装类,支持打开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 颜色下拉框控件,在系统设置中有。 cpumemorylabel CPU和内存使用情况标签控件,主界面右上角显示。 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
名称 说明 echartjs echart模块中用到的json文件转js文件,获取js文件中的名字和经纬度等处理。 echarts echart封装类,可加载仪表盘、闪烁点图、迁徙图、世界地图、区域地图等,每个点可自定义颜色和提示信息等。 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 获取当前桌面分辨率,设置编码、字体、翻译文件等。 quihelperdata 16进制、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版本、不同的编译器环境、不同的操作系统,加载对应的浏览器内核模块和定义不同的变量。 miniblink miniblink封装处理类。 webhelper 经纬度转换、获取小数点经纬度值等常用处理函数。 webjsdata 通用的浏览器控件和Qt程序交互数据中转类。 webview 通用浏览器控件,支持webkit、webengine、miniblink。
11.3.4 界面UI

界面说明
- 这里分门别类存放的各种功能集合的界面类。
- 每个类都一个ui文件、一个h头文件、一个cpp实现文件。
- 可以方便快速查找对应功能的界面,也方便拓展增加界面。
- 不仅分文件夹存放的,而且命名也尽量按照对应功能打头,比如系统设置模块中的都用frmconfig打头。
- 外层文件夹是整齐的,内部代码也是整齐的。
名称 说明 frmconfig 系统设置模块,包括基本设置、录像机管理、摄像机管理、轮询管理、用户管理、视频上传等。 frmdata 日志查询模块,包括本地日志、设备日志等。 frmdemo 演示demo示例,用于演示具体控件或者功能的使用,方便学习参考,比如视频图片、视频控件、视频存储都单独的使用demo。 frmipc 存放摄像机处理相关的模块,比如设备控制,云台控制、预置位、巡航设置等。之前放在frmmodule模块中,后面独立出来管理更方便。 frmmain 主界面模块,包括登录登出界面、主界面、右上角时间组件、欢迎组件等。 frmmap 地图模块,包括通用地图内核界面、图片地图、在线地图、离线地图、路径规划等。 frmmodule 停靠子窗体模块,包括停靠窗体管理核心类、设备列表、窗口信息、图文警情、设备轨迹、网页浏览等模块。将摄像机、机器人、无人机相关的模块放到了对应的模块文件夹,这里放的是系统通用的模块。 frmrobot 无人机模块,包括图像增强、飞行监控等模块。 frmuavs 无人机模块,包括图像增强、飞行监控等模块。 frmvideo 视频监控模块,所有视频监控相关的都放在这里,包括主界面的视频监控布局窗体、视频回放、远程回放、图片回放等。
11.3.4.1 模块-frmconfig
名称 说明 frmconfig 系统设置模块主界面,采用堆栈窗体形式,加载多个子界面比如摄像机管理、轮询管理等。 frmconfigdb 数据库设置,独立出来,很多系统通用。 frmconfigipc 摄像机管理,可以增加、删除、修改、清空、导入、导出、打印摄像机信息。 frmconfigipcsearch onvif设备搜索,独立出来的窗体,可以搜索局域网内的所有onvif摄像机信息,搜索完以后获取摄像机的视频流地址等,最后可以单个添加或者批量选中添加到摄像机信息表格中。 frmconfignvr 录像机管理,可以增加、删除、修改、清空、导入、导出、打印录像机信息。 frmconfigpoll 轮询管理,可以增加、删除、修改、清空、导入、导出、打印轮询点信息。可以按照设定规则批量生成轮询点信息。 frmconfigpollplus 将轮询管理中的轮询参数配置、分组管理、批量添加等独立出来的界面,方便管理和拓展。 frmconfigsave 录像计划,目前空的,等想好了怎么设计好在实现。 frmconfigsystem 系统设置,包括基本设置、视频参数、数据库设置、地图配置、功能激活、颜色配置、串口配置、网络配置等。 frmconfiguser 用户管理,可以增加、删除、修改、清空、导入、导出、打印用户信息。每个用户可以勾选不同的模块权限。
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
名称 说明 frmlogin 用户登录界面,三次错误关闭,下拉可选用户,内置超级密码。 frmlogout 用户退出界面,三次错误关闭,下拉可选用户,内置超级密码。 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 通用开发环境搭建
- 第一步:安装系统,推荐用vmware虚拟机。
- 第二步:安装qt环境,可以直接用官方下载的run安装包安装,有些要求用命令行安装。
- 第三步:写个空白窗体程序测试下是否环境正常。
- 第四步:编译ffmpeg,生成对应的动态库或者静态库。
- 第五步:打开video_system.pro项目进行编译。
- 第六步:打包发布,为了发布方便,推荐用静态编译的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 报警输入设置
+
24 styleNames = names;25 styleFiles = files;26} 









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

本系统采用模块化的设备,有用到第三方开源类库比如串口通信qextserialport,全部放在3rd下面,有用到很多自己封装完善的通用类库比如ffmpeg视频监控,全部放在core下面,设备通信和辅助处理全部放在class下面,所有界面全部放在ui下面,相当于一个个小的组件合起来,最终形成了整个监控系统的完整代码。
| 名称 | 说明 |
|---|---|
| 3rd | 一些第三方开源的类库,比如串口通信qextserialport。 |
| class | 存放系统初始化、样式控制、自定义控件、设备通信等。 |
| core | 本人一直持续更新完善的通用的类库,比如ffmpeg视频监控。 |
| ui | 所有的界面都分门别类放在这里。 |

这里放的全部是第三方开源的轮子,感谢开源、感谢github、gitee等开源社区。
| 名称 | 说明 |
|---|---|
| 3rd_qextserialport | 第三方串口通信qextserialport,这个类比较稳定可靠,经过了几十个项目持续数十年运行的考验,不用Qt自带的串口类。 |
具体代码不做过多说明。

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

这里放的全部是个人一直持续更新完善的独创的轮子,所有的项目都公用这些轮子,用到哪个就包含哪个进来,更新只需要更新轮子代码就行。
视频监控系统包含的轮子超级丰富给力,物超所值,涵盖了数据导出模块、数据库应用、视频监控、ONVIF通信、TCP文件传输、地图应用、通用浏览器内核等。
| 名称 | 说明 |
|---|---|
| core_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_onvif | onvif功能封装类,包括设备搜索、云台控制、设备参数设置等。 |
| core_opengl | opengl封装类,支持打开yuv/nv12文件,绘制yuv/nv12帧数据,一般搭配ffmpeg视频内核视频,直接走GPU绘制。 |
| core_qui | 通用的辅助类,包括自定义对话框,全局辅助函数,图形字体等。 |
| core_tcpfile | 文件多线程收发类,支持多个并发。 |
| core_video | 通用的视频监控管理类,封装了通用的视频控件和多通道统一管理。 |
| core_webview | 通用浏览器控件类,同时支持webkit、wenengine、miniblink三种内核,打通了所有的Qt版本。 |
| 名称 | 说明 |
|---|---|
| base64helper | 图片及文字和base64编码之间转换的类。 |
| commonkey | 通用秘钥管理类,指定校验秘钥文件,可设置运行时间、设备数量等限制,支持根据硬件指纹特征生成机器码文件等。 |
| commonnav | 通用菜单导航管理类,用来控制和显示顶部导航栏、左侧导航栏的样式。很多子界面需要用到,所以封装成一个专门管理这个的类。 |
| commonstyle | 通用样式管理类,比如Qt自带类窗体样式、自定义控件样式、分页导航样式、导航按钮样式、开关按钮样式等。相当于将多个项目常用的自定义样式封装一起做成通用。 |
| framelesswidget2 | 无边框窗体拉伸类,边框四周八个方位都可以自由拉伸,可设置是否允许拖动和拉伸。 |
| playwav | 声音文件播放类,通用Qt456,自动识别当前Qt版本使用对应的类,Qt4采用QSound,Qt5以上采用QSoundEffect,嵌入式采用对应的命令行aplay、mpv来播放。 |
| savelog | 日志钩子类,将系统中所有的打印信息转为日志存储或者输出到网络等,可以开启用来打印输出日志信息。 |
| saveruntime | 保存运行时间类,用来存储系统启动后每隔一段时间就输出一条记录用来记录启动后软件运行了多久,方便分析问题。 |
| 名称 | 说明 |
|---|---|
| bottomwidget | 通用底部状态栏控件,可以设置软件名称、版本号、运行时间等。 |
| colorcombobox | 颜色下拉框控件,在系统设置中有。 |
| cpumemorylabel | CPU和内存使用情况标签控件,主界面右上角显示。 |
| customtitlebar | 停靠窗体自定义标题栏控件。 |
| devicebutton | 设备按钮控件,比如图片地图模块中用到,可设置不同的图标样式和状态等,双击发出信号进行相应处理比如弹出对应窗体等。 |
| lcddatetime | 软件右上角显示时间的控件。 |
| panelwidget | 面板容器控件,主界面子模块表格消息,就用到此控件,用于将一堆widget放到此容器进行管理,自动形成滚动条等。 |
| switchbutton | 开关按钮控件,在系统设置中存在大量该控件。 |
| xslider | 滑动条控件,在原有滑动条基础上增加了鼠标按下立即定位等。 |
| 名称 | 说明 |
|---|---|
| datacreat | 通用数据报表内容创建类,比如生成表格格式的html内容,然后赋值给dataprint直接打印,里面举例了图文混排的报告内容,后期会不断增加其他模板,也可以自行增加其他模板数据。 |
| datacsv | 导入导出数据,csv格式,可设置分隔符。拓展名。过滤条件等。 |
| datahead | 当前组件通用头文件。 |
| datahelper | 辅助类,比如校验规则函数,通用数据导出+打印函数。 |
| dataprint | 数据打印到pdf及纸张,支持多线程。 |
| dataxls | 数据导出到xls类,支持多线程导出。 |
| 名称 | 说明 |
|---|---|
| dbcleanthread | 自动清理数据线程类。 |
| dbconnthread | 数据库通信管理线程类。 |
| dbdelegate | 自定义委托全家桶,包括复选框、下拉框、密码框、按钮等。 |
| dbhead | 当前组件通用头文件。 |
| dbhelper | 各种数据库应用函数封装,比如初始化数据库、执行sql语句等。 |
| dbhttpthread | 网络请求数据采集类。 |
| dbpage | 数据库通用翻页类。 |
| dbpagemodel | 数据库翻页类数据模型。 |
| navpage | 分页导航控件。 |
| 名称 | 说明 |
|---|---|
| ffmpegconvert | 各种转换处理函数封装。 |
| ffmpeghead | 当前组件通用头文件。 |
| ffmpeghelper | 辅助类,包括版本号,校验url地址、获取流索引等。 |
| ffmpegsync | 音视频同步类,包括了同步以及发出当前播放进度信号。 |
| ffmpegthread | 核心解码类,主要代码都在这,包括音视频的解码。 |
| ffmpegtool | 工具类,用于执行ffmpeg的命令获取结果。 |
| ffmpegwidget | 视频显示窗体类,解码后到这里显示,依赖ffmpegthread。 |
| videoffmpeg | 多通道管理类。 |
| 名称 | 说明 |
|---|---|
| echartjs | echart模块中用到的json文件转js文件,获取js文件中的名字和经纬度等处理。 |
| echarts | echart封装类,可加载仪表盘、闪烁点图、迁徙图、世界地图、区域地图等,每个点可自定义颜色和提示信息等。 |
| mapbaidu | 百度地图封装类,支持在线和离线两种模式。 |
| 名称 | 说明 |
|---|---|
| onvifbase | 基础类,用于获取设备信息、服务文件地址、能力文件地址、媒体文件地址、视频流地址等。 |
| onvifdevice | 设备类,核心处理及管理,包括设置用户信息请求onvif地址、获取设备信息、云台控制、事件订阅、抓拍图片等。 |
| onvifevent | 事件订阅具体实现类,可设置请求超时时间等。 |
| onvifhead | 当前组件通用头文件。 |
| onvifhelper | 辅助类,比如获取UUID用于请求、判断IP合法、获取本机IP地址集合、管理系统中所有onvif设备对象等。 |
| onvifmedia | 获取媒体文件具体解析类。 |
| onvifother | 其他处理类,比如系统重启、NTP校时、获取和设置网络信息、获取和设备时间、获取和设置图片参数等。 |
| onvifptz | 云台控制实现类,包括绝对移动、相对移动等。 |
| onvifquery | 数据查询类,用于将接收到的xml数据解析,并赋值字符串比如命名空间、设备地址、媒体地址、事件地址等。 |
| onvifrequest | 网络请求类,包括设置用户信息、获取用户token数据、获取xml头部数据等,通用的请求数据返回结果函数。 |
| onvifsearch | 设备搜索类,支持广播搜索、指定地址搜索,可获取设备信息集合、获取设备地址集合。 |
| onvifservices | 服务类,用于获取媒体地址、云台地址等。 |
| onvifsnap | 图片抓拍实现类,包括获取抓图地址、抓拍图片等。 |
| 名称 | 说明 |
|---|---|
| openglhead | 当前组件通用头文件。 |
| nv12glwidget | 继承自QGLWidget的NV12格式OPENGL绘制窗体。 |
| nv12openglwidget | 继承自QOpenGLWidget的NV12格式OPENGL绘制窗体。 |
| yuvglwidget | 继承自QGLWidget的YUV格式OPENGL绘制窗体。 |
| yuvopenglwidget | 继承自QOpenGLWidget的YUV格式OPENGL绘制窗体。 |
| 名称 | 说明 |
|---|---|
| formhelper | 封装的导入导出、导出数据到xls/pdf和打印数据、自动备份数据、保存最后打开的文件夹等。 |
| frmconfigdb | 通用数据库管理界面类,可选不同的数据库类型,填入用户信息,执行检测连接和初始化数据操作。 |
| frmconfiguser | 通用用户管理界面类,可添加、删除、修改用户信息,包括权限分配等,可导入导出打印用户信息。 |
| frmlogin | 通用用户登录界面类,包括自动登录和记住密码复选框,多次密码错误校验,记住当前用户信息等。三次错误关闭,下拉可选用户,内置超级密码。 |
| frmlogout | 通用用户退出界面类,三次错误关闭,下拉可选用户,内置超级密码。 |
| userhelper | 通用用户权限管理类,内置7种类型权限,对应权限名称可自定义,一般在用户切换对应界面或者单击了对应功能按钮的时候触发。 |
本组件涵盖的功能较多,所以采用了分层管理代码结构。
| 名称 | 说明 |
|---|---|
| iconhelper | 万能图形字体类,可传入多种图形字体文件,一个类通用所有图形字体。 |
| quiconfig | 存储当前组件的配置参数信息,比如全局的字体名称、字号、无边框窗体的最小化最大化关闭等图标、样式表的颜色值。 |
| quihead | 当前组件通用头文件。 |
| quistyle | 当前组件通用样式设置管理类,可以指定枚举类型样式、传入样式内容设置、获取样式表文件对应的颜色值等。当前组件样式相关的处理函数都放在这里,统一管理。 |
| 名称 | 说明 |
|---|---|
| quiabout | 关于系统对话框,可传入软件标题、版本、版权、网址等信息。 |
| quidateselect | 自定义日期范围选择对话框。 |
| quiinputbox | 自定义输入框窗体,可指定不同的输入类型比如文本框、下拉框等。 |
| quimessagebox | 自定义信息消息框窗体,可设置关闭倒计时,不同的类型比如信息框、询问框、错误框等。 |
| quisplash | 自定义弹出提示信息,提示完自动消息关闭。 |
| quitipbox | 自定义右下角信息对话框,可设置对齐方式、关闭倒计时等。 |
| quiwidget | 自定义无边框窗体,可设置标题,各种图标等。 |
| 名称 | 说明 |
|---|---|
| quihelper | 项目通用辅助类,各种常用函数的封装,比如获取当前屏幕分辨率、设置字体、设置编码、加载翻译文件、各种进制数据转换、弹出各种对话框、设置延时时间等。 |
| quihelpercore | 获取当前桌面分辨率,设置编码、字体、翻译文件等。 |
| quihelperdata | 16进制、2进制、10进制互相转换,16进制字符串、字节数组互相转换,字节数组转int和short,CRC校验等。 |
| quihelperfile | 选择文件、保存文件、选择目录等对话框,复制文件、删除文件等。 |
| quihelperform | 设置无边框窗体、边框阴影,弹出信息框、错误框、询问框、日期选择框、关于对话框、中间提示框等。 |
| quihelperimage | 获取等比例缩放图片,通用设置logo图片,支持资源文件、本地图片、图形字体、svg自动变色等多种形式。 |
| quihelpernet | 获取本机IP地址集合,获取外网IP地址,判断IP、MAC等是否合法,下载网络文件,IP地址字符串与整型互相转换。 |
| quihelperother | 初始化数据库文件,设置系统时间、开机启动,设置图标到按钮,写入临时消息的文本文件等。 |
| 名称 | 说明 |
|---|---|
| tcpfilehead | 当前组件通用头文件。 |
| tcpfilehelper | 辅助类,包括将字节转为MB单位、初始化表格控件、生成表格行、数据加密解密、解压文件、重启系统等。 |
| tcpreceivefileserver | 接收文件服务类,管理多个接收文件线程,支持监听端口被动接收文件和主动连接服务器接收文件。 |
| tcpreceivefilethread | 接收文件线程类,根据发送的文件名、包编号、块大小、挨个接收数据最终形成文件,可设置保存文件夹等。 |
| tcpsearchfileserver | 搜索文件服务类,目前没用,用于接收请求搜索文件是否存在。 |
| tcpsendfilethread | 发送文件线程类,按照 文件开始符+文件大小+文件内容+文件结束符 逐个分包发送,可对文件的每个包进行加密传输。 |
| 名称 | 说明 |
|---|---|
| commonvideomanage | 通用视频管理类,比如定时器排队打开视频、排队重连视频,可设置超时时间、打开间隔、重连间隔等。 |
| commonvideowidget | 通用视频控件类,视频监控系统支持多种内核,每种内核对应的视频控件接口一样,根据预定义关键字识别具体的视频控件类,搞个通用的视频控件类,就不用每个用到该控件的代码文件去挨个判断预定义变量生成对应的视频控件,很大减少重复冗余代码量。 |
| 名称 | 说明 |
|---|---|
| webcore.pri | 通用的根据不同的Qt版本、不同的编译器环境、不同的操作系统,加载对应的浏览器内核模块和定义不同的变量。 |
| miniblink | miniblink封装处理类。 |
| webhelper | 经纬度转换、获取小数点经纬度值等常用处理函数。 |
| webjsdata | 通用的浏览器控件和Qt程序交互数据中转类。 |
| webview | 通用浏览器控件,支持webkit、webengine、miniblink。 |

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

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

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

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

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

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

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

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

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

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

操作说明

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