惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

阮一峰的网络日志
阮一峰的网络日志
J
Java Code Geeks
Martin Fowler
Martin Fowler
宝玉的分享
宝玉的分享
V
Visual Studio Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
M
MIT News - Artificial intelligence
U
Unit 42
博客园 - 三生石上(FineUI控件)
博客园 - 聂微东
The GitHub Blog
The GitHub Blog
I
InfoQ
WordPress大学
WordPress大学
H
Help Net Security
D
Docker
B
Blog
腾讯CDC
A
About on SuperTechFans
Recent Announcements
Recent Announcements
雷峰网
雷峰网
有赞技术团队
有赞技术团队
C
Check Point Blog
Y
Y Combinator Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC

博客园 - 飞扬青云

AI编程道心崩塌/十几年Qt开发经验一文不值 就说逆不逆天/支持高达500路监控画面/多个屏幕同时显示/轻松实现跨屏实时监控 高程海拔离线实时查询显示终极版/体验友好/全网首创极精简版本/可输入地址或者经纬度查询 Qt实现很好玩的滤镜效果/高斯模糊径向模糊/底片锐化暗角鱼眼/多点矫正几何矫正边缘融合/扭曲网格调整 震惊都6202年了/地图控件居然支持Qt4这个老古董/支持国产军工低配Qt环境 Qt代码实现地图瓦片电子放大/无极缩放/可将层级拓展到22级别/精确到0.03米 纯QWidget绘制打造地图组件/极速加载瓦片地图/放大缩小地图过渡效果 这才是地图控件该有的样子/不依赖js和qml/纯古法原创自研/纯代码绘制/最新版含泪发布 效果拉满/纯Qt实现海图地图展示/矢量底图+海图+路网标记任意多层叠加/完美支持海图叠加与多投影系 GB28181视频监控推流服务/点播预览推流/录像回放推流/指令预览推流/指令回放推流/自动预览推流 Qt电子地图叠加海图/全世界海图叠加到天地图图层/1-18级海图实时查看 超级屌的动态测距交互功能/耗时几万个脑细胞/自研原创地图控件 Qt纯原创代码实现GB28181组件/自动点播拉流并推流/支持录像回放和下载/性能凶残 全网原创再次熬夜升级/支持云台预置位的onvif设备模拟器/虚拟监控摄像头/可设置主码流子码流 使用ffmpeg播放不同节目/实时切换节目并推流/推流不同的节目流 新版监控GB28181调试神器V2026发布/对标wvp/绿色版开箱即用 对标国际Onvif工具odm/新版视频监控onvif调试助手V2026发布/简单好用开箱即用 全网唯一/不依赖浏览器和qlocation/纯代码绘制实现的地图组件/短小精悍 监控设备模拟神器V2026全新含泪发布/支持onvif和gb28181/支持云台控制和预置位 将地图组件运行在浏览器上/qtlocation都做不到/轻巧好用/自研原创 不依赖任何AI代码/纯qpainter实现的航线规划/飞行轨迹规划和模拟/无人机轨迹 如何快速搭建一套支持ONVIF的安防监控系统 没有想不到只有做不到/万能地图标注点marker设计/各种参数需求场景/你要的都有 呕心沥血/历时半年/古法编程/纯QPainter实现的地图控件/性能爆表 绘制1000个无人机只需7ms/优化到极致/地图组件海量标注点/纯QPainter绘制的威力 实时轨迹/轨迹回放/多条轨迹同时回放/轨迹平滑移动/移动速度和间隔/自动旋转角度 记一个优化改良的实施过程/纯QPainter实现的地图组件/支持天地图谷歌地图等 性能提升百倍/Qt地图组件纯QWidget绘制/缓存瓦片技术/多线程加载绘制 纯QWidget绘制实现电子地图控件/非qml非web/多线程下载和加载瓦片/支持各种图形 Qt实现离线地图下载/瓦片地图下载/划区域下载离线地图/多线程批量下载
坚持古法编程有意义吗/纯手搓代码/监控Onvif调试神器
飞扬青云 · 2026-09-16 · via 博客园 - 飞扬青云

一、前言说明

这个工具我已经做了十几年了,从2014年就开始写。最开始只有搜索功能,后来陆续加了云台控制、预置位、图片参数调节,再后来加了OSD管理,一直不停地迭代,都是为了满足现场用户的实际需求。后面还做了安卓手机版,方便一些用户用手机做简单的调试。
这个工具发布的初衷,其实是给程序员、尤其是Qt开发者用来做二次开发的。但没想到实际用户里超过一半都不是程序员,主要是工程人员,拿来在现场调试设备用。

有人可能会问:既然有ONVIF官方的ODM(ONVIF Device Manager)这个工具,功能也挺强大,为什么还要用你这个?但实际用下来,工程人员对ODM意见挺大:它不支持跨网段搜索,不支持H.265视频显示,云台没有左上角、右下角那种控制方式,也没有OSD管理功能。相比之下,我这个工具是绿色版,双击就能用,基本覆盖了现场调试能遇到的所有情况,所以大家都觉得好用。

最近在写监控设备模拟器的时候,我在调试中发现了一个问题:收发数据的日志之前是打印在文本框里的,虽然有颜色区分、也用换行隔开了,但每个数据包内容都很大、很多,一刷屏就得拖好久的滚动条才能找到想要的数据。而现场调试对收发数据非常敏感,排查问题时经常要翻看这些原始数据。ONVIF基本是一问一答,发一个请求就对应一个应答。于是我就把日志改成了表格形式,用收发关键字对应展示,想看具体内容就双击那一条,会弹窗显示详细数据。这样定位数据包就非常快、非常直观了。

