一、前言

云台控制也是onvif功能中最常用的,最常用的功能排第一的是拿到视频流地址,排第二的就是云台控制了,云台控制的含义就是对带云台的摄像机进行上下左右的移动,一般云台摄像机都是带有一个小电机,一旦收到485或者网络来的正确的指令以后就触发单片机程序,然后单片机程序驱动电机进行转动,所以相对来说云台摄像机比普通的摄像机更耗电,当然价格也更贵。

云台控制的发送命令除了用户信息玩主要就三个核心参数xyz,通过这三个参数的组合来实现云台和焦距的控制,云台的转动主要就是改变xy的值,焦距的控制通过改变z的值来实现。

云台控制说明:

  1. x、y、z 范围都在0-1之间。
  2. x为负数,表示左转,x为正数,表示右转。
  3. y为负数,表示下转,y为正数,表示上转。
  4. z为正数,表示拉近,z为负数,表示拉远。
  5. 通过x和y的组合,来实现云台的控制。
  6. 通过z的组合,来实现焦距控制。

onvif主要的功能:

  1. 搜索设备,获取设备的信息比如厂家、型号等。
  2. 获取设备的多个配置文件信息profile。
  3. 获取对应配置文件的视频流地址rtsp,以及分辨率等参数。
  4. 云台控制,上下左右移动,焦距放大缩小,相对和绝对移动。
  5. 获取预置位信息,触发预置位。
  6. 订阅事件,接收设备的各种消息尤其是报警事件比如IO口的报警。
  7. 抓图,获取设备当前的图片。
  8. 获取、创建、删除用户信息。
  9. 获取和设备网络配置信息比如IP地址等。
  10. 获取和设置NTP时间同步以及设置设备时间。
  11. 获取和设置视频参数和图片参数(亮度、色彩、饱和度)。
  12. 重启设备。

onvif的处理流程:

  1. 绑定组播IP(239.255.255.250)和端口(3702),发送固定的xml格式的数据搜索设备。
  2. 接收到的xml格式的数据解析,得到设备的Onvif地址。
  3. 对Onvif地址发送对应的数据,收到数据取出对应的节点数据。
  4. 请求Onvif地址获取Media地址和Ptz地址,Media地址用来获取详细的配置文件,Ptz地址用来云台控制。
  5. ptz控制是对Ptz地址发送对应的数据即可。
  6. 设置了用户认证的需要组织用户token信息一块发送,每次都需要作鉴权处理。
  7. 接收到的数据不是标准的xml数据,没法按照正常的节点解析来处理,只能用QXmlQuery来做。
  8. 每个厂家设备返回的数据未必完全一致,基本上都不一致,需要进行模糊查找节点值。
  9. 特意采用底层协议解析,因为soap太臃肿函数名称太另类,特意做的轻量级的。
  10. 两个必备工具,Onvif Device Manager 和 Onvif Device Test Tool。

二、功能特点

  1. 广播搜索设备,支持IPC和NVR,依次返回,可选择不同的网卡IP。
  2. 依次获取Onvif地址、Media地址、Profile文件、Rtsp地址。
  3. 可对指定的Profile获取视频流Rtsp地址,比如主码流子码流地址。
  4. 可对每个设备设置Onvif用户信息,用于认证获取详细信息。
  5. 可实时预览摄像机图像。
  6. 支持云台控制,可上下左右调节云台,支持绝对移动和相对移动,可放到和缩小图像远近。
  7. 支持Qt4和Qt5任意Qt版本,亲测Qt4.7.0到Qt5.14.2。
  8. 支持任意编译器,亲测mingw、msvc、gcc、clang。
  9. 支持任意操作系统,亲测xp、win7、win10、android、linux、嵌入式linux、树莓派全志H3等。
  10. 支持任意Onvif摄像机和NVR,亲测海康、大华、宇视、华为、海思芯片内核等,可定制开发。
  11. 支持对指定IP地址及onvif地址进行单播搜索,比如跨网段情况下非常有用。
  12. 支持指定过滤条件过滤搜索设备。
  13. 支持搜索间隔设置,保证所有设备搜索回来,在大量设备现场很有用。
  14. 可对图片参数(亮度、色彩度、饱和度)进行设置。
  15. 支持NTP校时和时间同步设置。
  16. 纯Qt编写,超级小巧轻量,总共约2000行代码,不依赖任何第三方的库和组件,跨平台。
  17. 封装好了通用的数据发送和接收解析的函数,可以非常方便的自行拓展其他Onvif处理。
  18. 工具上提供了收发数据文本框,显示收发的数据,方便查看和分析。
  19. 支持所有Onvif设备,代码工整,接口友好,直接引入pri即可使用。

三、效果图

四、相关站点

  1. 国内站点:https://gitee.com/feiyangqingyun/QWidgetDemo
  2. 国际站点:https://github.com/feiyangqingyun/QWidgetDemo
  3. 个人主页:https://blog.csdn.net/feiyangqingyun
  4. 知乎主页:https://www.zhihu.com/people/feiyangqingyun/
  5. 体验地址:https://blog.csdn.net/feiyangqingyun/article/details/97565652

