如何在Android平台GB28181接入终端实现语音广播和语音对讲

发布时间 2023-09-13 10:31:07作者: PTTLINK
今天由我们华脉智联主要介绍下语音广播和语音对讲这部分。
 
GB28181平台广播和对讲这块,重要性不言而喻,没有广播的接入终端,数据只是单向流入,加入后,指挥中心和终端之间的联系更紧密,实时双向沟通更方便,适用的行业范围也更广泛。
 
关于语音广播和对讲,感兴趣的开发者可直接参阅以下部分精选介绍:
 
命令交互流程
 
命令描述流程
a) 1:SIP服务器向语音流接收者发送语音广播通知消息,消息中通过 To头域标明作为目的地址 的语音流接收者ID,消息采用 Message方法携带。
 
举例说明:
 
 MESSAGE sip:34020000002000000001@3402000000 SIP/2.0
 Via: SIP/2.0/UDP 10.84.108.162:41176;rport;branch=z9hG4bK650073bc
 From: <sip:34020000001320000111@3402000000>;tag=7e350f5e
 To: <sip:34020000002000000001@3402000000>
 Call-ID: 56005A005B0C009F@10.84.108.162
 CSeq: 6 MESSAGE
 Max-Forwards: 70
 User-Agent: GB28181 Device 1.0.6-SNAPSHOT
 Content-Type: Application/MANSCDP+xml
 Content-Length: 182
 
 <?xml version="1.0" encoding="GB2312"?>
 <Response>
 <CmdType>Broadcast</CmdType>
 <SN>410330224</SN>
 <DeviceID>34020000001320000111</DeviceID>
 <Result>OK</Result>
 </Response>
 
b) 2:语音流接收者收到语音广播通知消息后,向SIP服务器发送200OK 响应。
 

SIP/2.0 200 OK
Via: SIP/2.0/UDP 10.84.108.162:41176;rport=34988;received=112.96.112.147;branch=z9hG4bK650073bc
From: <sip:34020000001320000111@3402000000>;tag=7e350f5e
To: <sip:34020000002000000001@3402000000>;tag=403330303
CSeq: 6 MESSAGE
Call-ID: 56005A005B0C009F@10.84.108.162
User-Agent: LiveGBS v230901
Content-Length: 0
 
c) 3:语音流接收者向SIP服务器发送语音广播应答消息,消息中通过 To头域标明作为目的地 址的SIP服务器ID,消息采用 Message方法携带。
 
  MESSAGE sip:34020000002000000001@3402000000 SIP/2.0
  Via: SIP/2.0/UDP 10.84.108.162:41176;rport;branch=z9hG4bK650073df
  From: <sip:34020000001320000111@3402000000>;tag=507dffb5
  To: <sip:34020000002000000001@3402000000>
  Call-ID: 53548DE5289D37AE@10.84.108.162
  CSeq: 8 MESSAGE
  Max-Forwards: 70
  User-Agent: GB28181 Device 1.0.6-SNAPSHOT
  Content-Type: Application/MANSCDP+xml
  Content-Length: 182
  
  <?xml version="1.0" encoding="GB2312"?>
  <Response>
  <CmdType>Broadcast</CmdType>
  <SN>971364695</SN>
  <DeviceID>34020000001320000111</DeviceID>
  <Result>OK</Result>
  </Response>
 
d) 4:SIP服务器收到语音广播应答消息后,向语音流接收者发送200OK 响应。
 
SIP/2.0 200 OK
Via: SIP/2.0/UDP 10.84.108.162:41176;rport=34988;received=112.96.112.147;branch=z9hG4bK650073df
From: <sip:34020000001320000111@3402000000>;tag=507dffb5
To: <sip:34020000002000000001@3402000000>;tag=187364779
CSeq: 8 MESSAGE
Call-ID: 53548DE5289D37AE@10.84.108.162
User-Agent: LiveGBS v230901
Content-Length: 0
 
