• 45阅读
  • 0回复

Qt开发国产视频监控系统/手撕代码实现/加密保存播放记录/支持kylin和uos国产系统 [复制链接]

上一主题 下一主题
离线liudianwu
 

只看楼主 正序阅读 楼主  发表于: 11-12


## 一、前言说明
视频监控系统采用纯Qt+ffmpeg实现,所有UI用的QWidget,外观这块主要是qss+自定义控件,ffmpeg负责解码,尤其是支持硬解码,然后解码出来的yuv和nv12数据用qpainterwidget展示,硬解码+GPU绘制这个组合非常高效,在各个系统和平台上测试下来,资源占用低,性能极好。

整个监控系统,能够拿的出手的细节数不胜数,至少200个,是不是很惊讶哪来的这么多细节?因为本监控系统好歹也是开发了十几年,一直在实际现场N多用户无数复杂的场景使用,光用户提出来的合理的实际需求,起码能打印十张A4纸,正是因为有这些实际场景的反馈,才能不断迭代,发展到今天,无数个日日夜夜做过无数的调整,修复bug,增加人性化操作处理,其中加密保存播放记录就是其中一个小细节。

一开始并没有播放记录的处理,后面用户希望重新打开监控系统后,能够主动加载上一次没有关闭的画面,而不是让用户又去双击通道打开,所以单独做了个开关saveurl,开启后就会自动将最后的画面的媒体地址保存到url.txt文本文件,前面有对应的通道序号,下次软件启动后,先读取这个文件,依次去打开视频通道。后面实际使用过程中发现问题,毕竟现场都是外接的监控摄像头,都是个带用户鉴权新的rtsp地址,明文存储在文本文件,很容易泄露,增加摄像头的风险,所以必须有密文存储的机制,加载的时候解密转换成真实的url地址。实现完成后,还特意做了个开关,需要这个功能的时候开启,默认关闭,因为很多用户又希望直接从播放记录文件复制地址放到vlc播放器验证。

## 二、效果图



