目前在一些项目合作的过程中,我们发现,越来越多的团队开始使用摄像头的语音对讲功能来实现服务端与设备端的音视频语音对讲与喊话。在监控系统中,语音喊话是比较实用的功能,市面上部分摄像头本身就自带拾音器,如果摄像头不带,也可以自己加装拾音器。
使用TSINGSEE青犀视频国标协议GB28181视频平台EasyGBS的用户多数都有语音喊话的需求,所以在最新的产品升级更新中,我们增加了语音喊话功能并进行项目测试。我们在测试的时候发现,国标协议GB28181视频平台EasyGBS语音喊话功能会出现采集好的音频发送到摄像头却无法播放的问题。
通过wireshark分析,在wireshark中的流数据展示如下:
从wireshark的音频波形可以看出不是一个正确的波形,经过排查是前端采集的音频的类型是pcm裸数据,但是传给摄像头的时候是把这个数据当做g711a的压缩格式去解析的所以出现错误。
我们将pcm的音频格式改为g711a文件再次传输,波形就会恢复正常。
select {
case talkdata := <-Server.TalkChan:
b, err := ioutil.ReadFile("./test.g711-alaw")
if err != nil {
fmt.Println("ioutil ReadFile error: ", err)
return
}
ioutil.WriteFile("./output2.g711-alaw", b, 0666)
//retinfo := rtp.MakeParseRTP([]byte(talkdata))
//rtparr, err := ps.ConvertEs2Rtp([]byte(talkdata), 1, 0x1c, true, retinfo)
rtparr, err := ps.ConvertPCM2Rtp(b)
//rtparr, err := ps.ConvertPCM2Rtp([]byte(talkdata))
if err != nil {
fmt.Println("发送rtperr", err)
return
}
//retinfo := rtp.ParseRTP([]byte(talkdata))
for _, v := range rtparr {
tempint, err := transportMS.UDPConn.Write(v.Payload)
if err != nil {
fmt.Println("发送rtperr", err)
return
}
time.Sleep(10 * time.Millisecond)
fmt.Println("发送tempint", tempint)
}
而像本文开头提到的音频不能播放的问题也解决了。