e) 5:语音流接收者向SIP服务器发送Invite消息,消息中通过 To头域标明作为目的地址的语音 流发送者ID,消息头域中携带Subject字段,表明请求的语音流发送者ID、发送方媒体流序列 号、语音流接收者ID、接收方媒体流序列号等参数,SDP消息体中s字段为“Play”代表实时点 播,m 字段中媒体参数标识为“audio”表示请求语音媒体流。
SIP/2.0 200 OK
Via: SIP/2.0/UDP 10.84.108.162:41176;rport=34988;received=112.96.112.147;branch=z9hG4bK650073df044bdf1a
From: <sip:34020000001320000111@3402000000>;tag=781e4246
To: <sip:34020000002000000001@3402000000>;tag=863364779
CSeq: 1 INVITE
Call-ID: 5FA30FCB22E0FD64650073DF-10.84.108.162
User-Agent: LiveGBS v230901
Contact: <sip:34020000002000000001@172.21.86.144:15060>
Content-Length: 152
Content-Type: APPLICATION/SDP

v=0
o=34020000002000000001 0 0 IN IP4 39.101.74.103
s=Play
c=IN IP4 39.101.74.103
t=0 0
m=audio 18116 RTP/AVP 8
a=sendrecv
a=rtpmap:8 PCMA/8000
 
f) 6:SIP服务器收到Invite请求后,通过三方呼叫控制建立媒体服务器和语音流发送者之间的媒体连接。向媒体服务器发送Invite消息,此消息不携带SDP消息体。
 
g) 7:媒体服务器收到SIP服务器的Invite请求后,回复200OK 响应,携带SDP消息体,消息体 中描述了媒体服务器接收媒体流的IP、端口、媒体格式等内容。
 
h) 8:SIP服务器收到媒体服务器返回的200OK 响应后,向语音流发送者发送Invite请求,消息 中通过 To头域标明作为目的地址的语音流发送者ID,消息头域中携带 Subject字段,表明请 求的语音流发送者ID、发送方媒体流序列号、语音流接收者ID、接收方媒体流序列号等参数, 请求中携带消息7中媒体服务器回复的200OK 响应消息体,s字段为“Play”代表实时点播, m 字段中媒体参数标识为“audio”表示请求语音媒体流,增加y字段描述SSRC值,f字段描述 媒体参数。
SIP/2.0 200 OK
Via: SIP/2.0/UDP 10.84.108.162:41176;rport=34988;received=112.96.112.147;branch=z9hG4bK650073df044bdf1a
From: <sip:34020000001320000111@3402000000>;tag=781e4246
To: <sip:34020000002000000001@3402000000>;tag=863364779
CSeq: 1 INVITE
Call-ID: 5FA30FCB22E0FD64650073DF-10.84.108.162
User-Agent: LiveGBS v230901
Contact: <sip:34020000002000000001@172.21.86.144:15060>
Content-Length: 152
Content-Type: APPLICATION/SDP

v=0
o=34020000002000000001 0 0 IN IP4 39.101.74.103
s=Play
c=IN IP4 39.101.74.103
t=0 0
m=audio 18116 RTP/AVP 8
a=sendrecv
a=rtpmap:8 PCMA/8000
 
i) 9:语音流发送者收到SIP服务器的Invite请求后,回复200OK 响应,携带SDP消息体,消息 体中描述了媒体流发送者发送媒体流的IP、端口、媒体格式、SSRC 字段等内容,s字段为 “Play”代表实时点播,m 字段中媒体参数标识为“audio”表示请求语音媒体流。
 
j) 10:SIP服务器收到语音流发送者返回的200OK 响应后,向媒体服务器发送 ACK 请求,请求 中携带消息9中语音流发送者回复的200OK 响应消息体,完成与媒体服务器的Invite会话 建立过程。
 
k) 11:SIP服务器收到语音流发送者返回的200OK 响应后,向语音流发送者发送 ACK 请求,请 求中不携带消息体,完成与语音流发送者的Invite会话建立过程。
 
l) 12:完成三方呼叫控制后,SIP服务器通过 B2BUA 代理方式建立语音流接收者和媒体服务器 之间的媒体连接。在消息5中增加SSRC值,转发给媒体服务器。
 
m)13:媒体服务器收到Invite请求,回复200OK 响应,携带SDP消息体,消息体中描述了媒体服 务器发送媒体流的IP、端口、媒体格式、SSRC值等内容,s字段为“Play”代表实时点播,m 字段 中媒体参数标识为“audio”表示请求语音媒体流。
 
n) 14:SIP服务器将消息转发给语音流接收者。
 
o) 15:语音流接收者收到200OK 响应后,回复 ACK 消息,完成与SIP服务器的Invite会话建立 过程。
 
p) 16:SIP服务器将消息15转发给媒体服务器,完成与媒体服务器的Invite会话建立过程。
 
