当前位置: 首页 > news >正文

纯Qt代码实现onvif协议设备端/onvif设备模拟器/onvif虚拟监控设备/桌面转onvif

一、前言说明

在视频监控系统的开发中,ONVIF(Open Network Video Interface Forum)作为行业标准协议,被广泛应用于设备与平台之间的互联互通。通常我们认为,ONVIF 协议的设备端实现应运行在摄像头等嵌入式下位机上,由固件直接处理协议交互。然而,在实际开发过程中,我们发现:使用 Qt 在 PC 端实现一个完整的 ONVIF 设备模拟器,不仅可行,而且极具实用价值。

很多人认为 ONVIF 模拟器只是为了方便平台调试而存在的“测试工具”。但深入一线业务后我们会发现,它其实能解决一些长期被程序员忽略的实际问题。例如,在零售行业的收银系统中,虽然已有物理摄像头对准收银台进行录像,但往往只能看到操作动作,无法清晰记录电脑界面上的具体操作细节——比如是否误删订单、有无私自打折、甚至是否存在非工作行为。这时,如果能将收银电脑的桌面画面虚拟成一路 ONVIF 摄像头通道,并接入现有的 NVR 或视频管理平台(VMS),就能实现“操作过程+现场画面”的双重记录。一旦发生纠纷或异常事件,管理员可直接调阅对应时间点的桌面操作录像,快速定位问题,极大提升取证效率与管理透明度。这正是 ONVIF 设备模拟器的核心价值之一:让非视频设备具备标准化的视频输出能力,无缝融入现有监控体系。

除了真实业务需求外,ONVIF 模拟器在研发阶段也扮演着不可或缺的角色。在开发视频监控平台软件时,通常需要连接大量 ONVIF 设备进行功能验证和性能压测。但在实际工作中常常面临以下困境:

  • 真实设备数量有限,多人协作时容易被占用;
  • 远程办公或在家调试时无法访问硬件环境;
  • 需要模拟数百甚至上千路设备来测试平台接入能力;
  • 要验证多品牌兼容性、异常响应处理等边界情况。

此时,一个灵活可控的 ONVIF 模拟器就显得尤为重要。它可以:

  • 将本地视频文件或屏幕画面模拟为虚拟摄像头;
  • 动态生成多个 ONVIF 设备实例;
  • 支持自定义设备信息、编码参数、网络行为;
  • 配合压力测试,评估平台在高并发下的 CPU/GPU/内存占用情况。

通过模拟器,我们可以轻松验证诸如“是否支持64路同时预览”、“NVR 接入千路设备后稳定性如何”等问题,真正做到闭环测试。

二、效果图

Snipaste_2025-10-01_14-52-03

Snipaste_2025-10-01_14-59-31

Snipaste_2025-10-01_15-00-11

Snipaste_2025-10-01_15-00-46

三、相关地址

  1. 国内站点:https://gitee.com/feiyangqingyun
  2. 国际站点:https://github.com/feiyangqingyun
  3. 个人作品:https://blog.csdn.net/feiyangqingyun/article/details/97565652
  4. 文件地址:https://pan.baidu.com/s/1d7TH_GEYl5nOecuNlWJJ7g 提取码:01jf 文件名:bin_video_simulate。

