使用说明
万能办法,用谷歌或者谷歌内核的浏览器,打开时光网http://www.mtime.com/ ,随便打开个视频,这里一般是预告片,按F12切换到审查元素,顶部切换到网络,选中媒体,刷新网页,按照尺寸排列,最大的那个MP4文件就是,鼠标右键复制地址,这个地址就是完整的网络地址。
下面列出的是一些常用厂家的格式,不同厂家格式不一样,具体什么格式请咨询厂家索要对应的视频流格式,或者设备支持onvif的话,通过onvif工具搜索可以拿到视频流格式。
V20221121
V20221116
V20221111
V20220918
构思和编码及测试花了一年时间,将所有视频监控内核重新架构重写,抽象视频解码线程类和视频窗体展示类,着重解决了视频解码线程复用。具体可参见文档中的内核模块说明。
视频复用技术难点
主要改进功能点
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
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
V20211101
V20211005
V20210922
V20210705
V20210603
V20210425
V20210403
V20210322
V20210305
V20201212
V20201108
20200828
V20200730
V20200620
V20191105
系统启动后,首先会弹出用户登录界面,从用户姓名的下拉框选择用户名,然后输入密码(默认用户名密码都是admin),单击登录按钮,密码正确则会进入到系统主界面,错误会弹出提示,错误超过三次自动关闭,需要重新打开软件。
在登录界面可以勾选是否记住密码,是否自动登录,如果勾选了记住密码,则下次启用软件会自动填入最后用户的密码,勾选了自动登录(以最后的用户信息作为当前登录用户)则启动后直接进入主界面。如果开启了自动登录,不会弹出登录界面,可以在系统设置中关闭自动登录和记住密码。
在主界面单击右上角的关闭按钮,会弹出用户退出界面,需要输入密码验证防止误关闭,会自动填入登录的用户名,密码输入正确才会退出软件。用户登录和退出都内置了超级密码a防止管理员忘记密码。
主界面由顶部主菜单导航、左侧右侧停靠窗体(设备列表、窗口信息、图文警情、悬浮地图、云台控制、设备控制、预置巡航、视频轮询等)、中间视频监控主画面组成,其中左右两侧的停靠窗体可以拉伸宽度,上下停靠窗体之间也可以拉伸高度,每个停靠窗体都可以关闭和悬浮。自动保存布局文件,下次启动自动应用。
新增说明
左侧和右侧的面板,可以通过单击面板右上角的关闭按钮来隐藏,当隐藏一个面板以后,剩余的面板会自动填充布局,如果需要重新显示面板,则在标题栏鼠标右键就可以对小面板进行显示和隐藏,右上角的时间和CPU显示面板可以在系统设置中控制显示隐藏。系统会自动记住最后的布局比如显示的面板和宽高占比,下次启动后自动应用。
特别说明
面板和面板之间有个分隔条,鼠标移到对应分隔条的地方,会变成可拉动的鼠标指针,此时可以上下左右拉动调整宽高,调整好以后会自动保存宽高比例,下次启动后自动应用最后的配置来显示。
视频播放支持多种方式:
视频截图支持多种方式:
有多种方法可以删除视频:
系统支持多画面切换,全屏切换等,包括1+4+6+8+9+13+16+25+36+64画面切换,如果还需要增加更多的画面比如81+100等,可以直接在源码中稍微修改即可。
64画面效果图
在主界面画面栏右下角,按下声音图标自动弹出声音调节面板,失去焦点自动隐藏,拉动声音滚动条来调节声音大小,还有静音切换。右下角的声音和静音切换是针对所有通道的,单个通道可以在每个通道的悬浮条工具栏中单击静音切换按钮。
功能说明
通道交换功能很常用,一般用户喜欢调整自己想要的通道显示到前面或者占据画面的更大部分,比如6画面8画面的时候,左侧有一个画面占据很大的位置,一般这个用来显示重要性最高的实时视频,如果需要通道交换,则按住通道拖动到另外一个通道上面松开鼠标即可,会立即应用,瞬间切换,这里切记不要移出视频画面外,移出去表示删除。
本系统也封装了代码中动态控制切换和动态交换,具体代码在DeviceThreadUI类中,具体全局函数在AppEvent类中。
xxxxxxxxxx
51//指定通道显示视频 id从0开始
2void slot_loadVideo(int channel, int ipcID);
3void slot_loadVideo(int channel, const QString &url);
4//通道交换
5void slot_changeVideo(int channel1, int channel2);
如果需要控制云台移动,先要选择对应的通道,边缘会高亮,进行云台控制的前提是该摄像机要是支持云台的摄像机,很多人以为啥摄像机都可以移动,这是错误的,如果摄像机不支持云台,这个功能就别玩了,玩不起,经常遇到一些人说怎么云台不能用了,一检查尼玛原来摄像机根本没有云台。
本系统云台控制走的是onvif协议,没有使用私有协议,上百家厂家的摄像机,走私有协议会玩死人的,所以统一采用onvif通用协议,需要提前在系统设置中的摄像机管理,搜索摄像机,输入正确的onvif用户信息后一键获取到云台地址。
设备控制部分,目前可以获取和设置图片参数、手动校时、重启设备等,上面那一堆复选框对应功能需要用厂家sdk去实现,后期可能会增加一些onvif能够处理的功能。和云台控制操作一样,操作前也是需要选中某个通道,然后才是对选中的通道进行设备控制,比如图片参数中的明亮度、对比度、饱和度。
本系统默认支持海康摄像机的报警事件订阅,默认已经订阅,如果摄像机已经开启了报警事件的话,默认一般是关闭的,比如摄像机后面的开关量输入报警接口,需要web页面进去设置开启。报警订阅走的是onvif协议,默认测试过海康的摄像机,其余摄像机有些没有测试成功,后期会详细查下原因并改进,会持续更新完善。
悬浮条功能介绍:
可动态添加任意多个osd标签信息,标签信息包括名字、是否可见、字号大小、文本文字、文本颜色、标签图片、标签坐标、标签格式(文本、日期、时间、日期时间、图片)、标签位置(左上角、左下角、右上角、右下角、居中、自定义坐标)。
具体结构体参数和使用方法如下:
xxxxxxxxxx
651//标签信息
2struct OsdInfo {
3 QString name; //名字唯一标识符(方便删除或更新)
4 bool visible; //是否可见
5 int fontSize; //字号大小
6 QString text; //文本文字
7
8 QColor color; //文本颜色
9 QImage image; //标签图片
10 QPoint point; //标签坐标(位置自定义时候使用)
11 OsdFormat format; //标签格式
12 OsdPosition position; //标签位置
13
14 OsdInfo() {
15 name = "osd";
16 visible = true;
17 fontSize = 12;
18 text = "视频标签";
19
20 color = "#FF0000";
21 image = QImage();
22 point = QPoint(0, 0);
23 format = OsdFormat_Text;
24 position = OsdPosition_LeftTop;
25 }
26};
27
28public slots:
29 //设置OSD标签
30 void setOsd(const OsdInfo &osd);
31 //添加OSD标签
32 void appendOsd(const OsdInfo &osd);
33 //移除OSD标签
34 void removeOsd(const QString &name);
35 //清空OSD标签
36 void clearOsd();
37
38void DeviceVideoSmart::receiveData(const QString &type, const QVariant &data)
39{
40 if (!widget || !widget->getIsRunning()) {
41 return;
42 }
43
44 if (type == "currentCount") {
45 int currentCount = data.toInt();
46 OsdInfo osd;
47 osd.name = "currentCount";
48 osd.fontSize = 20;
49 osd.text = QString("当前人数: %1").arg(currentCount);
50 osd.color = "#D64D54";
51 osd.format = OsdFormat_Text;
52 osd.position = OsdPosition_LeftBottom;
53 widget->setOsd(osd);
54 } else if (type == "maxCount") {
55 int maxCount = data.toInt();
56 OsdInfo osd;
57 osd.name = "maxCount";
58 osd.fontSize = 20;
59 osd.text = QString("限定人数: %1").arg(maxCount);
60 osd.color = "#FDCD72";
61 osd.format = OsdFormat_Text;
62 osd.position = OsdPosition_RightBottom;
63 widget->setOsd(osd);
64 }
65}
可动态添加任意多个图形信息,这个非常有用,比如人工智能算法解析后的图形区域信息直接发给视频控件即可。图形信息支持任意形状,直接绘制在原始图片上,采用绝对坐标。
具体结构体参数和使用方法如下:
xxxxxxxxxx
441//图形信息(人脸框和多边形区域等)
2struct GraphInfo {
3 QString name; //名字唯一标识符(方便删除或更新)
4 int borderWidth; //边框大小
5 QColor borderColor; //边框颜色
6 QColor bgColor; //背景颜色
7
8 QRect rect; //矩形区域
9 QPainterPath path; //路径集合
10 QList<QPoint> points; //点坐标集合
11
12 GraphInfo() {
13 name = "graph";
14 borderWidth = 2;
15 borderColor = "#FF0000";
16 bgColor = QColor(255, 0, 0, 100);
17 }
18};
19
20public slots:
21 //设置图形
22 void setGraph(const GraphInfo &graph);
23 //添加图形
24 void appendGraph(const GraphInfo &graph);
25 //删除图形
26 void removeGraph(const QString &name);
27 //清空图形
28 void clearGraph();
29
30void DeviceVideoSmart::receiveRects(const QList<QRect> &rects)
31{
32 if (!widget || !widget->getIsRunning()) {
33 return;
34 }
35
36 widget->clearGraph();
37 foreach (QRect rect, rects) {
38 GraphInfo graph;
39 graph.borderColor = QColor(255, 0, 0);
40 graph.borderWidth = 3;
41 graph.rect = rect;
42 widget->appendGraph(graph);
43 }
44}
操作步骤:
视频回放中有多个子模块,分别是不同的含义:
基本步骤:
远程回放模块是用来通过sdk的形式回放远程NVR设备上的录像文件,这个暂未实现,本系统主要是为了兼容性和通用性,通过具体sdk形式调用的处理都没有做,破坏了移植性,到了其他平台就没法使用了,本系统sdk使用这块默认用的海康sdk作为示例。
设备播放模块主要是通过rtsp视频流的形式来拉取实时视频和回放视频,现在越来越多的NVR支持直接通过取流的形式来拉取实时视频流和回放视频,这样使用起来很方便,当然在拉取视频流的时候要传入用户信息,防止非法获取,现在越来越多的应用场景需要通过NVR来调取回放视频,传统的SDK的方式非常累厂家太多,而国标的形式太繁琐复杂,于是rtsp形式的最简单的方式应运而生,目前支持的厂家也越来越多,每个厂家格式的规则不一样,可以自行咨询厂家的规则,本程序默认实现了海康、大华和深广的规则。
基本步骤:
选择设备通道和时间范围,单击查询按钮,会将查询到的图片序列按照日期的形式作为一行添加到列表结果中,双击可以自动播放,可以调节播放速度。
图文混排,可以自定义信息,封装好的类,传入图片队列,图片自适应等比例缩放显示,超过自动分页。
视频上传功能主要用来将本地存储的视频文件(也可以是其他文件),通过网络传输(默认TCP)上传到其他地方比如服务器,服务器上要运行接收文件的程序,这样就相当于远程备份视频文件的功能,视频文件可以勾选需要上传哪一些。
本地只需要在视频监控系统客户端上切换到视频上传页面,然后选择要查询的日期范围,单击查询,会将视频文件查询出来显示在左边的表格中,可以勾选要上传的视频文件,右侧填写好服务器的IP和端口(默认6000),单击上传按钮,会多线程的形式上传文件。
远程需要放置文件传输工具,该工具完整源码如果购买了视频监控系统,可以赠送,该工具同时具备了发送端和接收端的功能,配套视频监控系统使用的是接收端,视频监控系统作为发送端,填好监听端口后,单击监听按钮,一旦有连接文件上传,会自动显示对应的接收进度,文件名称以上传的文件名为准。
默认文件传输过程采用了加密机制,意味着传输的数据是加密后的数据,接收到以后根据设置的秘钥进行解密重新生成文件,防止文件传输过程中被拦截,可自定义加密规则。
电子地图有多个子模块,分别不同的功能,在每个模块上,双击对应的摄像机,都可以弹出实时视频预览画面,支持多个画面同时打开,每个摄像机都一个画面窗体。
功能和在线地图完全一致,唯一区别就是地图是离线的,不需要联网。离线的地图需要自己准备好,可以网上通过瓦片地图下载器来下载需要的地方的离线地图,一般离线地图比较大,他是一张张图片,所以建议离线地图只下载自己需要的即可,比如某个县的地图,而不是所有的,所有的起码有几十GB。
使用说明
在摄像机管理的界面,可以添加经纬度信息,这样就可以在地图上显示对应的摄像机点位信息,如果发现位置不对,可以在右侧先选择摄像机设备,然后鼠标单击新的位置,右侧目标经度、目标纬度信息会自动更新,然后再单击更新经纬度值则会更新当前下拉选择的设备的经纬度信息,也可以在摄像机管理界面手动填入进行修改。
在右侧还有模拟运动轨迹、开始显示轨迹两个按钮,有可能后期还会增加其他功能,是为了演示如何在地图上实现地图的相关功能,开始显示轨迹采用的定时器来生成轨迹点数据,动态模拟运动轨迹,可以单击显示设备位置按钮还原最初的设备点位图。
功能特点
基本步骤
本地日志存放的是本系统的操作日志,比如用户登录退出、记录删除、设备报警等操作,都会有对应的记录存放的数据库,可以在这里选择时间段和日志类型进行查询。查询后的日志记录可以翻页查看,还可以直接支持指定页码跳转,(此翻页组件超级牛逼,外观和功能分离,自动计算页码切换导航,具体可参见对应类的头文件功能描述),每页显示多少条记录在系统设置中可以设置。
单击打印按钮,会将当前查询的记录打印出来,自动分页。打印前会弹出打印预览对话框,可以最后在这里调整边距、纸张等设置参数。
单击XLS按钮可以将表格中的内容导出到excel表格,独创的excel导出数据算法,极速导出,支持任意系统,无依赖。
单击删除按钮,会弹出时间范围选择对话框,选择要删除的记录的开始时间和结束时间,单击确定,会将该时间段内的记录全部删除,结束时间必须大于开始时间。
单击清空按钮会先弹出询问框提示是否需要清空数据,单击确定则自动清空所有的记录,清空后不能恢复。
设备日志是指直接通过sdk协议,远程从NVR设备上拉取日志记录到本地显示,其余功能和本地日志一致,此功能未实现。
基本设置中有部分参数的切换会自动重启应用。
参数说明
参数说明
参数说明
其他说明
xxxxxxxxxx
381//数据库类型枚举
2enum DbType {
3 DbType_ODBC = 0, //odbc数据源
4 DbType_Sqlite = 1, //sqlite数据库
5 DbType_MySql = 2, //mysql数据库
6 DbType_PostgreSQL = 3, //postgresql数据库
7 DbType_SqlServer = 4, //sqlserver数据库
8 DbType_Oracle = 5, //oracle数据库
9 DbType_KingBase = 6, //人大金仓数据库
10 DbType_Other = 255 //其他数据库
11};
12
13//自动切换默认数据库端口
14void DbHelper::getDbDefaultInfo(const QString &dbType, QString &hostPort,
15 QString &userName, QString &userPwd)
16{
17 if (dbType == "MYSQL") {
18 hostPort = "3306";
19 userName = "root";
20 userPwd = "root";
21 } else if (dbType == "SQLSERVER") {
22 hostPort = "1433";
23 userName = "sa";
24 userPwd = "123456";
25 } else if (dbType == "POSTGRESQL") {
26 hostPort = "5432";
27 userName = "postgres";
28 userPwd = "123456";
29 } else if (dbType == "ORACLE") {
30 hostPort = "1521";
31 userName = "system";
32 userPwd = "123456";
33 } else if (dbType == "KINGBASE") {
34 hostPort = "54321";
35 userName = "SYSTEM";
36 userPwd = "123456";
37 }
38}
参数说明
参数说明
可以设置不同的场景不同的颜色,比如正常的系统消息显示白色,异常消息红色。
本系统所用的录像机信息,并没有实际的作用,也就是不一定要填写实际的录像机信息,留作备用后期使用,目前仅仅是作为生成设备的树状列表使用(类似于区域或分组),如果一个录像机都没有填写,则会自动生成一个默认的录像机信息。
字段说明
单击添加按钮,会自动规则生成默认的信息,直接表格中修改即可,修改好以后单击保存按钮保存所有的信息。
如果要删除某个录像机信息,需要先选中该行,然后单击删除按钮,删除后会自动保存。
单击清空按钮会对整个表进行清空操作,清空后数据不能恢复,慎用。
单击导入按钮,可以选择之前导出的csv格式的文件导入数据。
单击导出按钮,将表格数据导出到csv格式的文件,用户可以打开文件编辑,然后再次导入,这样可以作为简易的备份机制使用,也可将繁琐的基础数据录入交给小姑娘去做。
单击打印按钮可以将表格中的内容打印出来,打印前会弹出打印预览界面,可以自行做边距的调整等,可以查看等待打印的内容,翻页切换。
单击导出按钮可以将表格中的内容导出到excel表格,独创的excel导出数据算法,极速导出,支持任意系统,无依赖。
摄像机表信息,是整个系统中最核心的表,这里管理的所有的摄像机信息,并不是所有的字段都显示出来了,比如onvif地址、云台地址等都是隐藏的,因为无需添加更改,需要搜索自动添加的。
字段说明
单击添加按钮,会自动规则生成默认的信息,直接表格中修改即可,修改好以后单击保存按钮保存所有的信息。
如果要删除某个摄像机信息,需要先选中该行,然后单击删除按钮,删除后会自动保存。
单击清空按钮会对整个表进行清空操作,清空后数据不能恢复,慎用。
单击导入按钮,可以选择之前导出的csv格式的文件导入数据。
单击导出按钮,将表格数据导出到csv格式的文件,用户可以打开文件编辑,然后再次导入,这样可以作为简易的备份机制使用,也可将繁琐的基础数据录入交给小姑娘去做。
单击打印按钮可以将表格中的内容打印出来,打印前会弹出打印预览界面,可以自行做边距的调整等,可以查看等待打印的内容,翻页切换。
单击导出按钮可以将表格中的内容导出到excel表格,独创的excel导出数据算法,极速导出,支持任意系统,无依赖。
如果摄像机已经添加过,则搜索出来的摄像机对应行禁用不可选中。
基本步骤
特别说明
参数说明
轮询点管理界面,上侧是轮询点信息表,可以直接添加、删除、修改、清空轮询点信息,下侧是摄像机信息表,会自动加载,当摄像机信息变动后,这里会自动加载最新的数据。右下角是批量生成轮询点和轮询分组管理。
轮询点的添加有三种方式:手动添加、单个添加、批量添加。允许重复添加,没有过滤机制。
添加方式
如果要删除某个轮询点信息,需要先选中该行,然后单击删除按钮,删除后会自动保存。
单击清空按钮会对整个表进行清空操作,清空后数据不能恢复,慎用。
单击导入按钮,可以选择之前导出的csv格式的文件导入数据。
单击导出按钮,将表格数据导出到csv格式的文件,用户可以打开文件编辑,然后再次导入,这样可以作为简易的备份机制使用,也可将繁琐的基础数据录入交给小姑娘去做。
单击打印按钮可以将表格中的内容打印出来,打印前会弹出打印预览界面,可以自行做边距的调整等,可以查看等待打印的内容,翻页切换。
单击导出按钮可以将表格中的内容导出到excel表格,独创的excel导出数据算法,极速导出,支持任意系统,无依赖。
参数说明
轮询表信息可以通过已添加的摄像机信息表选中添加,也可以自定义规则批量生成视频流地址添加,这种应用场景非常多,比如现场是某一种品牌的摄像机,视频流格式固定,只需要设置好主码流子码流的视频流格式,便可批量生成。
参数说明
可添加、删除、修改、清空轮询分组名称,相当于轮询预案。
用户管理是后面增加的一个模块,用于设置不同的用户不同的类型+权限,可以细分到每个模块的权限,勾选表示具有该权限,内置了7种权限选择,后期还可以在此基础上增加其他权限等。
单击添加按钮,会自动规则生成默认的信息,直接表格中修改即可,修改好以后单击保存按钮保存所有的信息。
如果要删除某个用户信息,需要先选中该行,然后单击删除按钮,删除后会自动保存。不允许删除内置的admin用户。
单击清空按钮会对整个表进行清空操作,清空后数据不能恢复,慎用。
单击导入按钮,可以选择之前导出的csv格式的文件导入数据。
单击导出按钮,将表格数据导出到csv格式的文件,用户可以打开文件编辑,然后再次导入,这样可以作为简易的备份机制使用,也可将繁琐的基础数据录入交给小姑娘去做。
单击打印按钮可以将表格中的内容打印出来,打印前会弹出打印预览界面,可以自行做边距的调整等,可以查看等待打印的内容,翻页切换。
单击导出按钮可以将表格中的内容导出到excel表格,独创的excel导出数据算法,极速导出,支持任意系统,无依赖。
假设设置了用户没有退出系统和电子地图的权限,则关闭系统的时候会弹出错误信息提示当前用户没有权限。
基本步骤:
其他设置里面的内容之前在基本设置中,现在重新开一个窗体,因为后面可能还有各种各样的设置,预留空间。
系统中可能用到了多个串口通信,可以在这里选择对应的串口号和波特率。
系统中可能用到多种网络通信,比如软件主动连接服务器,需要填写TCP地址和端口,也可能软件作为服务端,填写TCP或者UDP监听端口。
切换到视频监控主界面,左侧设备列表,双击摄像机,自动通道播放,双击录像机则整个录像机下面的摄像机全部加载。
云台控制的前提是摄像机是通过onvif搜索的形式添加的,不然没有云台地址没法进行云台控制,当然也必须要求摄像机带云台,不带云台的摄像机是不能进行云台控制的。 先选中要进行云台控制的摄像机通道,边缘高亮,然后再单击右侧的云台控件,可以上下左右等移动,变倍和光圈没有用。
在系统设置中开启自动校时后,设备自动上线后会自动将本地时间同步到设备。
在系统设置中开启事件订阅后,一旦接收到设备的报警信息会显示到主界面左下角的信息栏,右下角弹出对应的报警信息。 摄像机要响应事件订阅,具体详细设置说明参见说明书其他说明中的摄像机报警输入设置。
操作说明
暂未实现
本系统主界面采用QMainWindow停靠窗体模式设计,这样可以自定义各种各样的子模块停靠悬浮等,不同的工作模式可以对应不同的模块,甚至可以拓展成不同的用户权限对应不同的主界面模块。所有子模块都是new出来的,支持任意多个。
视频监控系统支持多种工作模式,不同的工作模式可以有不同的主界面、悬停模块、布局方案。互相不影响。悬停模块可以有透明度,更具科幻感。
设备列表通过读取录像机信息(生成父节点,相当于区域,录像机信息本身在整个系统中目前就一个作为设备列表的区域信息功能,用户可以自行拓展作为其他用途。)、摄像机信息,自动生成设备列表,每个摄像机都对应一个主码流和子码流,支持各种视频流、本地视频文件、USB摄像机等。
窗口信息负责显示一些打印信息,比如串口是否打开成功,摄像机是否异常,各种报警日志等,可以在系统设置中设置不同的文字颜色,窗口信息的信息条数自动计算应用,保证最大可能的适应高度。
图文警情模块负责以图文的形式显示对应的警情或者提示信息,有时间、内容、图片,双击对应图片可以放大查看具体图片,为了方便演示如何使用,在此模块增加了右键菜单,可以添加消息、删除消息、清空消息。
云台控制模块,可以对选中的通道的摄像机(ONVIF协议),进行云台控制,可以控制球机的上下左右等各个方位的移动,还可以调节变倍步长,至于变焦和光圈,目前onvif协议中没看到对应的协议支持,没有实现。
云台移动总共有3种策略:绝对移动、相对移动、连续移动,本系统都支持三种策略,默认采用的连续移动,这也是大部分应用场景需要的,按下对应的方位进行移动,松开立即停止移动,非常人性化。
设备控制模块,可以对选中的通道的摄像机(ONVIF协议),进行获取参数、设置参数、手动校时、重启设备、抓拍图片、模拟报警等操作,可以对摄像机的明亮度、对比度、饱和度进行设置。后期还可能不断增加新的功能。
预置位功能,只对带有预置位的球机才起作用,有云台的球机未必有预置位,要仔细查看清楚,不清楚可以询问厂家或者查阅手册,在本模块中,可以获取预置位、添加预置位、调用预置位、删除预置位、调用起始位、设置起始位、开始巡航、停止巡航等。
获取预置位以后,会将获取到的预置位集合(一般有255个甚至更多)显示到列表中,前面是编号token,后面是预置位的别名name,别名可以是中文的,可以通过添加预置位的时候设置中文的名称。在每个预置位信息后面都有三个按钮:调用、添加、删除,直接单击即可执行相应的动作,拉伸子模块窗体对应名称列自动拉伸填充。
自动巡航目前采用的策略是通过勾选查询回来的预置位信息,勾选,然后定时器每隔一段时间调用一次对应的预置位来实现,每次正在执行哪个预置位会在列表中自动选中该预置位,后期如果有更好的处理方法会自动更新改进代码。
目前放在预置位中,后期可能会有改动。
悬浮地图子模块,使用的百度地图,支持在线和离线,用于显示对于设备的位置,支持鼠标直接拖动和缩放。具体和飞行轨迹模块类似。
专为无人机打造的模块,也可以作为机器人移动模块,通过传入一个经纬度值,实时更新设备的位置和绘制轨迹,模块已经内置了接口进行处理,支持不同设备不同的轨迹颜色(这个功能好)。
此模块留给用户自行填入内容。
数据调试模块,用于显示通信串口的数据,自定义不同颜色显示,可以勾选过滤某个串口进行数据查看,也可以选择所有数据,还可以勾选暂停显示复选框用来暂停打印显示信息。
此模块留给用户自行填入内容。
此模块留给用户自行填入内容。
网页浏览模块,用于传入一个网页地址,打开对应的网页进行浏览,可用于网页展示信息,支持多个,可以自行增加,代码中演示了一个。
本系统内置高达18套皮肤样式供用户选择,可以在系统设置中随意切换立即应用。
xxxxxxxxxx
261void 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}
备注:下面的截图和说明未必是最新的,但是大部分是一致的,整体的框架不会改变,可能会有新增加子模块和代码,或者部分类文件有调整或者删除,具体以最新的代码为准。
本系统采用模块化的设备,有用到第三方开源类库比如串口通信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_audio | 音频播放和录制,包括音频输入输出管理、音频曲线、音频播放、音频录制、音频振幅控件等。 |
core_common | 通用函数,包括通用秘钥、通用导航、通用样式、声音播放、日志记录、运行时间记录等。 |
core_control | 通用自定义控件,很多系统经常用到的控件全部放在这里,比如开关按钮、设备容器、设备按钮、颜色下拉框等。 |
core_dataout | 数据导入导出到xls/pdf和打印类库,极速、跨平台、无依赖。 |
core_db | 数据库通用类库比如数据库线程管理、数据清理、数据采集等。 |
core_form | 通用的用户登录、用户退出、用户管理、数据库配置界面类等。 |
core_map | 地图综合应用类库,百度地图(支持在线离线)和echart封装类等。 |
core_onvif | onvif功能封装类,包括设备搜索、云台控制、设备参数设置等。 |
core_qui | 通用的辅助类,包括自定义对话框,全局辅助函数,图形字体等。 |
core_tcpfile | 文件多线程收发类,支持多个并发。 |
core_video | 视频播放核心类,包括了监控画面切换控件、视频回放控件、视频播放组件结构体、视频播放辅助函数、视频解码线程类、视频显示控件类等。 |
core_videobase | 视频相关基类,包括音视频文件保存基类、视频解码基类、视频控件基类、视频悬浮工具栏、视频控件结构体等。 |
core_videoffmpeg | 视频监控内核ffmpeg版本,本系统默认采用的内核。 |
core_videoopengl | opengl封装类,支持打开yuv/nv12文件,绘制yuv/nv12帧数据,一般搭配ffmpeg视频内核显示视频,直接走GPU绘制。 |
core_videosave | 音视频保存组件,包括音频保存类、视频保存类、保存相关辅助函数类。 |
core_webview | 通用浏览器控件类,同时支持webkit、wenengine、miniblink三种内核,打通了所有的Qt版本。 |
名称 | 说明 |
---|---|
audiohelper | 音频相关辅助函数,比如获取音频输入输出设备、根据设备名称查找设备对象、初始化音频格式、获取对应音频格式最大振幅、获取对应音频格式音频数据的振幅级别等。 |
audiolevel | 音频振幅控件,根据传入的音频振幅大小绘制振幅,可设置颜色。 |
audioplayer | 音频播放类,可以设置声音大小和静音状态,支持带参数打开音频输入和输出设备,自动关联音频输入输出设备形成话筒和音响联动。 |
audioplot | 音频曲线类,包括初始化图表、添加振幅数据、添加音频数据等。 |
audiorecorder | 音频录制类,可以设置音频录制的参数,包括采样大小、比特率、通道数、质量级别、编码模式等。 |
名称 | 说明 |
---|---|
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 | 分页导航控件。 |
名称 | 说明 |
---|---|
formhelper | 封装的导入导出、导出数据到xls/pdf和打印数据、自动备份数据、保存最后打开的文件夹等。 |
frmconfigdb | 通用数据库管理界面类,可选不同的数据库类型,填入用户信息,执行检测连接和初始化数据操作。 |
frmconfiguser | 通用用户管理界面类,可添加、删除、修改用户信息,包括权限分配等,可导入导出打印用户信息。 |
frmlogin | 通用用户登录界面类,包括自动登录和记住密码复选框,多次密码错误校验,记住当前用户信息等。三次错误关闭,下拉可选用户,内置超级密码。 |
frmlogout | 通用用户退出界面类,三次错误关闭,下拉可选用户,内置超级密码。 |
userhelper | 通用用户权限管理类,内置7种类型权限,对应权限名称可自定义,一般在用户切换对应界面或者单击了对应功能按钮的时候触发。 |
名称 | 说明 |
---|---|
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 | 图片抓拍实现类,包括获取抓图地址、抓拍图片等。 |
本组件涵盖的功能较多,所以采用了分层管理代码结构。
名称 | 说明 |
---|---|
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 | 发送文件线程类,按照 文件开始符+文件大小+文件内容+文件结束符 逐个分包发送,可对文件的每个包进行加密传输。 |
视频组件继承和依赖关系说明:
名称 | 说明 |
---|---|
videobox | 监控画面切换控件,将所有通道切换处理全部集中到一个类,通用异形布局切换函数,可以参考进行自定义异形布局,通道布局切换发出信号通知,支持自定义子菜单布局内容。 |
videohelper | 视频播放内核辅助函数,比如根据url地址取出ip地址、校验网络地址是否可达、检查地址是否正常、加载解析内核到下拉框、根据地址获取本地摄像头参数、创建视频采集类、对采集线程设置参数等。 |
videomanage | 视频线程管理类,全局单例,将所有视频控件发给此类管理,负责挨个打开视频、应用录像计划等。 |
videoplayback | 视频回放控件,支持多个通道,显示每个通道对应的视频段。 |
videostruct | 视频播放组件结构体定义类,包括解析内核枚举值、视频类型枚举值、解码策略枚举值、视频采集参数结构体。 |
videotask | 视频任务线程类,全局单例,可以随时插入一些视频相关的任务进行处理,比如vlc录制视频后需要重命名文件,mpv内核关闭视频后鼠标指针打圈圈需要复位。 |
videothread | 视频解码线程类,内置了共享解码线程处理逻辑,可以打开视频、关闭视频、设置视频宽高比例、获取文件总时长、获取媒体信息、获取和设置播放位置、获取和设置播放速度、获取和设置音量大小、获取和设置静音状态等。 |
videourl | 视频地址相关静态函数,可以读取和写入地址到文本文件,用作历史记录,内置了各种类型(rtsp、http、音频文件、视频文件、网络文件、本地USB摄像头)的测试音视频地址集合。 |
videowidgetx | 视频播放控件,一个控件对应一个解码线程,提供播放成功、播放结束、收到截图、工具栏按钮单击等处理,提供开始播放、停止播放、暂停播放、继续播放、抓拍截图、开始录制、暂停录制、停止录制等接口。 |
名称 | 说明 |
---|---|
abstractsavethread | 音视频存储基类,可以设置需要保存的音视频文件类型,比如音频文件类型有pcm、wav、aac,视频文件类型有yuv、h264、mp4,提供开始保存、暂停保存、停止保存等接口。 |
abstractvideosurface | 视频回调基类,用于Qt中的QCamera和QMedia类播放后拿到回调视频数据,这样可以取到一张张图片。 |
abstractvideothread | 视频解码线程基类,摄像头采集线程和视频采集线程都继承自此类,将各种公用的变量、函数、接口、信号槽全部放在基类,包括了停止线程标志位、打开是否成功标志位、暂停采集标志位、开始截图标志位、正在录制标志位,提供了虚函数开始播放、停止播放、暂停播放、继续播放、抓拍截图、截图完成、开始录制、暂停录制、停止录制等,提供写入视频数据到文件、写入音频数据到文件槽函数。 |
abstractvideowidget | 视频显示控件基类, |
audioplayer | 音频播放类,空的,纯粹为了在没有Qt音频播放类QAudioOutput的时候使用,有些Qt版本或者嵌入式板子环境未必有这个类,但是又不能影响整个组件的运行,于是定义了空的类,函数正常调用但是不做任何处理。 |
bannerwidget | 悬浮工具栏控件,可以设置各种颜色、按钮图标集合、按钮名称集合、按钮提示信息集合等,悬浮条位置支持上下左右四个方位。 |
imagelabel | 图片标签控件,多线程绘制传入的图片,性能比setpixmap更优。 |
widgethelper | 窗体相关辅助函数,包括传入图片尺寸和窗体区域及边框大小返回居中区域(scaleMode: 0-自动调整 1-等比缩放 2-拉伸填充)、绘制矩形区域比如人脸框、绘制点集合多边形路径比如三角形、绘制路径集合、显示截图预览等。 |
名称 | 说明 |
---|---|
ffmpeghelper | 相关辅助函数,包括打印输出各种信息、打印设备列表和参数、格式枚举值转字符串、视频帧旋转、通用硬解码、通用软解码、通用软编码、释放数据帧数据包、超时回调(包括打开超时和读取超时)等。 |
ffmpegrun | 执行ffmpeg命令,包括yuv420p文件转mp4文件、mp4文件转yuv420p文件、wav文件转aac文件、合并aac以及h264文件或者mp4文件到带声音的mp4文件、转换视频文件到mp4文件等。 |
ffmpegrunthread | 执行ffmpeg命令行线程,可以设置执行完成是否删除转换前的文件、可执行文件路径,传入需要执行的指令即可。 |
ffmpegsave | 视频存储类,用于保存h264和mp4文件。 |
ffmpegsync | 音视频同步线程类,解码后的音视频数据发给本类进行时间同步处理,采用的外部时钟同步策略。音视频播放的进度也在本类中。 |
ffmpegthread | 视频解码线程核心,从打开地址、分配解码器、初始化参数、取出音视频数据解码、关闭并释放资源等都在本类实现。 |
名称 | 说明 |
---|---|
openglinclude | 当前组件头文件。 |
nv12glwidget | 空类,用于没有opengl的Qt版本中保证程序能够继续运行。 |
nv12openglwidget | 继承自QOpenGLWidget的NV12格式OPENGL绘制窗体。 |
yuvglwidget | 空类,用于没有opengl的Qt版本中保证程序能够继续运行。 |
yuvopenglwidget | 继承自QOpenGLWidget的YUV格式OPENGL绘制窗体。 |
名称 | 说明 |
---|---|
saveaudio | 音频保存类,继承自videobase组件中的abstractsavethread,可以设置音频文件类型、采样率、通道数等,支持pcm、wav、aac三种格式。 |
savevideo | 视频保存类,继承自videobase组件中的abstractsavethread,可以设置视频文件类型、宽度、高度、帧率,支持yuv原始数据格式。 |
savehelper | 音视频保存相关辅助函数,包括pcm文件转wav文件、aac文件采样率下标、aac文件添加adts头等。 |
名称 | 说明 |
---|---|
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,然后等待项目加载完毕。 由于项目中用到了ffmpeg和vlc,引用了对应的lib库,所以在用vs+qt的开发环境中,很可能报错提示映像是不安全的错误,导致编译通不过,需要做个设置。
解决方法
如果在数据库设置中选择了mysql数据库,需要对mysql数据库做个设置,就是将编码设置成utf8,已设置可以跳过,不然很可能数据库无法正常使用。
32位的Qt程序,带对应32位的libmysql动态库,可以访问32/64位的mysql数据库,64位的也是一样可以访问32/64位的mysql数据库,只需要带上对应位数的动态库就行。查看mysql是32位还是64位命令 mysql.exe -V。
在加载USB摄像机的时候,需要填写对应USB设备的名称,可以通过命令行和设备管理器查看对应的名称,要英文的。
在需要加载多个USB摄像机的场景下,有时候会遇到同名的USB名称设备,此时需要打开注册表进行设备名称修改后,按照新修改后的设备名称填入即可。
如果是在虚拟机中打开USB摄像头,你需要对虚拟机做点设置,默认USB2.0需要改成USB3.1。
整个项目源代码行数大概30W行,其中代码13.5W行(占比45%),注释12.7W行(占比42%),空行3.5W行。分层设计注释详细。
下面是linux系统编译ffmpeg步骤
编译ffmpeg支持x264/x265编码
windows系统采用mingw编译ffmpeg https://blog.csdn.net/yp18792574062/article/details/108962638
xxxxxxxxxx
51int main(int argc, char *argv[])
2{
3 QApplication::setAttribute(Qt::AA_EnableHighDpiScaling); QApplication::setHighDpiScaleFactorRoundingPolicy(Qt::HighDpiScaleFactorRoundingPolicy::PassThrough);
4 QApplication a(argc, argv);
5}
xxxxxxxxxx
21[Platforms]
2WindowsArguments = dpiawareness=0
本系统除了支持直连各种数据库比如mysql、postgresql、sqlserver、oracle数据库,也支持odbc数据源的形式连接以上各种数据库,在配置数据源的时候,记得区分32、64位,对应数据源后面带有32/64一起字样的说明该数据源可以同时支持32位和64位的程序访问,不带的要用对应位数的才能访问。数据库名称记得填写的是数据源对应的名称,而不是数据源连接的数据库名称,很多人会搞错。
摄像机音频编码可选多种格式,建议选择用AAC格式。
使用对应的数据库需要Qt中对应的数据库插件支持才行,由于Qt版本众多,数据库插件有增有减,在打开数据库失败的时候如果提示数据库驱动未找到,一定先要看下自己所用Qt套件版本有没有该数据库插件,没有的话要自行编译,或者更换其他版本试试。 大概从Qt5.12.5版本开始不自带mysql数据库插件,一定要自己编译。编译的过程有一定难度,建议耐心多试几次。
编译数据库插件通用步骤:
xxxxxxxxxx
31path = C:/Qt/mysql-5.7.30-winx64
2INCLUDEPATH += $$path/include
3win32:LIBS += -L$$path/lib -llibmysql
xxxxxxxxxx
31path = C:/app/Administrator/product/11.2.0/client_1
2INCLUDEPATH += $$path/oci/include
3win32:LIBS += -L$$path/oci/lib/msvc -loci