在工业安防场景中,原有监控系统仅支持实时查看,无本地存储和告警联动能力,设备异常时无法追溯视频录像,运维响应延迟超 30 分钟。本项目旨在开发一款基于 Qt 的视频监控上位机,实现视频实时播放、多协议数据接收、告警联动存储,目标将运维响应时间缩短至 5 分钟内,支持 30 天以上视频本地归档。
软件功能、核心功能模块的介绍
核心功能包括 4 个模块:
视频播放模块:基于 FFmpeg 封装实现网络 / 本地视频流解码与实时渲染,支持暂停、重启等控制;
多协议数据接收模块:通过 WebSocket 接收设备状态数据,通过 ZeroMQ 接收告警事件(如设备离线、画面异动);
视频存储模块:支持手动 / 告警触发的视频本地存储,按设备 ID + 时间戳自动命名文件;
告警联动模块:接收到 ZeroMQ 告警后自动弹出弹窗、闪烁状态栏,并触发对应时段视频存储。
业务流程、功能路径描述
设备端推送视频流→上位机通过 FFmpeg 解码后渲染到 UI 界面;
服务端通过 WebSocket 推送设备在线状态→上位机解析后更新状态栏;
服务端通过 ZeroMQ 推送告警信息→上位机弹窗提醒并自动启动视频存储;
用户可手动选择时段或触发条件,导出本地存储的视频文件。
整体架构和设计思路
项目采用Qt MVC 架构,分为 UI 层、业务逻辑层、底层工具层:
UI 层:使用 Qt Widgets 构建界面,通过信号槽实现跨线程通信;
业务逻辑层:封装 FFmpegPlayer、WebSocketClient、ZmqReceiver 三个核心工具类,解耦业务与底层实现;
底层工具层:FFmpeg 负责音视频编解码,Qt WebSocket 负责常规数据通信,ZeroMQ 负责高并发告警接收,多线程处理耗时操作避免 UI 阻塞。
负责FFmpeg 封装与视频存储模块的开发:
封装 FFmpegPlayer 类,实现视频流解码、渲染,支持 1080P@30fps 视频流畅播放,CPU 占用率控制在 20% 以内;
实现视频存储功能,支持告警联动存储,单文件最大支持 2 小时连续录制,存储文件完整率达 99.5%;
优化解码缓存逻辑,将视频首帧加载时间从 2s 缩短至 0.8s。
难点 1:FFmpeg 解码线程与 UI 线程渲染不同步,导致画面卡顿。
解决方案:使用 Qt 的QThread将解码逻辑放到子线程,通过signal/slot传递解码后的QImage,在 UI 线程异步渲染,避免阻塞。
难点 2:ZeroMQ 告警接收时高并发消息导致 UI 假死。
解决方案:将 ZeroMQ 的消息循环放到独立线程,通过QMetaObject::invokeMethod()在 UI 线程更新告警提示,保证 UI 响应流畅。
难点 3:视频存储时中途断电导致文件损坏。
解决方案:在停止存储时调用 FFmpeg 的av_write_trailer()写入文件尾,同时定期检查磁盘剩余空间,不足时自动停止存储并提示用户。