Qt音视频开发35-Onvif图片参数
一、前言
视频中的图片的配置参数一般有亮度、饱和度、对比度、锐度等,以前一直以为这些需要通过厂家的私有协议SDK来设置才行,后面通过研究Onvif Device Manager 和 Onvif Device Test Tool 这两个onvif开发的必备工具以后,发现onvif协议也具备了修改 亮度、色彩度、饱和度这三个参数,当然这三个参数我见过的摄像机厂家(主流的十几种)都具备,还有些大厂做的设备还提供了其他详细图片参数的设置比如ICAT。
通过万能的超级牛逼的抓包工具Wireshark抓包分析,发现 对图片参数进行设置(亮度、色彩度、饱和度)的参数中除了指定填入亮度、色彩度、饱和度的值以外,还需要指定VideoSourceToken,这玩意从哪里来呢?需要通过获取VideoSource拿到,即GetVideoSources命令,一般来说会在获取设备的rtsp地址、ptz云台地址等信息的时候一并获取,获取到以后存入onvifdevice类的变量中,下次设置图片参数的时候直接取就行。
onvif主要的功能:
- 搜索设备,获取设备的信息比如厂家、型号等。
- 获取设备的多个配置文件信息profile。
- 获取对应配置文件的视频流地址rtsp,以及分辨率等参数。
- 云台控制,上下左右移动,焦距放大缩小,相对和绝对移动。
- 获取预置位信息,触发预置位。
- 订阅事件,接收设备的各种消息尤其是报警事件比如IO口的报警。
- 抓图,获取设备当前的图片。
- 获取、创建、删除用户信息。
- 获取和设备网络配置信息比如IP地址等。
- 获取和设置NTP时间同步以及设置设备时间。
- 获取和设置视频参数和图片参数(亮度、色彩、饱和度)。
- 重启设备。
onvif的处理流程:
- 绑定组播IP(239.255.255.250)和端口(3702),发送固定的xml格式的数据搜索设备。
- 接收到的xml格式的数据解析,得到设备的Onvif地址。
- 对Onvif地址发送对应的数据,收到数据取出对应的节点数据。
- 请求Onvif地址获取Media地址和Ptz地址,Media地址用来获取详细的配置文件,Ptz地址用来云台控制。
- ptz控制是对Ptz地址发送对应的数据即可。
- 设置了用户认证的需要组织用户token信息一块发送,每次都需要作鉴权处理。
- 接收到的数据不是标准的xml数据,没法按照正常的节点解析来处理,只能用QXmlQuery来做。
- 每个厂家设备返回的数据未必完全一致,基本上都不一致,需要进行模糊查找节点值。
- 特意采用底层协议解析,因为soap太臃肿函数名称太另类,特意做的轻量级的。
- 两个必备工具,Onvif Device Manager 和 Onvif Device Test Tool。
二、功能特点
- 广播搜索设备,支持IPC和NVR,依次返回,可选择不同的网卡IP。
- 依次获取Onvif地址、Media地址、Profile文件、Rtsp地址。
- 可对指定的Profile获取视频流Rtsp地址,比如主码流子码流地址。
- 可对每个设备设置Onvif用户信息,用于认证获取详细信息。
- 可实时预览摄像机图像。
- 支持云台控制,可上下左右调节云台,支持绝对移动和相对移动,可放到和缩小图像远近。
- 支持Qt4和Qt5任意Qt版本,亲测Qt4.7.0到Qt5.14.2。
- 支持任意编译器,亲测mingw、msvc、gcc、clang。
- 支持任意操作系统,亲测xp、win7、win10、android、linux、嵌入式linux、树莓派全志H3等。
- 支持任意Onvif摄像机和NVR,亲测海康、大华、宇视、华为、海思芯片内核等,可定制开发。
- 支持对指定IP地址及onvif地址进行单播搜索,比如跨网段情况下非常有用。
- 支持指定过滤条件过滤搜索设备。
- 支持搜索间隔设置,保证所有设备搜索回来,在大量设备现场很有用。
- 可对图片参数(亮度、色彩度、饱和度)进行设置。
- 支持NTP校时和时间同步设置。
- 纯Qt编写,超级小巧轻量,总共约2000行代码,不依赖任何第三方的库和组件,跨平台。
- 封装好了通用的数据发送和接收解析的函数,可以非常方便的自行拓展其他Onvif处理。
- 工具上提供了收发数据文本框,显示收发的数据,方便查看和分析。
- 支持所有Onvif设备,代码工整,接口友好,直接引入pri即可使用。
三、效果图