五、核心代码

void frmPtz::moveAbsolute()
{
OnvifDevice *device = frm->getCurrentDevice();
if (device) {
QString profile = frm->getProfile();
device->moveAbsolute(profile, x, y, z);
frm->append(5, QString("执行绝对移动-> x: %1 y: %2 z: %3").arg(x).arg(y).arg(z));
}
} void frmPtz::moveRelative()
{
OnvifDevice *device = frm->getCurrentDevice();
if (device) {
QString profile = frm->getProfile();
device->moveRelative(profile, x, y, z);
frm->append(5, QString("执行相对移动-> x: %1 y: %2 z: %3").arg(x).arg(y).arg(z));
}
} void frmPtz::setFrm(frmMain *frm)
{
this->frm = frm;
} void frmPtz::on_btnPtzUp_clicked()
{
if (ui->rbtnMoveRelative->isChecked()) {
x = 0.0;
y = 0.1;
z = 0.0;
moveRelative();
} else {
y = 0.1;
moveAbsolute();
}
} void frmPtz::on_btnPtzDown_clicked()
{
if (ui->rbtnMoveRelative->isChecked()) {
x = 0.0;
y = -0.1;
z = 0.0;
moveRelative();
} else {
y = -0.0;
moveAbsolute();
}
} void frmPtz::on_btnPtzLeft_clicked()
{
if (ui->rbtnMoveRelative->isChecked()) {
x = -0.1;
y = 0.0;
z = 0.0;
moveRelative();
} else {
x = 0.0;
moveAbsolute();
}
} void frmPtz::on_btnPtzRight_clicked()
{
if (ui->rbtnMoveRelative->isChecked()) {
x = 0.1;
y = 0.0;
z = 0.0;
moveRelative();
} else {
x = 0.1;
moveAbsolute();
}
} void frmPtz::on_btnPtzLeftUp_clicked()
{
if (ui->rbtnMoveRelative->isChecked()) {
x = -0.1;
y = 0.1;
z = 0.0;
moveRelative();
} else {
x = 0.0;
y = 0.0;
moveAbsolute();
}
} void frmPtz::on_btnPtzLeftDown_clicked()
{
if (ui->rbtnMoveRelative->isChecked()) {
x = -0.1;
y = -0.1;
z = 0.0;
moveRelative();
} else {
x = 0.1;
y = 0.1;
moveAbsolute();
}
} void frmPtz::on_btnPtzRightUp_clicked()
{
if (ui->rbtnMoveRelative->isChecked()) {
x = 0.1;
y = 0.1;
z = 0.0;
moveRelative();
} else {
x = 0.0;
y = 0.0;
moveAbsolute();
}
} void frmPtz::on_btnPtzRightDown_clicked()
{
if (ui->rbtnMoveRelative->isChecked()) {
x = 0.1;
y = -0.1;
z = 0.0;
moveRelative();
} else {
x = 0.1;
y = 0.1;
moveAbsolute();
}
} void frmPtz::on_btnPtzZoomIn_clicked()
{
if (ui->rbtnMoveRelative->isChecked()) {
x = 0.0;
y = 0.0;
z = 0.01;
moveRelative();
} else {
z = 0.01;
moveAbsolute();
}
} void frmPtz::on_btnPtzZoomOut_clicked()
{
if (ui->rbtnMoveRelative->isChecked()) {
x = 0.0;
y = 0.0;
z = -0.01;
moveRelative();
} else {
z = 0.0;
moveAbsolute();
}
} void frmPtz::on_btnPtzStop_clicked()
{
OnvifDevice *device = frm->getCurrentDevice();
if (device) {
frm->setText("ptzStop");
QString profile = frm->getProfile();
device->moveStop(profile);
}
} void frmPtz::on_btnPtzReset_clicked()
{
x = 0.0;
y = 0.0;
z = 0.0;
moveAbsolute();
}

