关于使用GB28181协议实现与大华摄像机的语音对讲功能小记

目前只测试了与大华摄像机的语音对讲功能,在此记录下对接工程中遇到的问题和收获。

首先我们需要理清下思路:

第一步要熟悉语音对讲的协议流程,下图为国标28181中的参考图:

关于使用GB28181协议实现与大华摄像机的语音对讲功能小记

这里我们可以简化下流程,只参与与摄像机的信令交互,也就是1,2,3,4,5,14,15 17,18

这里我将信令详情展示出来,以供参考

1.发送语音广播请求
MESSAGE sip:34020000001320000001@192.168.1.108:5060 SIP/2.0
Via: SIP/2.0/UDP 192.168.1.20:9088;branch=4dae6d98892f4a0fb630b8e77d49bc30;rport
To: “”

2.设备回复OK
SIP/2.0 200 OK
Call-ID: 6b135a147f4b425e981406bdd9751924@192.168.1.20
Content-Length: 0
CSeq: 1 MESSAGE
From: “34020000002000000002”

3.设备发送广播通知结果请求
MESSAGE sip:34020000002000000002@192.168.1.20:9088 SIP/2.0
Call-ID: 67c4f0acd67bb28284401481f6d66ba7
Content-Length: 187
Content-Type: Application/MANSCDP+xml
CSeq: 4997 MESSAGE
From:

4.回复设备OK
SIP/2.0 200 Ok
Via: SIP/2.0/UDP 192.168.1.108:5060;rport=5060;branch=z9hG4bKa1bc3d6ca30b7e643b67aa393c7fb9f6;received=192.168.1.108
To:

5.设备主动发起INVITE 请求
INVITE sip:34020000002000000002@192.168.1.20:9088 SIP/2.0
Call-ID: 24174d55333b5ba8c1b04ea8be4a755f
Contact:
v=0
o=34020000001320000001 0 0 IN IP4 192.168.1.108
s=Play
i=VCam BroadCast Session
c=IN IP4 192.168.1.108
t=0 0
m=audio 9920 RTP/AVP 8 96
a=recvonly
a=rtpmap:8 PCMA/8000/1
a=rtpmap:96 PS/90000
y=0232409800
f=v/0/0/0/0/0a/1/8/1

14.回复给设备带SDP的OK确认消息
SIP/2.0 200 Ok
Via: SIP/2.0/UDP 192.168.1.108:5060;branch=z9hG4bK17794d3a5b5e56a894332fd42136c92f;rport
To: “”
v=0
o=34020000002000000002 0 0 IN IP4 192.168.1.20
s=Play
c=IN IP4 192.168.1.20
t=0 0
m=audio 30050 RTP/AVP 8
a=sendonly
a=rtpmap:8 PCMA/8000/1
y=0232409800

15.设备回复ACK确认消息
ACK sip:34020000002000000002@192.168.1.20:9088 SIP/2.0
Call-ID: 24174d55333b5ba8c1b04ea8be4a755f
Contact:

在这个过程中,我们可以得到以下信息:

1.设备支持8000采样率,单通道的PCMA流和90000 PS包

2.设备提供的收留端口为9920

3.我们发送流的端口为30050

4.我们需要发送的音频流为PCMA 8000采样率的RTP包

这里还有几点需要注意:

1.经过测试,语音对讲请求与设备的通道ID中是否标记为137无关,在信令1中TargetID字段的标红部分

关于使用GB28181协议实现与大华摄像机的语音对讲功能小记

2.发起语音广播请求1中,TargetID可以为设备ID,也可以为设备的通道ID,

3.设备发送的INVITE后,回复带SDP的OK响应时(信令14),to字段中tag不能为空,可以指定为call-id,否则无法收到ACK确认消息

4.回复带SDP的OK响应时(信令14),sdp协议中不要包含多余信息。如

m=audio 30050 RTP/AVP 8 96
a=sendonly
a=rtpmap:8 PCMA/8000/1

这里我们并没有使用96 PS流,如果这样发送过去,会导致设备确认后,立马发送BYE消息

所以,不必要的信息,最好不带,以免参数异常问题

至此,我们与摄像机建立了语音对讲的连接。接下来我们只需要使用协商好的端口往摄像机指定的端口发送数据流即可。

接下来,我们需要发送PCMA 8000的RTP包,这里需要用到VLC,ffmpeg,ffprobe,ffplay等工具,这些工具可以帮助我们测试。

首先,如何构建出一个PCMA 8000 单通道的问题,使用FFMPEG命令:

ffmpeg -i D:\CloudMusic\外婆.mp3 -map_metadata -1 -fflags +bitexact -acodec pcm_alaw -ac 1 -ar 8000 外婆_PCMA.wav -y

参数详解: -acode pcm_alaw 编码为pcma格式

-ac 1 单声道

-ar 8000是采样率8000

-map_metadata -1 -fflags +bitexact 是将ffmpeg转码默认携带的LIST的数据(artist,genre等)去掉,变成标准的44字节的wav文件头

这里使用fprobe工具查看我们转码的文件是不是我们想要的

ffprobe C:\Users\24610\外婆_PCMA.wav

关于使用GB28181协议实现与大华摄像机的语音对讲功能小记

这里,我们看到的确是我们想要的文件,那么如何打包成RTP流发送出去呢?

我们打开VLC,

关于使用GB28181协议实现与大华摄像机的语音对讲功能小记

关于使用GB28181协议实现与大华摄像机的语音对讲功能小记

关于使用GB28181协议实现与大华摄像机的语音对讲功能小记

关于使用GB28181协议实现与大华摄像机的语音对讲功能小记

关于使用GB28181协议实现与大华摄像机的语音对讲功能小记

关于使用GB28181协议实现与大华摄像机的语音对讲功能小记

关于使用GB28181协议实现与大华摄像机的语音对讲功能小记

这里我们已经开始发送RTP流了,我们可以使用ffplay播放,

ffplay -i rtp://192.168.1.20:5004

或者再启动一个VLC,打开网络串流输入:rtp://192.168.1.20:5004 都是可以的,这里我们可以拿来测试RTP包是否发送正常,这里还不能往摄像机发送,因为这里发送端口是随机的,我们需要使用特定端口(这里是30050)来发送,这就要在代码中实现的。

Original: https://blog.csdn.net/yunxiaobaobei/article/details/127811015
Author: 白杨攻城狮
Title: 关于使用GB28181协议实现与大华摄像机的语音对讲功能小记

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/655744/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球