基于GB28181协议,实现WVP平台语音广播

        上篇我们讲到从零基础搭建流媒体平台,这一篇我们来聊一下怎样基于国标协议,来实现语音广播功能。
        国标GB/T 28181-2016文档,第9.12小节里,有对语音广播的详细描述。具体内容我们就不再赘述,开发者可以自行查阅。我们来看一下文档里对语音广播的命令流程图:

        如果开发者基于WVP来开发,以上流程可以只看语音流接收者和SIP服务器的命令流程,其他暂时不需要,而且整个语音广播在这里都不需要和流媒体交互。我们以大华设备为例,来演示整个语音广播流程。这里需要注意的是,大华设备如果没有上报语音通道,则默认填写语音编码为34020000001370000001。

## 平台向设备发送语音广播通知
MESSAGE sip:[email protected]:5061 SIP/2.0
Call-ID: [email protected]
CSeq: 1 MESSAGE
From: <sip:[email protected]:6060>;tag=FromBcst1689689910253
To: <sip:52000010102330000004@5200001010>
Via: SIP/2.0/UDP 10.10.10.188:6060;branch=z9hG4bK-ViaBcst-1689689910253;rport
Max-Forwards: 70
Content-Type: Application/MANSCDP+xml
Content-Length: 178

<?xml version="1.0" ?>
<Notify>
<! -- 命令类型:广播通知-->
<CmdType>Broadcast</CmdType>
<! -- 命令序列号-->
<SN>914042</SN>
<! -- 语音输入设备的设备编码-->
<SourceID>52000010102330000001</SourceID>
<! -- 语音输出设备的设备编码-->
<TargetID>34020000001370000001</TargetID>
</Notify>

## 设备向平台回复200 OK
SIP/2.0 200 OK
Call-ID: [email protected]
Content-Length: 0
CSeq: 1 MESSAGE
From: <sip:[email protected]:6060>;tag=FromBcst1689689910253
To: <sip:52000010102330000004@5200001010>;tag=019d182856233baf702250b60fbf48f3
User-Agent: SIP UAS V3.0.0.954282
Via: SIP/2.0/UDP 10.10.10.188:6060;rport=6060;branch=z9hG4bK-ViaBcst-1689689910253
## 设备向平台发送语音广播应答
MESSAGE sip:[email protected]:6060 SIP/2.0
Call-ID: 8a75dde22d56ff96180fce46d8c242e5
Content-Length: 181
Content-Type: Application/MANSCDP+xml
CSeq: 1482 MESSAGE
From: <sip:[email protected]:5061>;tag=c76ca68a1f706a5276df0f3d2f2a42ae
Max-Forwards: 70
To: <sip:[email protected]:6060>
User-Agent: SIP UAS V3.0.0.954282
Via: SIP/2.0/UDP 10.10.10.17:5061;rport;branch=z9hG4bK3c908afb2f8160dff91b52e613c674ac

<?xml version="1.0" encoding="GB2312" standalone="yes" ?>
<Response>
<CmdType>Broadcast</CmdType>
<SN>914042</SN>
<DeviceID>34020000001370000001</DeviceID>
<Result>OK</Result>
</Response>
## 平台向设备回复200 OK
SIP/2.0 200 OK
CSeq: 1482 MESSAGE
Call-ID: 8a75dde22d56ff96180fce46d8c242e5
From: <sip:[email protected]:5061>;tag=c76ca68a1f706a5276df0f3d2f2a42ae
To: <sip:[email protected]:6060>
Via: SIP/2.0/UDP 10.10.10.17:5061;rport=5061;branch=z9hG4bK3c908afb2f8160dff91b52e613c674ac;received=10.10.10.17
Content-Length: 0
## 设备回复INVITE消息,告知平台设备接收音频的端口号
INVITE sip:[email protected]:6060 SIP/2.0
Call-ID: 8f3f84a660fb8bfa13d8ebc7729a7d51
Contact: <sip:[email protected]:5061>
Content-Length: 237
Content-Type: application/sdp
CSeq: 1 INVITE
Expires: 120
From: <sip:[email protected]:5061>;tag=4ecd395802160bdaedd6151885fcd27b
Max-Forwards: 70
Subject: 52000010102330000001:03d7a8ef3276a8ef327,34020000001370000001:0552354c54f3354c54f
To: <sip:[email protected]:6060>
User-Agent: SIP UAS V3.0.0.954282
Via: SIP/2.0/UDP 10.10.10.17:5061;rport;branch=z9hG4bKdf2458160f3f6a696bc219528e74f505