Qt音视频开发29-Onvif云台控制的更多相关文章

  1. moviepy音视频开发:使用credits1给视频加片头片尾字幕

    ☞ ░ 前往老猿Python博文目录 ░ 一.概述 在<moviepy音视频剪辑:视频基类VideoClip子类DataVideoClip.UpdatedVideoClip.ImageClip. ...

  2. WebRTC 音视频开发

    WebRTC 音视频开发 webrtc   Android IOS WebRTC 音视频开发总结(七八)-- 为什么WebRTC端到端监控很关键? 摘要: 本文主要介绍WebRTC端到端监控(我们翻译 ...

  3. Android 音视频开发学习思路

    Android 音视频开发这块目前的确没有比较系统的教程或者书籍,网上的博客文章也都是比较零散的.只能通过一点点的学习和积累把这块的知识串联积累起来. 初级入门篇: Android 音视频开发(一) ...

  4. 转:Android IOS WebRTC 音视频开发总结 (系列文章集合)

    随笔分类 - webrtc   Android IOS WebRTC 音视频开发总结(七八)-- 为什么WebRTC端到端监控很关键? 摘要: 本文主要介绍WebRTC端到端监控(我们翻译和整理的,译 ...

  5. Android开发 音视频开发需要了解的专业术语知识

    前言 在摸索一段时间的音视频开发后,越来越发现这个坑的深度真是特别的深. 除了了解Android自带的音视频处理API以外,还得了解一些视频与音频方面的知识.这篇博客就是主要讲解这方面的专业术语.内容 ...

  6. 音视频开发-FFmpeg

    音视频开发是个非常复杂的,庞大的开发话题,初涉其中,先看一下结合 OEIP(开源项目) 新增例子. 可以打开flv,mp4类型文件,以及rtmp协议音视频数据,声音的播放使用SDL. 把采集的麦/声卡 ...

  7. Python音视频开发:消除抖音短视频Logo的图形化工具实现

    ☞ ░ 前往老猿Python博文目录 ░ 一.引言 在<Python音视频开发:消除抖音短视频Logo和去电视台标的实现详解>节介绍了怎么通过Python+Moviepy+OpenCV实现 ...

  8. Moviepy音视频开发:视频转gif动画或jpg图片exe图形化工具开发案例

    ☞ ░ 前往老猿Python博文目录 ░ 一.引言 老猿之所以学习和研究Moviepy的使用,是因为需要一个将视频转成动画的工具,当时在网上到处搜索查找免费使用工具,结果找了很多自称免费的工具,但转完 ...

  9. moviepy音视频开发:音频剪辑基类AudioClip

    ☞ ░ 前往老猿Python博文目录 ░ 一.背景知识介绍 1.1.声音三要素: 音调:人耳对声音高低的感觉称为音调(也叫音频).音调主要与声波的频率有关.声波的频率高,则音调也高. 音量:也就是响度 ...

  10. 【秒懂音视频开发】02_Windows开发环境搭建

    音视频开发库的选择 每个主流平台基本都有自己的音视频开发库(API),用以处理音视频数据,比如: iOS:AVFoundation.AudioUnit等 Android:MediaPlayer.Med ...

随机推荐

  1. 云原生周刊:KubeSphere 3.4.1 发布 | 2023.11.13

    开源项目推荐 Inspektor Gadget Inspektor Gadget 是一组用于调试和检查 Kubernetes 资源与应用程序的工具(或小工具).它在 Kubernetes 集群中管理 ...

  2. 操作系统_MPI程序设计

    一.实验环境搭建 本次MPI集群环境是在电脑中安装mpi的sdk和应用程序后在visual studio 2022 上配置MPI环境. VC++目录--->包含目录--->添加MPI的in ...

  3. hydra爆破工具

    hydra爆破工具 命令详细: 1.破解ssh: hydra -l 用户名 -p 密码字典 -t 线程 -vV -e ns ip ssh hydra -l 用户名 -p 密码字典 -t 线程 -o s ...

  4. layui下拉框xm-select自定义搜索使用方法

    xm-select介绍 始于Layui, 下拉选择框的多选解决方案 git地址:https://gitee.com/maplemei/xm-select 文档说明:https://codecp.tec ...

  5. 在使用asm包进行动态类加载的时候的打包问题

    如图所示,开发时使用的jdk包下面的asm包,在进行打包时提示asm包不存在,打包方式使用如下: 目前提供两种解决方案: 1:修改打包方式,将jdk的包也打进去: <plugin> < ...

  6. 使用wxpython开发跨平台桌面应用,基类对话框窗体的封装处理

    在开发桌面界面的时候,往往都需要对一些通用的窗体进行一些抽象封装处理,以便统一界面效果,以及继承一些通用的处理过程,减少重复编码.本篇随笔介绍使用wxpython开发跨平台桌面应用,基类对话框窗体的封 ...

  7. 计算机网络常见面试题(一):TCP/IP五层模型、TCP三次握手、四次挥手,TCP传输可靠性保障、ARQ协议

    文章目录 一.TCP/IP五层模型(重要) 二.应用层常见的协议 三.TCP与UDP 3.1 TCP.UDP的区别(重要) 3.2 运行于TCP.UDP上的协议 3.3 TCP的三次握手.四次挥手 3 ...

  8. 2-5 C++ 类型别名与自动类型

    目录 2.5.1 类型别名(Type Alias) typedef using 2.5.2 auto类型说明符 基本说明 注意点 2.5.3 decltype类型说明符 基本说明 注意点 2.5.1 ...

  9. 惊爆!72.1K star 的 Netdata:实时监控与可视化的超炫神器!

    在当今复杂的 IT 环境中,实时监控与可视化对于保障系统的稳定运行和性能优化至关重要. 无论是服务器.应用程序,还是网络设备,及时获取性能数据能够帮助我们快速定位问题.优化资源配置. Netdata, ...

  10. python之DataClass

    Python 在版本 3.7 (PEP 557) 中引入了dataclass.dataclass允许你用更少的代码和更多的开箱即用功能来定义类. 下面定义了一个具有两个实例属性 name 和 age ...