注:语音广播通知消息除上述流程中通过SIP服务器发出外,也可由语音流发送者发出,消息中通过 To头域标明 作为目的地址的语音流接收者ID,经SIP服务器中转后发往语音流接收者;语音流接收者处理后发送应答消 息,消息中通过 To头域标明作为目的地址的语音流发送者ID,经SIP服务器中转后回复给语音流发送者。后续呼叫流程与上述流程相同。
 
语音对讲
语音对讲功能实现中心用户与前端用户之间的一对一语音对讲功能。 语音对讲功能由下述两个独立的流程组合实现:
 
a) 通过9.2的实时视音频点播功能,中心用户获得前端设备的实时视音频媒体流;
 
b) 通过9.12的语音广播功能,中心用户向前端对讲设备发送实时音频媒体流,语音流的封装格 式见 C.2.4音频流的 RTP封装定义。
 
C.2.4 音频流的 RTP封装
 
语音比特流宜采用标准的 RTP协议进行打包,这里只摘录G.711A律的:
 
在一个 RTP包中,音频载荷数据应为整数个音频编码帧,且时间长度在20ms~180ms之间。
 
音频载荷数据的 RTP封装参数如下:
 
a) G.711的主要参数 G.711A律语音编码 RTP包的负载类型(PayloadType)的参数规定如下(见IETFRFC3551— 2003中的表4): 1)负载类型(PT):8; 2) 编码名称(encodingname):PCMA; 3) 时钟频率(clockrate):8kHz; 4) 通道数:1; 5) SDP描述中“m”字段的“media”项:audio。
 
技术实现
 
 
语音广播接收这块,由于有之前的RTMP和RTSP播放器积累,直接在player端做相应扩展即可,当收到语音对讲通知后,GB28181语音广播按钮使能。
 
相关接口设计如下:
public interface IEngineEventHandler {
    /*
     * @param type {@link EventHandlerStatus.EventHandlerType}
     * @param state {@link EventHandlerStatus.EventState}
     */
    void onState(int type, int state);
}
 
相关调用代码:
 private val engineEventHandler =
    IEngineEventHandler { type, state ->
      if (type == EventHandlerStatus.EventHandlerType.type_call_out) { //语音对讲事件
            when (state) {
                EventHandlerStatus.EventState.PUEVT_CALL_OUT -> { //语音对讲呼出
           
                }

                EventHandlerStatus.EventState.PUEVT_CONNECT -> { //语音对讲接通
                
                }

                EventHandlerStatus.EventState.PUEVT_HANGUP -> { //语音对讲挂断
           
                }
            }
    }
  }
 
 
总结
至此、Android平台GB28181接入终端,如位置订阅、语音广播和语音对讲这块已经全面覆盖,加上之前的技术积累,看了下,已覆盖了以下部分:
 
[视频格式]H.264/H.265(Android H.265硬编码);
[音频格式]G.711 A律、AAC;
[音量调节]Android平台采集端支持实时音量调节;
[H.264硬编码]支持H.264特定机型硬编码;
[H.265硬编码]支持H.265特定机型硬编码;
[软硬编码参数配置]支持gop间隔、帧率、bit-rate设置;
[软编码参数配置]支持软编码profile、软编码速度、可变码率设置;
支持纯视频、音视频PS打包传输;
支持RTP OVER UDP和RTP OVER TCP被动模式;
支持信令通道网络传输协议TCP/UDP设置;
支持注册、注销,支持注册刷新及注册有效期设置;
支持设备目录查询应答;
支持心跳机制,支持心跳间隔、心跳检测次数设置;
支持移动设备位置(MobilePosition)订阅和通知;
支持国标GB/T28181—2016平台接入;
支持语音广播及语音对讲;
[实时水印]支持动态文字水印、png水印;
[实时静音]支持实时静音/取消静音;
[实时快照]支持实时快照;
[降噪]支持环境音、手机干扰等引起的噪音降噪处理、自动增益、VAD检测。
特别是语音广播和语音对讲这块,是GB28181终端接入模块的一个核心扩展功能,在智能门禁、工业与物联网、监控等行业,用途非常广泛,技术实现这块,不要忽略的技术点还有降噪和回音消除这块,由于之前我们有技术积累,可以直接复用,对新入手的开发者来说,也提出了新的挑战,感兴趣的开发者,可以酌情参考。