一、前言

云台控制也是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. bitset优化传递闭包

    bitset优化传递闭包 时间复杂度 \(O(\frac{n^3}{w})\) #include<bits/stdc++.h> #define F(i,l,r) for(int i=l;i ...

  2. 负载均衡在web系统中的应用

    在日常的架构设计与开发中,常用的负载均衡算法主要分为静态和动态两类.静态负载算法以固定的频率分配任务不考虑服务器的状态信息,如轮询法.随机法等:动态负载均衡算法以服务器的实时负载状态信息来决定任务的分 ...

  3. html代码新手教学

    HTML 是超文本标记语言(HyperText Markup Language)的缩写,是用来描述网页结构的标记语言.在这篇教学中,我们将介绍一些 HTML 基础知识,帮助新手快速学习并掌握如何编写简 ...

  4. RedisTemplate RedisConfig 序列化方式 fastjson2

    目录 Fastjson2 序列化 Redis.config RedisUtil.java fastjson和fastjson2的区别 Spring Data Redis 为我们提供了下面的Serial ...

  5. webpack中引用jQuery的四种方式

    import webpack中是根据一个入口文件开始收集依赖. import $ from 'jquery' 但是一个项目中通常有很多个地方都用到了jQuery,每个模块都要这样的一行代码 那么如何解 ...

  6. Qt5 CMake 使用指南

    Qt5 CMake 使用指南 CMAKE_PREFIX_PATH的使用说明 CMAKE_PREFIX_PATH是CMake中一个重要的环境变量,它用于帮助CMake在配置项目时找到各种依赖项的位置.这 ...

  7. windows 中 gvim 和 git-bash vim 的 vimrc 路径相关配置记录

    windows 中 gvim 和 git-bash vim 的 vimrc 路径相关配置记录 Git-bash 中的 vim 将 source ~/.vimrc 或 ~/.vim/vimrc 并且不关 ...

  8. C#-公众号H5页面授权获取用户code、openid、unionid

    一:配置信息 公众号设置: 1:设置 IP白名单(所在的服务器ip).记录公众号APPID和APPsecret; 2:设置 网页授权域名; 二:页面授权----[html中获取code] 1:页面引入 ...

  9. Django3.0

    Django3.0 简介 Django 最初被设计用于具有快速开发需求的新闻类站点,目的是要实现简单快捷的网站开发.以下内容简要介绍了如何使用 Django 实现一个数据库驱动的 Web 应用. Dj ...

  10. 深入JVM的Class文件结构

    Class文件由顺序的8位字节为基础单位构成的二进制流.各个项目严格按照顺序紧凑排列,无分隔符. 需要用8位字节以上空间数据项时按照高位在前分割成若干个8位字节存储. 只包含2种数据类型: 无符号数 ...