当前位置 : 主页 > 编程语言 > java >

Android平台GB28181设备接入端PTZ指令对接详解

来源:互联网 收集:自由互联 发布时间:2023-02-04
PTZCmd实现背景 上一篇blog“Android平台GB28181设备接入模块之球机/云台控制探究”谈到,Android平台做国标GB28181设备接入端的时候,PTZ控制要不要处理?如果处理,难度大不大? 首先说要

PTZCmd实现背景

上一篇blog“Android平台GB28181设备接入模块之球机/云台控制探究”谈到,Android平台做国标GB28181设备接入端的时候,PTZ控制要不要处理?如果处理,难度大不大?

首先说要不要处理:如果只是做执法记录仪相关,Android终端作为数据采集模块,一般不具备云台上下、左右指令控制能力,但有一点,镜头的变倍(Zoom),如果有诉求的话,还是有技术必要性,特别是国标平台终端,对前端设备细节感兴趣的时候,可以通过Zoom In、Zoom Out来调整Android GB28181设备接入终端,实现摄像头的变焦。

其次,我们说一下技术实现难度:需要明确的一点是,目标设备不发送应答命令,所以实现起来,对我们已经有扩展性非常好的技术框架来说,难度不太大,如果从头实现,相对麻烦一些。

PTZ指令我们之前有提到过,如下图所示,Bit5和 Bit4不应同时为1,Bit3和 Bit2不应同时为1;Bit1和 Bit0不应同 时为1。镜头变倍指令、云台上下指令、云台左右指令三者可以组合。

Android平台GB28181设备接入端PTZ指令对接详解_GB28181 PTZ控制

技术实现细节

GB28181的云台控制命令,对Android平台设备接入端来说,难度不大,只需要把相应的云台控制命令字段回调到上层,上层做个解析,然后进行相应的命令控制即可。

让我们先来看看,国标平台侧发过来的控制消息:

MESSAGE sip:34020000001380000001@3402000000 SIP/2.0Via: SIP/2.0/UDP 192.168.1.6:15060;rport;branch=z9hG4bK623469675From: <sip:34020000002000000001@3402000000>;tag=119469675To: <sip:34020000001380000001@3402000000>Call-ID: 696469675CSeq: 342 MESSAGEContent-Type: Application/MANSCDP+xmlMax-Forwards: 70User-Agent: GB28181 AgentContent-Length: 267<?xml version="1.0" encoding="GB2312"?><Control> <CmdType>DeviceControl</CmdType> <SN>204469675</SN> <DeviceID>34020000001380000001</DeviceID> <PTZCmd>A50F0110000010D5</PTZCmd> <Info> <ControlPriority>5</ControlPriority> </Info></Control>

由于PTZCmd无需发送应答命令,只需要回复200 OK即可:

SIP/2.0 200 OKCSeq: 342 MESSAGECall-ID: 696469675From: <sip:34020000002000000001@3402000000>;tag=119469675To: <sip:34020000001380000001@3402000000>Via: SIP/2.0/UDP 192.168.1.6:15060;rport=15060;branch=z9hG4bK623469675;received=192.168.1.6Content-Length: 0

针对PTZ命令回调,大牛直播SDK的处理如下:

@Override public void ntsOnDeviceControlPTZCmd(String deviceId, String typeValue) { handler_.postDelayed(new Runnable() { @Override public void run() { Log.i(TAG, "DaniuSDK 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 Out int zoom_speed = getZoomSpeed(combination_code2); 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 In int zoom_speed = getZoomSpeed(combination_code2); Log.i(TAG, "ntsOnDeviceControlPTZCmd device_id:" + device_id_ + " PTZType:" + ptz_type_ + " Zoom In, speed:" +zoom_speed); cameraZoom(false, zoom_speed); } } } 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); }

PTZ命令的解析非常简单,只需要针对字段按照相关规范解出来即可,获取到zoom in,zoom out和zoom speed后,直接调用cameraZoom()实现针对Android摄像头变焦即可。

总结

国标平台侧通过PTZ指令,特别是针对Android的国标接入终端,实现摄像头的实时变焦,实际场景下,非常实用,特别是,如果Android平台国标设备接入端,对接有可以云台控制的RTSP摄像头,做PTZ指令的二次转发操作,也非常方便。

网友评论