四、功能特点

  1. 标准onvif协议,支持设备搜索、获取参数、快照抓图等。
  2. 支持264/265/aac等标准视音频协议传输。
  3. 支持多路批量onvif设备模拟,每一路都独立的端口。
  4. 支持本地摄像头采集转成onvif,可选择不同的设备、分辨率、帧率等参数。
  5. 支持本地桌面采集转成onvif,可选择不同的屏幕、分辨率、帧率等参数。
  6. 支持各种视频文件和视频流转成onvif,可重新设置编码转换以及分辨率转换。
  7. 支持4K、8K等高清分辨率,不限制分辨率,非264/265会自动转码推流。
  8. 每一路都可以设置统一或者独立的用户验证信息,为空则表示不验证。
  9. 可以把任意内容接入到NVR以及视频监控系统,方便保存录像文件,以便回放可查。
  10. 也可作为压力测试工具,比如模拟几千路onvif设备,让集成平台软件做接入压力测试。
  11. 推出去的流不仅有rtsp格式,还支持rtmp、http、flv、ws-flv、webrtc等方式访问,可以直接网页查看。
  12. 在管理工具上可以看到每一路的推流状况以及分辨率信息,非常直观。
  13. 支持自动重连拉流,重连推流,保证7乘以24小时稳定运行。
  14. 可设置开机自启动运行和后台运行,不显示在任务栏,作为后台服务运行。
  15. 可批量添加文件、添加目录,自动将目录下的所有文件添加到模拟器。
  16. 多功能添加地址面板,可以选择本地设备和监控设备,本地设备会自动识别摄像头设备和桌面设备,监控设备可以选择不同厂家,自动填充对应rtsp格式,填入用户信息即可,可以批量递增添加监控设备。
  17. 可无缝上传到市面上所有的onvif协议设备,包括海康、大华、宇视、华为、天地伟业等,也支持ONVIF Device Manager国际onvif工具。
  18. 支持gb28181设备模拟,具备设备注册、设备注销、设备心跳、设备信息、设备配置、设备状态应答等。
  19. 支持模拟报警和位置上报等,方便平台侧显示对应设备的实时位置。
  20. 支持一键添加批量模拟28181设备,实时显示已注册和已注销状态。
  21. 支持将本地桌面、本地摄像头、任意视频文件、视频流文件、手机摄像头等转换成28181设备,添加到NVR或者国标软件平台。
  22. sip协议同时支持udp和tcp两种通信方式,视频点播同时支持udp/tcp主动/tcp被动三种方式,涵盖所有可能的场景需求。
  23. 无论是onvif设备模拟组件还是28181设备模拟组件,全部原创底层协议解析,纯Qt实现,跨任意平台。
  24. 代码结构框架非常清晰,注释详细,代码精简不繁琐,非常易于学习和移植,可以很容易拓展其他接口需求。
  25. 支持Qt4/Qt5/Qt6以及后续所有版本、所有编译器、所有开发环境。
  26. 支持windows、linux、mac、国产OS、嵌入式linux、RK3588、树莓派、香橙派等系统。

五、相关代码

  1. 拷贝依赖组件 core_video/core_videobase/core_videoffmpeg/core_videohelper/core_onvifdevice到你的项目目录下,其中onvifdevice组件是onvif设备模拟的核心,由onvif搜索、onvif监听交互、rtsp推流三部分共同组成,推流模块依赖core_video/core_videobase/core_videoffmpeg/core_videohelper四个模块。
  2. pro文件中引入组件
include ($$PWD/../core_video/core_video.pri)
include ($$PWD/../core_videobase/core_videobase.pri)
include ($$PWD/../core_videohelper/core_videohelper.pri)
include ($$PWD/../core_videoffmpeg/core_videoffmpeg.pri)
include ($$PWD/../core_onvifdevice/core_onvifdevice.pri)
  1. pro文件开启对应标记,DEFINES += ffmpeg ffmpeg4 videoffmpeg ,其中ffmpeg4表示所用的ffmpeg版本,按照实际情况更改。
  2. 引入头文件 #include "onvifdeviceserver.h"。
  3. 编写代码实现onvif设备服务。