四、相关站点
- 国内站点:https://gitee.com/feiyangqingyun/QWidgetDemo
- 国际站点:https://github.com/feiyangqingyun/QWidgetDemo
- 个人主页:https://blog.csdn.net/feiyangqingyun
- 知乎主页:https://www.zhihu.com/people/feiyangqingyun/
- 体验地址:https://blog.csdn.net/feiyangqingyun/article/details/97565652
五、核心代码
QString OnvifOther::getVideoSource()
{
QString result = writeData(" <trt:GetVideoSources/>", "", "获取视频参数", false, false, 1);
QStringList list = result.split(ResultSplit);
QString videosource = list.first().split(":").last();
device->videoSource = videosource;
return result;
}
QString OnvifOther::getImageSetting(int &brightness, int &colorSaturation, int &contrast)
{
brightness = colorSaturation = contrast = 0;
QString wsdl = "http://www.onvif.org/ver20/imaging/wsdl";
QStringList list;
list << QString(" <GetImagingSettings xmlns=\"%1\">").arg(wsdl);
list << QString(" <VideoSourceToken>%1</VideoSourceToken>").arg(device->videoSource);
list << QString(" </GetImagingSettings>");
QString result = writeData(list.join("\r\n"), "Brightness|ColorSaturation|Contrast", "获取图片参数", false);
list = result.split(ResultSplit);
if (list.count() != 3) {
return result;
}
brightness = list.at(0).split(":").last().toInt();
colorSaturation = list.at(1).split(":").last().toInt();
contrast = list.at(2).split(":").last().toInt();
return result;
}
bool OnvifOther::setImageSetting(int brightness, int colorSaturation, int contrast)
{
QString wsdl = "http://www.onvif.org/ver20/imaging/wsdl";
QString schema = "http://www.onvif.org/ver10/schema";
QStringList list;
list << QString(" <SetImagingSettings xmlns=\"%1\">").arg(wsdl);
list << QString(" <VideoSourceToken>%1</VideoSourceToken>").arg(device->videoSource);
list << QString(" <ImagingSettings>");
list << QString(" <Brightness xmlns=\"%1\">%2</Brightness>").arg(schema).arg(brightness);
list << QString(" <ColorSaturation xmlns=\"%1\">%2</ColorSaturation>").arg(schema).arg(colorSaturation);
list << QString(" <Contrast xmlns=\"%1\">%2</Contrast>").arg(schema).arg(contrast);
list << QString(" </ImagingSettings>");
list << QString(" <ForcePersistence>true</ForcePersistence>");
list << QString(" </SetImagingSettings>");
QString result = writeData(list.join("\r\n"), "SetImagingSettingsResponse", "设置图片参数", false);
return result.contains("SetImagingSettingsResponse");
}
Qt音视频开发35-Onvif图片参数的更多相关文章
- Moviepy音视频开发:视频转gif动画或jpg图片exe图形化工具开发案例
☞ ░ 前往老猿Python博文目录 ░ 一.引言 老猿之所以学习和研究Moviepy的使用,是因为需要一个将视频转成动画的工具,当时在网上到处搜索查找免费使用工具,结果找了很多自称免费的工具,但转完 ...
- Android 音视频开发(一) : 通过三种方式绘制图片
版权声明:转载请说明出处:http://www.cnblogs.com/renhui/p/7456956.html 在 Android 音视频开发学习思路 里面,我们写到了,想要逐步入门音视频开发,就 ...
- Python音视频开发:消除抖音短视频Logo和去电视台标
☞ ░ 前往老猿Python博文目录 ░ 一.引言 对于带Logo(如抖音Logo.电视台标)的视频,有三种方案进行Logo消除: 直接将对应区域用对应图像替换: 直接将对应区域模糊化: 通过变换将要 ...
- Android IOS WebRTC 音视频开发总结(八十五)-- 使用WebRTC广播网络摄像头视频(下)
本文主要介绍WebRTC (我们翻译和整理的,译者:weizhenwei,校验:blacker),最早发表在[编风网] 支持原创,转载必须注明出处,欢迎关注我的微信公众号blacker(微信ID:bl ...
- 音视频开发-FFmpeg
音视频开发是个非常复杂的,庞大的开发话题,初涉其中,先看一下结合 OEIP(开源项目) 新增例子. 可以打开flv,mp4类型文件,以及rtmp协议音视频数据,声音的播放使用SDL. 把采集的麦/声卡 ...
- moviepy音视频开发:使用credits1给视频加片头片尾字幕
☞ ░ 前往老猿Python博文目录 ░ 一.概述 在<moviepy音视频剪辑:视频基类VideoClip子类DataVideoClip.UpdatedVideoClip.ImageClip. ...
- Android IOS WebRTC 音视频开发总结(八十三)-- 使用WebRTC广播网络摄像头视频(上)
本文主要介绍WebRTC (我们翻译和整理的,译者:weizhenwei,校验:blacker),最早发表在[编风网] 支持原创,转载必须注明出处,欢迎关注我的微信公众号blacker(微信ID:bl ...
- WebRTC 音视频开发
WebRTC 音视频开发 webrtc Android IOS WebRTC 音视频开发总结(七八)-- 为什么WebRTC端到端监控很关键? 摘要: 本文主要介绍WebRTC端到端监控(我们翻译 ...
- Android 音视频开发学习思路
Android 音视频开发这块目前的确没有比较系统的教程或者书籍,网上的博客文章也都是比较零散的.只能通过一点点的学习和积累把这块的知识串联积累起来. 初级入门篇: Android 音视频开发(一) ...
- Android 音视频开发(七): 音视频录制流程总结
在前面我们学习和使用了AudioRecord.AudioTrack.Camera.MediaExtractor.MediaMuxer API.MediaCodec. 学习和使用了上述的API之后,相信 ...
随机推荐
- FHQ treap(再见splay------)
但凡打过平衡树的应该都知道\(\huge{二逼平衡树}\)这道题,抄了两个小时的splay版题解,然后发现了\(\huge\color{maroon}FHQ treap\): $\large\colo ...
- RocketMQ Streams拓扑构建与数据处理过程
本文作者:倪泽,Apache RocketMQ committer.RSQLDB/RocketMQ Streams Maintainer 01 背景 RocketMQ Streams 1.1.0版本已 ...
- 基础控件(ListView,RecyclerView,单位和尺寸,ViewPager,ViewPager2)
ListView list_item.xml <?xml version="1.0" encoding="utf-8"?> <LinearLa ...
- Java高并发,ReadWriteLock(读写锁)
并发读写的时候,很容易造成数据不一致的状态 上案例,代码如下: public class ReadWriteLockDemo { public static void main(String[] ar ...
- Linux利用scp命令上传下载文件
scp是secure copy的简写,用于在 Linux 下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器. scp传输是加密的,可能会稍微影响一下速度.当你服务 ...
- .NET 9 发布 性能提升、AI 支持与全方位改进
前言 .NET 9 正式发布,这是迄今为止最高效.现代.安全.智能且高性能的 .NET 版本. 新版本凝聚了全球数千名开发者的共同努力,包含了数千项性能.安全性和功能性改进. 主要亮点 性能提升:全面 ...
- 参与 2024 第四季度官方 Flutter 开发者调查
Flutter 3.24 和 Dart 3.5 稳定版发布 已有三月之久,今年最后一次开发者调查也如约而至! 自 Flutter 3.24 正式发布以来,团队通过一系列补丁更新不断优化平台稳定性和开发 ...
- P7563 JOISC 2021 Day4 最悪の記者 4 (Worst Reporter 4)
P7563 JOISC 2021 Day4 最悪の記者 4 (Worst Reporter 4) 线段树合并好题,通过线段树合并特别的方式优化了树形 dp. 思路 根据图中的不等关系连边建图,不难发现 ...
- NZOJ 模拟赛6
T1 叉叉 现在有一个字符串,每个字母出现的次数均为偶数.接下来我们把第一次出现的字母a和第二次出现的a连一条线,第三次出现的和四次出现的字母a连一条线,第五次出现的和六次出现的字母a连一条线...对 ...
- 异构数据源DDL自动转换
当我们在不同数据库迁移.同步数据时,首先要做的就是把库和表的结构在目标端创建出来. 当我们把数据库的结构 dump 出来之后,这个 DDL 在目标端大概率是无法直接运行的,至少数据类型在不同数据库之间 ...