## 三、相关地址
1. 国内站点:[https://gitee.com/feiyangqingyun](https://gitee.com/feiyangqingyun)
2. 国际站点:[https://github.com/feiyangqingyun](https://github.com/feiyangqingyun)
3. 个人作品:[https://blog.csdn.net/feiyangqingyun/article/details/97565652](https://blog.csdn.net/feiyangqingyun/article/details/97565652)
4. 文件地址:[https://pan.baidu.com/s/1d7TH_GEYl5nOecuNlWJJ7g](https://pan.baidu.com/s/1d7TH_GEYl5nOecuNlWJJ7g) 提取码:01jf 文件名:bin_video_system

## 四、功能特点
1. 视频监控主界面采用停靠窗体模式,所有功能以可拖拽的小模块形式集成,支持任意自定义模块加入。  
2. 所有停靠模块(如设备列表、图文警情、窗口信息、云台控制、预置巡航、视频轮询、设备控制、悬浮地图、网页浏览等)均可自由拖动至任意位置嵌入或悬浮,支持最大化、全屏及多屏显示。  
3. 支持“显示所有模块”、“隐藏所有模块”、“复位普通布局”、“复位全屏布局”等布局管理操作。  
4. 采用双重布局文件存储机制:普通模式与全屏模式各自保存独立布局,自动切换;全屏模式可实现透明模块叠加,视觉更具科技感。  
5. 所有停靠模块自动生成对应菜单项,可通过标题栏右键控制其显示或隐藏。  
6. 视频监控面板支持 1、4、6、8、9、13、16、25、36、64 等多种画面布局切换。  
7. 支持全屏切换,方式包括鼠标右键菜单、工具栏按钮、快捷键(Alt+Enter 进入全屏,Esc 退出)。  
8. 支持视频轮询功能,可在 1/4/9/16 画面下进行轮询,支持设置轮询分组(预案)、轮询间隔、码流类型等。  
9. 摄像机节点可直接拖曳到视频窗体播放实时流;也支持拖曳本地视频文件(MP4、RMVB、AVI 等)直接播放。  
10. 设备树双击分组节点可自动打开该组下所有视频通道;双击设备子节点则直接播放对应视频流;系统自动加载上次展开的节点状态。  
11. 设备树支持多级自定义分组:可添加、删除、修改分组,支持任意层级结构。  
12. 设备树可配置:是否放大字体显示、是否显示主/子码流节点、是否自动隐藏空组(无设备的分组)。  
13. 视频通道支持拖曳交换位置,响应即时;也支持将通道拖出监控面板外删除。  
14. 删除视频支持多种方式:鼠标右键删除、悬浮条关闭按钮、拖出面板外删除等。  
15. 支持 ONVIF 协议,兼容海康、大华、宇视、天地伟业、华为等主流厂商设备。  
16. 支持 ONVIF 设备搜索(UDP 广播 + HTTP 请求),不依赖 gsoap 等第三方组件,采用原创轻量级协议解析机制。  
17. 支持 ONVIF 云台控制:上下左右移动、焦距调整、复位等操作。  
18. 支持 ONVIF 预置位管理:可添加、删除、修改预置位,并调用指定预置位。  
19. 支持 ONVIF OSD 配置:可增删改查屏幕叠加信息。  
20. 支持 ONVIF 图像参数调节:亮度、对比度、饱和度、锐度等。  
21. 支持 ONVIF 其他设备控制:抓拍图片、校对时间、系统重启、网络配置、事件订阅等。  
22. 支持多种音视频流协议:RTSP、RTMP、HTTP、SRT、WebSocket(WS)等。  
23. 支持播放本地音视频文件:MP4、RMVB、AVI 等常见格式。  
24. 支持采集本地设备:包括摄像头、麦克风、桌面录屏,可设置分辨率、帧率,支持多显示器采集。  
25. 支持设置视频流传输方式(TCP/UDP)及解码策略(速度优先、质量优先、均衡、最快速度)。  
26. 默认采用 OpenGL 渲染视频,CPU 占用极低,支持 YUYV 和 NV12 格式,性能优异。  
27. 支持多内核自由切换:FFmpeg(默认推荐)、VLC、MPV 等,提供跨平台编译库(含 Linux/macOS)。  
28. 支持多平台硬解码:Windows(DXVA2、D3D11VA)、Linux(VAAPI、VDPAU)、macOS、嵌入式 Linux(RKMPP)等。  
29. 支持辅屏预览:可在多个屏幕分别打开最多 64 通道视频,按需显示。  
30. 支持超时自动隐藏鼠标指针及自动进入全屏机制,适用于无人值守场景。  
31. 支持视频截图:可对单个或所有通道同时截图;底部工具栏及每个视频控件的悬浮条均提供抓拍按钮。  
32. 支持音视频同步显示,并可将音视频同步录制保存为 MP4 文件。  
33. 支持手动录像:通过视频悬浮条一键启停录像。  
34. 支持自动录像计划:每个通道可独立配置 7×24 小时、每半小时粒度的录像开关策略。  
35. 录制的视频文件可导出至指定目录,并支持批量上传至服务器。  
36. 视频回放模块支持本地回放、网络回放、远程回放、图片回放及视频上传功能。  
37. 电子地图模块支持图片地图与网页地图,可在地图上显示设备点位。  
38. 图片地图上的设备图标可自由拖动,位置信息自动保存。  
39. 在图片地图或网页地图上双击设备图标,可弹出对应实时视频预览。  
40. 网页地图支持视图切换、设备运动轨迹显示,鼠标按下可获取经纬度用于更新设备位置。  
41. 支持在地图上单击获取经纬度,便于手动校准设备地理坐标。  
42. 日志查询模块支持查看本地日志和设备日志。  
43. 系统设置模块包含:基本设置、视频参数、数据设置、颜色配置、功能激活、录像机管理、摄像机管理、轮询配置、录像计划、用户管理及其他扩展设置。  
44. 摄像机/录像机管理支持增删改、导入导出、打印,修改后立即生效,无需重启软件。  
45. 支持一键搜索 ONVIF 设备,并批量添加;NVR 设备可一键添加其下所有子摄像机。  
46. 支持手动设置 IP 起始地址与数量,批量生成摄像机信息。  
47. 支持完善的用户权限管理:不同用户可分配不同模块权限(如删除日志、关闭系统等)。  
48. 支持多种数据库:SQLite、MySQL、SQL Server、PostgreSQL、Oracle、人大金仓等。  
49. 内置原创高性能组件,包括:数据导入导出(支持 XLS、PDF、打印)、数据库管理(含自动清理线程、万能分页)、地图组件、视频监控组件、文件多线程收发、ONVIF 通信、通用浏览器内核等。  
50. 提供自定义对话框体系:信息框、错误框、询问框、右下角通知(支持多种样式)。  
51. 支持精美换肤:提供 20 套统一风格皮肤,覆盖菜单、工具栏、控件等全部界面元素。  
52. 实现通道与设备树双向高亮联动:选中视频通道时,对应设备树节点高亮;反之亦然,便于快速定位。  
53. 视频控件悬浮条和底部小工具栏均支持自定义扩展按钮。  
54. 双击摄像机节点自动播放视频;支持“依次添加”模式(自动跳转下一节点);双击父节点可批量播放其下所有设备视频;可选择主码流或子码流。  
55. 所有操作(如双击播放、拖曳交换、布局调整)均自动保存最后状态,下次启动时自动恢复播放地址与界面布局。  
56. 右下角音量控制条失去焦点自动隐藏,带静音图标,并自动记忆音量值与静音状态。  
57. 支持标签与图形信息三种绘制方式:绘制到遮罩层、绘制到图片、源头绘制(可随视频存储)。  
58. 各功能模块可单独激活或禁用,便于按项目需求灵活组合(如仅启用本地回放、隐藏电子地图等)。  
59. 常用功能高度封装为全局静态接口,调用简单,配套丰富示例,极大降低二次开发门槛。  
60. 支持高度定制化扩展,可在此基础上衍生专用监控系统,如机器人监控、无人机监控、挖掘机监控、广播监控等。  
61. 全平台兼容:支持 Windows(XP/7/10/11)、Linux、macOS、国产操作系统(UOS、中标麒麟、银河麒麟等)及嵌入式 Linux。  
62. 项目代码注释完整,结构清晰,提供超级详细开发手册,涵盖每个源文件功能说明,并持续迭代更新。  

## 五、相关代码
```cpp
//count表示运算的次数/0则表示不处理
QByteArray UrlUtil::getEncryptDecrypt(const QByteArray &data, bool encrypt, int count)
{
    QByteArray buffer = data;
    while (count > 0) {
        count--;
        buffer = encrypt ? buffer.toBase64() : QByteArray::fromBase64(buffer);
    }

    return buffer;
}

void UrlUtil::readUrls(const QString &fileName, QStringList &urls, bool decrypt)
{
    QFile file(fileName);
    if (!file.open(QFile::ReadOnly | QFile::Text)) {
        return;
    }

    QTextStream in(&file);
    int count = urls.count();
    while (!in.atEnd()) {
        //每次读取一行
        QString line = in.readLine();
        //去除空格回车换行
        line = line.trimmed();
        line.replace("\r", "");
        line.replace("\n", "");
        //空行或者注释行不用处理
        if (line.isEmpty() || line.startsWith("#")) {
            continue;
        }

        //格式: 0,rtsp://192.168.1.200
        int index = line.indexOf(",");
        if (index < 0) {
            continue;
        }

        //替换成新的地址/从第一个逗号到末尾都是地址
        int channel = line.left(index).toInt();
        if (channel >= 0 && channel < count) {
            QString url = line.mid(index + 1);
            urls[channel] = getEncryptDecrypt(url.toUtf8(), false, decrypt ? 3 : 0);
        }
    }

    file.close();
}

void UrlUtil::writeUrls(const QString &fileName, const QStringList &urls, bool encrypt)
{
    QFile file(fileName);
    if (!file.open(QFile::WriteOnly | QFile::Text)) {
        return;
    }

    QTextStream out(&file);
    int count = urls.count();
    for (int i = 0; i < count; ++i) {
        QString url = urls.at(i);
        if (!url.isEmpty()) {
            url = getEncryptDecrypt(url.toUtf8(), true, encrypt ? 3 : 0);
            out << QString("%1,%2\n").arg(i).arg(url);
        }
    }

    file.close();
}
```
欢迎关注微信公众号:Qt实战/Qt入门和进阶(各种开源作品、经验整理、项目实战技巧,专注Qt/C++软件开发,视频监控、物联网、工业控制、嵌入式软件、国产化系统应用软件开发) QQ:517216493  WX:feiyangqingyun  QQ群:751439350
快速回复
限100 字节
 
上一个 下一个