Qt/C++视频监控Onvif工具/组播搜索/显示监控画面/图片参数调节/OSD管理/祖传原创
一、前言
能够写出简单易用而又不失功能强大的组件,一直是我的追求,简单主要体现在易用性,不能搞一些繁琐的流程和一些极难使用的API接口,或者一些看不懂的很难以理解的函数名称,一定是要越简单越好。功能强大主要体现在功能的完整性,常规的接口肯定是必备的,然后在默认值方面,尽量将值设置成最常用的合规的值,然后提供了接口可以修改这些值,以便兼容各种各样的需求场景。比如一些开关的值,如果90%的人希望默认是关闭的,而你搞个默认值开启,这就很纳闷了,大部分的用户每次都需要去主动修改后才能适用自己的场景。在做软件开发这些年,一直遵循这些原则和逻辑搞到今天,包括精心打磨很多年的各种组件,比如视频播放组件,Onvif组件等。
代码使用示例:
- 第一步:拷贝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);
二、效果图





三、体验地址
- 体验地址:https://pan.baidu.com/s/1d7TH_GEYl5nOecuNlWJJ7g 提取码:01jf 名称:bin_video_onvif
- 国内站点:https://gitee.com/feiyangqingyun
- 国际站点:https://github.com/feiyangqingyun
- 个人主页:https://blog.csdn.net/feiyangqingyun
- 视频主页:https://space.bilibili.com/687803542/
四、功能特点
- 广播搜索设备,支持IPC和NVR,依次返回。
- 可选择不同的网卡IP进行对应网段设备的搜索。
- 依次获取Onvif地址、Media地址、Profile文件、Rtsp地址。
- 可对指定的Profile获取视频流Rtsp地址,比如主码流地址、子码流地址。
- 可对每个设备设置Onvif用户信息,用于认证获取详细信息。
- 可实时预览摄像机图像。
- 支持云台控制,可上下左右调节云台,支持绝对移动、相对移动、连续移动三种方式,可对图像拉近拉远。
- 支持获取预置位集合、调用预置位、添加预置位、删除预置位等。
- 支持图片参数设置,包括亮度、对比度、饱和度、锐度等。
- 支持Qt4和Qt6任意Qt版本以及后续Qt版本,亲测Qt4.7到Qt6.5。
- 支持任意编译器,亲测mingw、msvc、gcc、clang。
- 支持任意操作系统,亲测xp、win7、win10、android、linux、嵌入式linux、树莓派全志H3等。
- 支持任意Onvif摄像机和NVR,亲测海康、大华、宇视、天地伟业、华为、海思芯片内核等,可定制开发。
- 支持对指定IP地址及onvif地址进行单播搜索,比如跨网段情况下非常有用。
- 支持指定过滤条件过滤搜索设备,比如只搜索某个网段的设备或者针对某个地址的设备。
- 支持搜索间隔和搜索策略设置,保证所有设备搜索回来,在大量设备现场很有用(亲测上千个摄像机现场,搜索回来的设备数量比摄像机厂家自带搜索工具还要准确)。
- 可对设备进行重启、网络参数获取等。
- 支持各种事件订阅(入侵报警、越界报警、遮挡报警等)、Onvif抓图等操作。
- 支持NTP校时和时间同步设置。
- 支持OSD相关操作,可以增删改查OSD信息。
- 内置了线程实时执行Onvif指令队列,排队最大速度的执行对应的指令,执行结果信号发出。
- 采用的最底层的TCP+UDP通信机制,原创最底层协议解析,纯QtWidget编写。
- 超级小巧轻量,总共约3000行代码,不依赖任何第三方的库和组件,跨平台。
- 封装好了通用的数据发送和接收解析的函数,可以非常方便的自行拓展其他Onvif处理。
- 工具上提供了收发数据文本框,显示收发的数据,方便查看和分析。
- 支持所有Onvif设备,代码工整,接口友好,直接引入pri即可使用。
Qt/C++视频监控Onvif工具/组播搜索/显示监控画面/图片参数调节/OSD管理/祖传原创的更多相关文章
- IP组播技术介绍及实现例子
引 言 近年来,随着Internet的迅速普及和爆炸性发展,在Internet上产生了许多新的应用,其中不少是高带宽的多媒体应用,譬如网 络视频会议.网络音频/视频广播.AOD/VOD.股市行情发布. ...
- IP组播
1 IP组播基础 IP组播技术有效地解决了单点发送.多点接收的问题.组播源只发送一份数据,被传递的信息在距组播源尽可能远的网络节点才开始被复制和分发,并且只发送给需要该信息的接收者. 说明: 本章 ...
- C#实现任意源组播与特定源组播
IP组播通信需要一个特殊的组播地址,IP组播地址是一组D类IP地址,范围从224.0.0.0 到 239.255.255.255.其中还有很多地址是为特殊的目的保留的.224.0.0.0到224.0. ...
- QT的UDP组播技术
一 UDP介绍 UDP是一种简单轻量级的传输层协议,提供无连接的,不可靠的报文传输.适合下面4种情况: 网络数据大多为短消息. 拥有大量客户端. 对数据安全性无特殊要求 网络负担非常重,但对响应速度要 ...
- QT Udp组播(穿透)
http://blog.csdn.net/victoryknight/article/details/7814243 主题 UDPQt路由器 局域网内的两台机器如果隔有路由器,那么这两台机器之间不 ...
- android ONVIF 组播探测在线摄像机
http://blog.csdn.net/ghostyu/article/details/8182516 Android的Wifi,默认情况下是不接受组播的,见:http://developer.an ...
- Android设备一对多录屏直播--(UDP组播连接,Tcp传输)
原文:https://blog.csdn.net/sunmmer123/article/details/82734245 近期需要学习流媒体知识,做一个Android设备相互投屏Demo,因此找到了这 ...
- 华为组播实验,PIM-DM组播实验
一.配置VLAN,并将端口加入VLAN LSW5: system vlan batch 10 to 100 int g 0/0/1 port link-type trunk port trunk al ...
- IPv4组播通信原理
2011-05-08 21:21:14 标签:组播 vin_do,vin_do学习笔记,笔记 休闲 职场 摘自网络,感谢原作者 摘要: 本文试图成为学习TCP/IP网络组播技术的入门材料.文中介绍了组 ...
- 组播(Multicast)传输
组播(Multicast)传输: 在发送者和每一接收者之间实现点对多点网络连接. 如果一台发送者同时给多个的接收者传输相同的数据,也只需复制一份的相同数据包.它提高了数据传送效率.减少了骨干网络出现拥 ...
随机推荐
- 小程序的button组件
button组件 按钮组件 功能比html的button按钮丰富 可以通过open-type属性可以调用微信提供的各种功能(客服,转发,获取用户权限,获取用户信息等): 按钮的属性 size 按钮的大 ...
- kotlin集合——>集合操作概述、集合转换
1. 集合操作概述: Kotlin 标准库提供了用于对集合执行操作的多种函数.这包括简单的操作,例如获取或添加元素,以及 更复杂的操作,包括搜索.排序.过滤.转换等 1.1 扩展与成员函数 集合操作在 ...
- Android复习(三)清单文件中的元素——>uses-feature
<uses-feature> Google Play 会利用应用清单中声明的 <uses-feature> 元素,从不符合应用硬件和软件功能要求的设备上过滤该应用. 通过指定应 ...
- SaaS架构:开放平台架构设计
大家好,我是汤师爷~ 今天聊聊开放平台架构设计. 为什么需要搭建开放平台 增强产品能力 开放平台能够让三方开发者和合作伙伴开发新的应用或服务,增加原有SaaS产品能力.这样就可以满足更多用户需求,从而 ...
- 云原生周刊:Argo Rollouts 支持 Kubernetes Gateway API 1.0 | 2024.7.1
开源项目 Kubetools Recommender System Kubetools Recommender System (Krs) 是一个基于 GenAI 的工具,用于帮助管理和优化 Kuber ...
- 云原生周刊:2024 扩展 K8s 集群指南 | 2024.1.2
开源项目推荐 Jib Jib 无需 Docker 守护进程,也无需深入掌握 Docker 最佳实践,即可为您的 Java 应用程序构建优化的 Docker 和 OCI 映像.它可作为 Maven 和 ...
- 在Ubuntu小设备上使用VSCode+SSH开发部署nicegui的Web应用,并设置系统开机自动启动应用
在一些小的设备上跑Ubuntu系统,需要快速的开发和调整项目的时候,往往使用SSH进行远程的开发测试,这样可以避免传统的打包更新处理,能够快速的在实际环境上测试具体的内容.另外由于系统设备往往需要重启 ...
- PL/SQL查询中文乱码问题
使用PL/SQL查询数据时,有中文的内容显示乱码,如下所示: 解决方案:配置环境变量 新建系统变量: 变量名:NLS_LANG 变量值:AMERICAN_AMERICA.ZHS16GBK 然后重启PL ...
- 题解:【XR-3】核心城市
题解:[XR-3]核心城市 思路一:考虑由特例推广到一般 1.很容易想到先考虑一个关键点的情况,然后再推广到一般情况. 2.一个点肯定选距离上最平衡的那个点,即树的中心.接着在中心周围贪心的选剩下的( ...
- 2-6 C/C++ 编写头文件
目录 头文件怎么起作用 避免头文件被重复引用 避免头文件被重复引用的方法:条件编译 1. 给每个头文件添加一个预编译变量(preprocessor variable)作为标记(Label) 2. 使用 ...