网络摄像头国标GB28181流媒体协议视频平台EasyGBS级联后语音对讲卡死的解决方案
最近有很多用户对EasyGBS视频平台的级联很感兴趣,我也接到了不少用户的咨询。但是在语音这一块,似乎还有点问题需要我们处理,比如上一篇解决了EasyGBS级联后语音重复的问题,处理完该问题后,继续测试的时候又出现了问题——语音对讲卡死,所以本文也来讲下该问题的排查过程。
我们将EasyGBS的上级平台配置好,并且在上级平台配置信息里选择支持语音的通道注册到上级,
然后上级平台播放级联上来的通道,https访问进行对讲,
但是此时第一次讲话,设备不会出声,一直处于卡死的状态。我们再来通过抓包分析一下。
抓包可以发现语音通知命令
Broadcast\n和设备初始化注册命令CSeq: 15 INVITE都是正常的,包括上级的语音都已经发送到下级来了,所以应该是下级在朝着设备发送语音的时候出现了问题。
for { select { //等待级联的udp链接建立完成 case audioOnOff := <-Server.UacAudioOnOff[key]: dataConn := Server.UacAudioUdpConn[key] if dataConn != nil { Server.UacAudioUdpConn[key] = nil bufUDP := make([]byte, 102400)
由于是先取值再赋值,取值的时候还没有赋值,所以虽然这个UacAudioOnOff是通道,但是因为取值的时候是nil,所以之后即使赋值过后这边也不会取到了。
针对此问题我们对代码进行了改善如下
audioOnOffChan := Server.UacAudioOnOff[key] if audioOnOffChan == nil { audioOnOffChan = make(chan bool) Server.UacAudioLock.RLock() Server.UacAudioOnOff[key] = audioOnOffChan Server.UacAudioLock.RUnlock() }
在取值之前进行一次值判断,修改之后再次抓包则一切正常。
随后再次启动语音对讲,则没有问题了。如果大家仍然对我们EasyGBS级联比较感兴趣,可以看一下本文:EasyGBS如何实现视频流的向上级联?视频相关解决方案均可访问TSINGSEE青犀视频,可以联系我们获取演示方案,直观感受,也可随意进行下载及测试,如有疑问,欢迎随时咨询我们。
EasyDarwin开源流媒体服务器,是由国内开源流媒体团队TSINGSEE青犀视频开发和维护的一款开源流媒体平台框架。从2012年12月创建并发展至今,从原有的单服务的流媒体服务器形式,扩展成现在的云平台架构的开源项目。