二、效果图

Snipaste_2026-08-09_15-46-55

三、相关地址

  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_onvif

四、功能特点

  1. 一键广播搜索设备,同时支持IPC和NVR等各种onvif设备,依次排队返回。
  2. 可选择不同的网卡搜索,支持跨网段组播搜索。
  3. 依次获取Onvif地址、Media地址、Profile文件、Rtsp地址等信息。
  4. 可对指定的Profile获取视频流Rtsp地址,比如主码流地址、子码流地址。
  5. 可对每个设备设置Onvif用户信息,用于鉴权认证获取详细信息。
  6. 可实时预览通道画面图像,支持视频录制到本地,支持硬解码显示。
  7. 支持云台控制,可上下左右和左上角等八个方位调节云台,支持绝对移动、相对移动、连续移动三种方式,支持变倍和聚焦控制。
  8. 支持获取预置位信息、调用预置位、添加预置位、删除预置位等。
  9. 支持图片参数设置,包括亮度、对比度、饱和度、锐度等。
  10. 支持各种事件订阅,包括入侵报警、越界报警、遮挡报警等。
  11. 支持onvif协议抓图,返回对应的抓拍图片。
  12. 支持获取和设置NTP校时,获取和设置时间。
  13. 支持OSD相关操作,可以增删改查OSD信息,可以调整OSD的位置以及设置颜色。
  14. 可对设备进行重启、网络参数获取和设置等操作。
  15. 支持对指定IP地址及onvif地址进行单播搜索,比如跨网段情况下非常有用。
  16. 支持指定过滤条件过滤搜索设备,比如只搜索某个网段的设备或者针对某个地址的设备。
  17. 支持搜索间隔和搜索策略设置,保证所有设备搜索回来,在大量设备现场很有用,亲测上千个摄像机现场,搜索回来的设备数量,比摄像机厂家自带搜索工具还要准确。
  18. 内置了线程实时执行Onvif指令队列,排队最大速度的执行对应的指令,执行结果信号发出。
  19. 采用的最底层的TCP+UDP通信机制,原创最底层协议解析,纯QWidget编写。
  20. 超级小巧轻量,总共约3000行代码,不依赖任何第三方的库和组件,跨平台。
  21. 封装好了通用的数据发送和接收解析的函数,可以非常方便的自行拓展其他Onvif处理。
  22. 表格形式显示收发数据,有关键字和不同颜色显示,双击显示详细数据,非常方便现场调试。
  23. 支持所有Onvif设备,亲测海康、大华、宇视、天地伟业、华为、海思等,可定制开发。。
  24. 代码结构框架非常清晰,注释详细,代码精简不繁琐,非常易于学习和移植,可以很容易拓展其他接口需求。
  25. 支持Qt4/Qt5/Qt6以及后续所有版本、所有编译器、所有开发环境。
  26. 支持windows、linux、mac、安卓、国产OS、嵌入式linux、RK3588、树莓派、香橙派等系统。

五、代码使用

  1. 第一步:拷贝onvif组件源码即core_onvif整个目录到你的项目,放到同级目录。
  2. 第二步:在项目pro文件中引入组件 include ($$PWD/../core_onvif/core_onvif.pri)。
  3. 第三步:代码文件引入头文件 #include "onvifsearch.h" #include "onvifdevice.h",其中onvifsearch用于搜索设备,onvifdevice用于获取设备的详细信息比如rtsp视频流地址。
  4. 第四步:组播或者单播搜索设备,获取到对应的onvif地址。每个设备都有一个唯一的onvif地址。
//实例化搜索对象并关联信号槽
OnvifSearch *search = new OnvifSearch(this);
connect(search, SIGNAL(receiveDevice(OnvifDeviceInfo)), this, SLOT(receiveDevice(OnvifDeviceInfo)));
//参数1是网卡地址/参数2指定地址则表示单播
search->search("192.168.0.110", "");

void frmSimple::receiveDevice(const OnvifDeviceInfo &deviceInfo)
{
    QString msg = QString("收到设备: %1").arg(deviceInfo.onvifAddr);
    ui->textEdit->append(msg);

    QListWidgetItem *item = new QListWidgetItem;
    item->setText(deviceInfo.deviceIp);
    item->setData(Qt::UserRole, deviceInfo.onvifAddr);
    ui->listWidget->addItem(item);
}
  1. 第五步:对指定的onvif地址发送http请求,获取详细信息。
//实例化onvif对象实例
OnvifDevice *device = new OnvifDevice(this);
//设置用户信息用于请求的时候认证用
device->setUserInfo("admin", "123456");
//设置请求地址
device->setOnvifAddr("http://192.168.0.64/onvif/device_service");

//先获取服务文件
device->getServices();
//可能为空需要按照另一种方式获取
if (device->getMediaUrl().isEmpty()) {
    device->getCapabilities();
}

//获取配置文件
QList<OnvifProfileInfo> profiles = device->getProfiles();
foreach (OnvifProfileInfo profile, profiles) {
    ui->cboxProfiles->addItem(profile.token);
}

//对指定的配置文件获取视频地址
QString token = ui->cboxProfiles->currentText();
QString url = device->getStreamUri(token);
ui->txtStreamUri->setText(url);
  1. 特别提示:可以在main.cpp中注释//frmMain w;打开frmSimple w;用来开启直接运行简单示例。