v=0
o=52000010102330000004 0 0 IN IP4 10.10.10.17
s=Play
i=VCam BroadCast Session
c=IN IP4 10.10.10.17
t=0 0
m=audio 10520 RTP/AVP 8 96 ##设备接收语音广播的端口号为10520,需要开发者自行储存,方便下面调用
a=recvonly
a=rtpmap:8 PCMA/8000/1
a=rtpmap:96 PS/90000
y=0065457400
f=v/0/0/0/0/0a/1/8/1
## 平台回应200 OK 响应设备的INVITE消息
SIP/2.0 200 OK
CSeq: 1 INVITE
Call-ID: 8f3f84a660fb8bfa13d8ebc7729a7d51
From: <sip:[email protected]:5061>;tag=4ecd395802160bdaedd6151885fcd27b
To: <sip:[email protected]:6060>;tag=z9hG4bK-ViaBcst-1689689910282
Via: SIP/2.0/UDP 10.10.10.17:5061;rport=5061;branch=z9hG4bKdf2458160f3f6a696bc219528e74f505;received=10.10.10.17
Content-Type: APPLICATION/SDP
Contact: <sip:[email protected]:6060>
User-Agent: DC-ColorFul
Content-Length: 180

v=0
o=52000010102330000004 0 0 IN IP4 10.10.10.188
s=Play
c=IN IP4 10.10.10.188
t=0 0
m=audio 8157 RTP/AVP 8 ## 准备一个本地端口,用于语音广播创建UDP连接,这里为8157
a=rtpmap:8 PCMA/8000
<! -- 只发不收-->
a=sendonly
y=0065457400
<! --字段:f= v/编码格式/分辨率/帧率/码率类型/码率大小a/编码格式/码率大小/采样率 -->
f=v/a/1/8/1

        这里我们需要准备一个本地端口,用于语音广播创建UDP连接。需要注意的是,这个本地端口不能被其他程序占用,也不能被其他设备占用。如果用于语音广播的设备比较多,就需要开发者自行去分配这些本地端口。

## 设备向平台发送ACK消息
ACK sip:[email protected]:6060 SIP/2.0
Call-ID: 8f3f84a660fb8bfa13d8ebc7729a7d51
Contact: <sip:[email protected]:5061>
Content-Length: 0
CSeq: 1 ACK
From: <sip:[email protected]:5061>;tag=4ecd395802160bdaedd6151885fcd27b
Max-Forwards: 70
To: <sip:[email protected]:6060>;tag=z9hG4bK-ViaBcst-1689689910282
User-Agent: SIP UAS V3.0.0.954282
Via: SIP/2.0/UDP 10.10.10.17:5061;rport;branch=z9hG4bKb874c74b8b87e4b96e45608bd9c5d801

        收到设备ACK消息后,不需要做任何回复。

        拿到之前储存的设备接收音频流的端口号(10520),设备IP(10.10.10.17),本地创建UDP端口号(8157)。开始RTP打包音频数据发送到摄像头,因为大多数设备只支持g711a格式的音频,所以我们这里打包g711a格式的音频数据发送给设备。

        g711a音频数据我们可以通过FFMPEG命令来生成,使用命令如下:

ffmpeg -i D:\文档\GB28181\fangsheng.mp3 -map_metadata -1 -fflags +bitexact -acodec pcm_alaw -ac 1 -ar 8000 D:\文档\GB28181\fangsheng.wav -y

        这样就可以构建出一个编码为PCMA格式、采样率为8000的单声道音频。

## 语音广播结束之后,关闭语音广播,给设备发送BYE指令
BYE sip:[email protected]:5061 SIP/2.0
Call-ID: 1fcbf8f1e8efc171daaf1677b585f4ec
CSeq: 2 BYE
From: <sip:52000010102330000001@5200001010>;tag=z9hG4bK-ViaBcst-1689694372435
To: <sip:34020000001370000001@5200001010>;tag=4f7a72e1f01183dae1b67f77b120c811
Via: SIP/2.0/UDP 10.10.10.17:5061;branch=z9hG4bK-313335-f9f2f7c7dafcb225442b96a2460fb586
Max-Forwards: 70
Content-Length: 0
## 设备回复200 OK
SIP/2.0 200 OK
Via: SIP/2.0/UDP 10.10.10.17:5061;branch=z9hG4bK-313335-f9f2f7c7dafcb225442b96a2460fb586
From: <sip:34020000001370000001@5200001010>;tag=4f7a72e1f01183dae1b67f77b120c811
To: <sip:52000010102330000001@5200001010>;tag=z9hG4bK-ViaBcst-1689694372435
Call-ID: 1fcbf8f1e8efc171daaf1677b585f4ec
CSeq: 2 BYE
Content-Length: 0

        广播结束之后我们记得关闭本地创建的UDP端口。最后贴一张在我平台的实现的语音广播功能截图,语音广播具体播报的语音文件,可以在代码里根据具体业务场景来实现。

        这就是整个语音广播的流程和实现逻辑,其他设备也是同样的原理,如宇视、海康等。RTP打包音频数据发送到摄像头这里我们就不再详细介绍,有需要深入了解和需要相关二次开发的,可以留言交流。

        ps:(预告一下)下一篇我准备讲基于国标协议的语音对讲实现逻辑~

猜你喜欢

转载自blog.csdn.net/qq_33104169/article/details/131799834
今日推荐