网络摄像头国标GB28181流媒体协议视频平台EasyGBS级联后语音对讲卡死的解决方案

最近有很多用户对EasyGBS视频平台的级联很感兴趣,我也接到了不少用户的咨询。但是在语音这一块,似乎还有点问题需要我们处理,比如上一篇解决了EasyGBS级联后语音重复的问题,处理完该问题后,继续测试的时候又出现了问题——语音对讲卡死,所以本文也来讲下该问题的排查过程。

EasyGBS架构2.5D.png

我们将EasyGBS的上级平台配置好,并且在上级平台配置信息里选择支持语音的通道注册到上级,

67.png

然后上级平台播放级联上来的通道,https访问进行对讲,

68.png

但是此时第一次讲话,设备不会出声,一直处于卡死的状态。我们再来通过抓包分析一下。

69.png

抓包可以发现语音通知命令
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()
	}

在取值之前进行一次值判断,修改之后再次抓包则一切正常。

70.png

随后再次启动语音对讲,则没有问题了。如果大家仍然对我们EasyGBS级联比较感兴趣,可以看一下本文:EasyGBS如何实现视频流的向上级联?视频相关解决方案均可访问TSINGSEE青犀视频,可以联系我们获取演示方案,直观感受,也可随意进行下载及测试,如有疑问,欢迎随时咨询我们。

EasyDarwin开源流媒体服务器,是由国内开源流媒体团队TSINGSEE青犀视频开发和维护的一款开源流媒体平台框架。从2012年12月创建并发展至今,从原有的单服务的流媒体服务器形式,扩展成现在的云平台架构的开源项目。

猜你喜欢

转载自blog.csdn.net/EasyGBS/article/details/108734124