标题:Qt/C++开发监控GB28181系统/公网对讲/代码实现28181语音对讲/采集本地麦克风数据/支持udp和tcp模式
作者:liudianwu
日期:2025-09-14 08:15
内容:
## 一、前言说明
按照国标的文档,语音对讲这块,并没有强制要求支持公网对讲,所以当初设备厂家做的都是支持的udp对讲,而且按照国标协议要求,对讲是先发一个语音对讲广播到设备,设备收到后,主动发起对讲到服务端,和视频点播是反着来的,这样的话数据的传输模式只能设备控制,默认一般都是udp,也就是设备端打开udp端口,服务端主动往这个端口发送数据。这个机制在局域网没有问题的,但是在公网上,就存在严重的缺陷了,服务端的IP是固定的,设备端不是固定的,而且服务端也无法正常连到设备端,除非对讲的sdp中约定tcp主动模式,也就是服务端这边监听端口,设备端主动连接,然后在这个连接上发送语音数据,所以新的海康的设备,在28181设置的地方,有个TCP广播的开关,开启后,就表示采用tcp方式传输语音对讲数据。
大华的设备目前为止没有看到类似的机制,而是采用拓展的sip协议,和类似视频点播的模式一样,sdp中对应play关键字改成talk,这样的话语音对讲的方式也是和视频点播一样,就可以由服务端任意控制何种方式了,也就肯定支持公网对讲了,也不知道后续国标文档会不会也改成这个方法,不然目前都是没有统一,这就很难办。
**语音对讲大致流程:**
- 1,发送语音广播Broadcast指令到设备。
- 2,设备发送invite点播指令,里面带的sdp数据指定了何种方式哪个端口。
- 3,服务端绑定或打开对应的端口,打开成功后,组织sdp数据通过sip指令发给设备。
- 4,设备应答ack指令,服务端打开麦克风采集数据。
- 5,数据默认是pcm格式的,转成pcma格式,rtp打包发出去。
**特别说明:**
1. 打开通道视频,在视频控件悬浮条上单击语音对讲按钮开始对讲,再次单击关闭对讲,同一时刻只允许一个通道处于对讲状态。
2. 先发送语音广播通知,通过MESSAGE指令,xml数据对应cmdtype=Broadcast,信息带上SourceID和TargetID。
3. 设备端收到语音广播通知后,会主动发起INVITE点播请求到服务端,请求中带了sdp信息。
4. 服务端解析sdp信息,应答点播请求,同样带上自己这边的sdp信息。
5. 服务端绑定端口,根据sdp内容选择是被动接收还是主动发起连接到设备端。
6. 设备端应答ack,开启语音对讲,服务端采集语音pcm数据,转成pcma,再通过rtp打包发给对应设备端口。
7. 默认设备支持的是局域网对讲,如果要公网对讲,需要支持tcp主动模式,也就是设备主动连接服务端,然后服务端对对应的连接发送语音数据。
8. 测试发现海康大华的设备,音频播放那边 ..