//实例化onvif管理类
OnvifDeviceServer *server = new OnvifDeviceServer(this);
//设置对应的参数
server->setPara("192.168.0.110", "192.168.0.110", "admin", "123456");//按需关联信号槽/可以不需要
connect(server, SIGNAL(sendData(QByteArray)), this, SLOT(sendData(QByteArray)));
connect(server, SIGNAL(receiveData(QByteArray)), this, SLOT(receiveData(QByteArray)));
connect(server, SIGNAL(receiveInfo(QString)), this, SLOT(receiveInfo(QString)));
connect(server, SIGNAL(receiveError(QString)), this, SLOT(receiveError(QString)));
connect(server, SIGNAL(pushStart(QString, int, int, bool)), this, SLOT(pushStart(QString, int, int, bool)));
connect(server, SIGNAL(pushChanged(QString, int)), this, SLOT(pushChanged(QString, int)));//启动服务
server->start();//添加一路模拟服务/文件方式
server->append("video1", 6920, "f:/1.mp4", "rtsp://192.168.0.110:8554/stream/video1");
//添加一路模拟服务/本地摄像头
server->append("video2", 6921, "video=USB Video Device|1280x720|30", "rtsp://192.168.0.110:8554/stream/video2");
//添加一路模拟服务/本地桌面
server->append("video3", 6922, "screen=desktop", "rtsp://192.168.0.110:8554/stream/video3");
//添加一路模拟服务/监控设备
server->append("video4", 6923, "rtsp://admin:Admin123456@192.168.0.64/Streaming/xxx", "rtsp://192.168.0.110:8554/stream/video4");//添加一路模拟服务/内存流
server->append("video5", 6924, "stream://", "rtsp://192.168.0.110:8554/stream/video5");
//内存流方式对一个步骤/需要拿到数据后不断的添加进去
QByteArray data = "xxxx";
server->appendData("video5", data);//停止服务
server->stop();
  1. 特别说明
  • 使用append方法添加模拟,可以在启动后添加也可以在启动前添加,如果是启动前添加的,则启动服务后会自动启动服务,如果是启动前添加的,则在调用onvifServer->start()的时候里面会自动判断进行启动服务。
  • 关联信号槽并不是必须的,按照自己的实际需求来,比如需要知道推流成功和变化信号,那就需要关联对应的信号到槽进行处理。
  • 在不需要服务的时候一定要关闭服务,一般是在软件退出的时候,否则会内存泄漏。
  • onvif管理类目前需要设置四个参数,外网地址、内网监听地址、用户名称、用户密码,其中用户信息用来做onvif鉴权服务,每一路都可以不同的用户信息,这里图方便直接统一一个用户就行。为何还有个外网地址,这种情况一般是在云服务器上才需要的,上面的内网监听地址和对外服务的外网地址都不同,在本地电脑一般两个地址都是一样的。
  • 添加模拟服务支持多种媒体源,其中格式要求可以参见编译说明的地址格式说明。支持将本地视频文件、视频流、网络地址、本地摄像头、本地桌面等,每一种对应的格式要求都不一样。
  • 添加模拟服务append函数有四个参数,参数1表示唯一标识;参数2表示监听端口,每一路都是不同的监听端口;参数3表示采集媒体源地址,如果是内存流则填 stream:// 固定字串;参数4表示推流地址,默认采用mediamtx流媒体服务,8554端口,也可以换成其他流媒体服务比如zlm,只要地址和端口正确就行,要求推流地址的后缀就是唯一标识。
http://www.hskmm.com/?act=detail&tid=22316

相关文章:

  • *补*““逆元求组合数”(费马小定理
  • C# WPF中Binding的 Source属性和ElementName属性有什么区别
  • Typora to Obsidian 迁移助手 (Typora-to-Obsidian-Migration-Helper)
  • 64. 最小路径和
  • 题解:P1020 [NOIP 1999 提高组] 导弹拦截
  • 哈希表专题
  • Meta基础设施演进与AI技术革命
  • 完整教程:Spring AI整合聊天模型DeepSeek
  • 2025 年焚烧炉厂家 TOP 企业品牌推荐排行榜!权威甄选实力与口碑俱佳的江苏焚烧炉 / 无锡焚烧炉推荐这十家公司!
  • 2025 年防腐涂料厂家 TOP 企业品牌推荐排行榜,乙烯基、环氧煤沥青、环氧防腐涂料、防腐涂料地坪 、防腐涂料水池推荐这十家公司!
  • 2025双氧水厂家权威推荐榜:优质供应与专业定制实力之选
  • Win环境下包管理工具
  • MX Round 11 解题报告
  • 用 C# 打造企业资产管理系统雏形——从控制台到完整模块设计 - 详解
  • java开发之微信机器人的二次开发
  • 10.1刷题计划一
  • 笔记本电脑重装系统后找不到5G WIFI无线网或蓝牙模块消失的解决方案
  • 菜鸟坚持记录-开头篇
  • AI+传统工作流:Photoshop/Excel的智能插件开发指南 - 实践
  • Typora 笔记迁移 Obsidian 图片附件库批量移动方法,适用于笔记整理。
  • 2025年确有专长培训权威推荐榜:专业资质与特色诊疗口碑之选
  • 开源 C# 快速构建(五)自定义控件--仪表盘
  • 2025中医师承培训、考试、认证机构权威推荐榜:名师传承与临床实践口碑之选
  • 电子文件分类整理与双向同步 2025年10月1日
  • C++版搜索与图论算法 - 详解
  • 62. 不同路径
  • 达成设计卓越:全面解析 IC 设计中的验证之道
  • Typora 笔记迁移 Obsidian 图片链接转换
  • Java 运行 Word 文档标签并赋值:从基础到实战
  • 词云组件