多数安卓手机摄像头是支持调焦距的, GB28181标准定义了云台操作,  只要安卓端实现云台XML指令解析, 实时视频回看时远程控制安卓摄像头焦距调整是一个很实用的功能。

GB28181云台控制属于设备控制的一部分,使用SIP Message方法实现,走无应答命令流程。和云台相关的还有预置位查询,要走有应答命令流程。

云台控制和其他设备控制的XML定义差不多, 下面是一个具体的实例:

<?xml version="1.0" encoding="GB2312"?><Control><CmdType>DeviceControl</CmdType><SN>32211</SN><DeviceID>31010000011380000013</DeviceID><PTZCmd>A50F0100000000B5</PTZCmd></Control>

XML中最关键的是PTZCmd元素, PTZCmd在GB28181-2016中有详细定义,总共8个字节,定义格式如下:

字节 字节1 字节2 字节3 字节4 字节5 字节6 字节7 字节8
含义 A5H 组合码1 地址 指令 数据1 数据2 组合码2 校验码

8个字节中,最重要的字节4(指令码), 定义了云台各种操作类型。字节5, 6, 7主要用来传递指令相关参数。

字节1是首字节,固定为A5H。

针对PTZ, 字节4的第7和第6位都是0, 第5和第4位用来镜头调焦距, 第3和第2位是云台垂直方向控制, 第1和第0位是云台水平方向控制。解析时需要注意的是镜头焦距调整指令, 云台垂直上下指令、云台水平左右指令三者可以组合, 可能一条控制消息要执行三种类型的云台控制, 实际实现中要处理好。

实际云台操作中,会先发一个云台控制SIP Message, 紧接着再发一个云台停止指令SIP Message,云台停止指令中字节4的每一位都为0。

更详细定义请参考28181-2016文档A.3,指令解析实现还是比较容易的。

预置位查询属于网络设备信息查询的一部分,也使用SIP Message方法实现, 和云台控制不同的是,需要有响应消息, 下面给出一个查询和响应的具体XML实例:

<?xml version="1.0" encoding="GB2312"?><Query><CmdType>PresetQuery</CmdType><SN>7733</SN><DeviceID>31010000011380000021</DeviceID></Query>
<?xml version="1.0" encoding="GB2312"?><Response><CmdType>PresetQuery</CmdType><SN>7733</SN><DeviceID>31010000011380000021</DeviceID><PresetList Num="2"><Item><PresetID>1</PresetID><PresetName>安卓预置位1</PresetName></Item><Item><PresetID>2</PresetID><PresetName>安卓预置位2</PresetName></Item></PresetList></Response>

定义接口和Demo代码:

// Github: https://github.com/daniulive/SmarterStreaming
// Copyright (C) 1130758427@qq.compackage com.gb.ntsignalling;public interface GBSIPAgentDeviceControlListener {/** 收到远程启动控制命令*/void ntsOnDeviceControlTeleBootCommand(String deviceId, String teleBootValue);/** 云台控制*/void ntsOnDeviceControlPTZCmd(String deviceId, String typeValue);
}package com.gb.ntsignalling;public interface GBSIPAgentQueryCommandListener {/** 设备预置位查询*/void ntsOnDevicePresetQueryCommand(String fromUserName, String fromUserNameAtDomain, String sn, String deviceId);
}package com.gb.ntsignalling;public interface GBSIPAgent {void addDeviceControlListener(GBSIPAgentDeviceControlListener deviceControlListener);void addQueryCommandListener(GBSIPAgentQueryCommandListener queryCommandListener);/*预置位查询应答*/boolean respondDevicePresetQueryCommand(String fromUserName, String fromUserNameAtDomain, String sn, String deviceId, java.util.List<PresetItem> presetList);
}public class MyAndroidG8181DemoImpl implements GBSIPAgentDeviceControlListener,GBSIPAgentQueryCommandListener {@Overridepublic void ntsOnDeviceControlPTZCmd(String deviceId, String typeValue) {handler_.postDelayed(new Runnable() {@Overridepublic void run() {Log.i(TAG, "ntsOnDeviceControlPTZCmd device_id:" + device_id_ + " PTZType:" + ptz_type_);if (null == ptz_type_)return;ptz_type_ = ptz_type_.trim();if (ptz_type_.length() != 16)return;int instruction = hexStringToInt(ptz_type_.substring(6, 8));int combination_code2 = hexStringToInt(ptz_type_.substring(12, 14));if ((instruction & 0xc0) == 0 ) {if ((instruction & 0x20) != 0) {// Zoom Outint zoom_speed = (combination_code2 >> 4) & 0xf;Log.i(TAG, "ntsOnDeviceControlPTZCmd device_id:" + device_id_ + " PTZType:" + ptz_type_ + " Zoom Out, speed:" +zoom_speed);cameraZoom(true, zoom_speed);}else if ((instruction & 0x10) != 0) {// Zoom Inint zoom_speed = (combination_code2 >> 4) & 0xf;Log.i(TAG, "ntsOnDeviceControlPTZCmd device_id:" + device_id_ + " PTZType:" + ptz_type_ + " Zoom In, speed:" +zoom_speed);cameraZoom(false, zoom_speed);}}}int hexStringToInt(String hex) {if (null == hex)return 0;try{int v = Integer.parseInt(hex, 16);return v;}catch (Exception e) {return  0;}}private String device_id_;private String ptz_type_;public Runnable set(String device_id, String ptz_type) {this.device_id_ = device_id;this.ptz_type_ = ptz_type;return this;}}.set(deviceId, typeValue),0);}@Overridepublic void ntsOnDevicePresetQueryCommand(String fromUserName, String fromUserNameAtDomain, String sn, String deviceId) {handler_.postDelayed(new Runnable() {@Overridepublic void run() {Log.i(TAG, "ntsOnDevicePresetQueryCommand from_user_name:" + from_user_name_ + ", sn:" + sn_ + ", device_id:" + device_id_);List<com.gb.ntsignalling.PresetItem> preset_list = new LinkedList<>();preset_list.add(new com.gb.ntsignalling.PresetItem("1", "安卓预置位1"));preset_list.add(new com.gb.ntsignalling.PresetItem("2", "安卓预置位2"));if (gb28181_agent_ != null )gb28181_agent_.respondDevicePresetQueryCommand(this.from_user_name_, this.from_user_name_at_domain_, this.sn_, this.device_id_, preset_list);}private String from_user_name_;private String from_user_name_at_domain_;private String sn_;private String device_id_;public Runnable set(String from_user_name, String from_user_name_at_domain,String sn, String device_id) {this.from_user_name_ = from_user_name;this.from_user_name_at_domain_ = from_user_name_at_domain;this.sn_ = sn;this.device_id_ = device_id;return this;}}.set(fromUserName, fromUserNameAtDomain, sn, deviceId),0);}}

上面的代码我只实现了对焦距控制的指令解析,如果想处理其他云台指令,解析代码类似,不难实现,测试安卓机前后摄像头都支持焦距调节,实际测下来,效果还可以。

安卓GB28181云台控制和预置位查询相关推荐

  1. 宇视摄像机云台控制预置位、巡航如何配置

    Q: 宇视摄像机云台控制预置位.巡航如何配置 A: 预置位:设置预置位,或者对云台摄像机进行一些方向控制操作: 巡航:巡航路线是指云台摄像机在预置位之间转动的路线,可以设置云台在每个预置位的停留时间. ...

  2. Qt编写安防视频监控系统33-onvif云台控制

    一.前言 云台控制也是onvif功能中最常用的,最常用的功能排第一的是拿到视频流地址,排第二的就是云台控制了,云台控制的含义就是对带云台的摄像机进行上下左右的移动,一般云台摄像机都是带有一个小电机,一 ...

  3. Unity3d C#通过使用大华SDK控制大华摄像头旋转、变焦等云台操作和预置点等控制操作(含源码)

    前言 本文的内容和在之前我写过Unity3d C# 接入海康威视摄像头SDK实现接口控制功能(如:控制云台)的文章基本类似,同样是通过官网提供的SDK进行开发,只不过针对的设备不同,和部分实现细节不同 ...

  4. Qt编写监控Onvif综合示例(支持云台/预置位/抓图/事件订阅等)

    一.功能特点 广播搜索设备,支持IPC和NVR,依次返回. 可选择不同的网卡IP进行对应网段设备的搜索. 依次获取Onvif地址.Media地址.Profile文件.Rtsp地址. 可对指定的Prof ...

  5. Android平台GB28181设备接入模块之球机/云台控制探究

    技术背景 好多开发者在做GB28181设备接入的时候,问云台控制是否可以处理(亦或拉取外部RTSP摄像头,通过命令中转的方式,控制摄像头),实际上云台控制命令相对来说还是比较好处理的.协议规范有明确说 ...

  6. SkeyeVSS国标视频汇聚云服务使用Onvif、GB28181协议对监控摄像机设备进行PTZ云台控制

    SkeyeVSS平台可在复杂的网络环境中,将分散的各类视频资源进行统一汇聚.整合.集中管理,实现视频资源的鉴权管理.按需调阅.全网分发.智能分析等.平台可支持多协议.多类型设备接入,包括国标GB281 ...

  7. 用定时器T0查询方式P0口8位控制LED闪烁 T1查询方式P1口8位控制LED闪烁

    //用定时器T0查询方式P0口8位控制LED闪烁 T1查询方式P1口8位控制LED闪烁 #include<reg52.h>        //  包含52单片机寄存器定义的头文件 #def ...

  8. onvif协议之云台控制

    onvif云台控制,还有有点麻烦的,主要是不知道参数如何填写,通过接近一天的摸索,终于有点名目了. 我使用的是ContinuousMove这个api,介绍如下,网址https://www.onvif. ...

  9. 结合实战,浅析GB/T28181(七)—— 球机云台控制

    1 简介说明 28181设备控制包括球机/云台控制.录像控制.报警布放/撤防及复位.设备配置等类型,本节主要介绍球机/云台控制流程.协议规定,及实战对接时碰到的常见问题和排查思路. 依据规范定义,球机 ...

最新文章

  1. 关于建立智能车竞赛开发资源中心的汇报PPT
  2. 抓包概念大比较:数据报、数据包、分组
  3. CentOS7 64位下 MySQL5.7的安装与配置(YUM)
  4. 汽车销售网页html模板,汽车经销商HTML模板
  5. 计算机辅助设计与图像学学报 改后发表,几种常见图像二值化方法的结果对比与分析...
  6. mysql中distinct走索引吗_MySQL中索引优化distinct语句及distinct的多字段操作
  7. 前端笔记 | CSS进阶
  8. 三句话教你买对房子!买到好房子的都祝福哥三年内赚两个亿!
  9. hadoop日常维护之问题解决01
  10. integer判断是否为null_面试常考题JavaScript用七种方式教你判断一个变量是否为数组类型...
  11. 淘宝店铺装修旺铺基础版全屏轮播代码效果1920PX海报
  12. pm2开启nuxt项目pm2 start ./node_modules/nuxt/bin/nuxt-start
  13. 计算机专业自考本需要学哪几门,自考本科都考哪些科目?一次考几门?
  14. 移动硬盘上安装Ubuntu18.04系统
  15. Busybox 1.17.4 编译及错误解决方案
  16. Android 入门宝典 - inflate 生成视图 动态加载视图
  17. java ctr_分组密码_计数器(CTR)模式_原理及java实现
  18. 用UltraIso便捷版制作万能隐藏启动U盘
  19. 软件工程之开发与测试对缺陷重现条件的常见误解
  20. 赛效:安卓APP移动应用图标一键生成如何实现

热门文章

  1. 【Vue】 favicon.ico:1 GET http://127.0.0.1:5500/favicon.ico 404 (Not Found)
  2. MusicPlay播放器
  3. 利用Java生成二维码
  4. rebar3编译及发布erlang程序
  5. 单片机IO口应用-独立按键控制LED以及控制LED灯闪烁
  6. 2021年全球与中国印刷机行业市场规模及发展前景分析
  7. Termux安装数据库(手机安装数据库)...
  8. 通过硬件修改PWLINK2 Lite的VDD电压的方法 V1.0
  9. 计算机鼠标一直转圈圈 打不开文件,电脑鼠标一直在转圈圈,什么软件也打不开,也关不了机怎么处理...
  10. 国家知识产权局局长申长雨发言:将打击各种侵权行为,新电商法实施:“无商标,无专利,无版权”产品将会面临侵权强制下架和赔偿等。2022品牌年,拼速度。