一、前言说明
这个工具完善了十几年,从2014年开始就写了,从最开始只有搜索功能,后面加了云台控制,后面又有预置位,然后图片参数调节,再到后面加了OSD管理等,一直不断的迭代功能,满足现场用户实际需求,包括后面还做了手机安卓版本,也是方便某些用户做简便的调试使用。这个工具发布到如今,本意是给程序员尤其是qt开发者做二开用的,实际有超过半数的用户是非程序员,他们主要是工程人员,都是现场调试使用。那就有疑问了,本来就有个国际onvif工具odm,全称ONVIF Device Manager,功能也挺强大,但是不支持跨网段搜索,而且不支持265视频显示,云台也不支持左上角右下角,也没有OSD管理功能,总之工程人员用下来比较嫌弃,对比我这个工具用下来,都觉得我这个绿色版双击开箱即用非常好,满足了实际现场所有可能的情况。
近期在写监控设备模拟器过程中调试发现,收发数据的打印放在表格中,非常直观好用,之前打印在文本框中,尽管有不同颜色显示,也用换行隔开了,但是由于每个数据包很大很多内容,导致经常滚动条拉很久,要找到自己想要的数据,非常困难,而现场调试对于这个数据很敏感,查问题经常就需要这个原始的收发数据,onvif基本上都是一问一答,发个请求对应一个应答数据,表格中有对应的收发关键字,双击再弹出显示具体的详细数据,这样可以非常快速的定位数据包。
二、效果图
三、相关地址
- 国内站点:gitee.com/feiyangqing…
- 国际站点:github.com/feiyangqing…
- 个人作品:blog.csdn.net/feiyangqing…
- 文件地址:pan.baidu.com/s/1d7TH_GEY… 提取码:01jf 文件名:bin_video_onvif
四、功能特点
- 一键广播搜索设备,同时支持IPC和NVR等各种onvif设备,依次排队返回。
- 可选择不同的网卡搜索,支持跨网段组播搜索。
- 依次获取Onvif地址、Media地址、Profile文件、Rtsp地址等信息。
- 可对指定的Profile获取视频流Rtsp地址,比如主码流地址、子码流地址。
- 可对每个设备设置Onvif用户信息,用于鉴权认证获取详细信息。
- 可实时预览通道画面图像,支持视频录制到本地,支持硬解码显示。
- 支持云台控制,可上下左右和左上角等八个方位调节云台,支持绝对移动、相对移动、连续移动三种方式,支持变倍和聚焦控制。
- 支持获取预置位信息、调用预置位、添加预置位、删除预置位等。
- 支持图片参数设置,包括亮度、对比度、饱和度、锐度等。
- 支持各种事件订阅,包括入侵报警、越界报警、遮挡报警等。
- 支持onvif协议抓图,返回对应的抓拍图片。
- 支持获取和设置NTP校时,获取和设置时间。
- 支持OSD相关操作,可以增删改查OSD信息,可以调整OSD的位置以及设置颜色。
- 可对设备进行重启、网络参数获取和设置等操作。
- 支持对指定IP地址及onvif地址进行单播搜索,比如跨网段情况下非常有用。
- 支持指定过滤条件过滤搜索设备,比如只搜索某个网段的设备或者针对某个地址的设备。
- 支持搜索间隔和搜索策略设置,保证所有设备搜索回来,在大量设备现场很有用,亲测上千个摄像机现场,搜索回来的设备数量,比摄像机厂家自带搜索工具还要准确。
- 内置了线程实时执行Onvif指令队列,排队最大速度的执行对应的指令,执行结果信号发出。
- 采用的最底层的TCP+UDP通信机制,原创最底层协议解析,纯QWidget编写。
- 超级小巧轻量,总共约3000行代码,不依赖任何第三方的库和组件,跨平台。
- 封装好了通用的数据发送和接收解析的函数,可以非常方便的自行拓展其他Onvif处理。
- 表格形式显示收发数据,有关键字和不同颜色显示,双击显示详细数据,非常方便现场调试。
- 支持所有Onvif设备,亲测海康、大华、宇视、天地伟业、华为、海思等,可定制开发。。
- 代码结构框架非常清晰,注释详细,代码精简不繁琐,非常易于学习和移植,可以很容易拓展其他接口需求。
- 支持Qt4/Qt5/Qt6以及后续所有版本、所有编译器、所有开发环境。
- 支持windows、linux、mac、安卓、国产OS、嵌入式linux、RK3588、树莓派、香橙派等系统。
五、代码使用
- 第一步:拷贝onvif组件源码即core_onvif整个目录到你的项目,放到同级目录。
- 第二步:在项目pro文件中引入组件 include ($$PWD/../core_onvif/core_onvif.pri)。
- 第三步:代码文件引入头文件 #include "onvifsearch.h" #include "onvifdevice.h",其中onvifsearch用于搜索设备,onvifdevice用于获取设备的详细信息比如rtsp视频流地址。
- 第四步:组播或者单播搜索设备,获取到对应的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);
}
- 第五步:对指定的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);
- 特别提示:可以在main.cpp中注释//frmMain w;打开frmSimple w;用来开启直接运行简单示例。