EasyGBS平台出现语音播报重复现象,该如何解决?

2022-09-16 17:34:58 浏览数 (1)

国标视频云服务EasyGBS支持设备/平台通过国标GB28181协议注册接入,并能实现视频的实时监控直播、录像、检索与回看、语音对讲、云存储、告警、平台级联等功能。平台部署简单、可拓展性强,支持将接入的视频流进行全终端、全平台分发,分发的视频流包括RTSP、RTMP、FLV、HLS、WebRTC等格式。

有用户反馈,在EasyGBS平台中出现了语音播报错误的情况。除了第一次正常播报以外,后续的语音都是重复播报。收到用户反馈后,技术人员立即开展排查与解决,以下为解决步骤:

1)首先通过抓包分析,发现第一次发送时,上下级平台的音频一致,但是第二次上级平台发送的是新采集的音频,下级平台向设备发送的却是上次的音频;

2)随后排查代码发现,因为每次建立的udp链接读取过后,都放在了一个缓存的buf数组里,并且udp的监听链接也没有关闭,所以会导致数据错乱,出现发送上图数据的情况;

3)只需要添加以下代码:

代码语言:javascript复制
Server.UacAudioUdpConn[key] = nil

并在每次获取到udp链接时,将本次使用的链接置空;

代码语言:javascript复制
case audioOnOff := <-Server.UacAudioOnOff[key]:
				if dataConn != nil {
					Server.UacAudioUdpConn[key] = nil
					bufUDP := make([]byte, 102400)
					//err := dataConn.SetReadDeadline(time.Now().Add(time.Second * 5))
					//if err != nil {
					//	Server.UacAudioUdpConn[key].Close()
					//	log.Println("超时处理")
					//	return
					//}
					time.Sleep(time.Second * 1)
					for audioOnOff {
						n, _, err := dataConn.ReadFromUDP(bufUDP)
						if err != nil {
							//Server.UacAudioUdpConn[key].Close()
							log.Printf("udp read error, %v", err)
							continue
						}
						rtpBuf := make([]byte, n)
						copy(rtpBuf, bufUDP[:n])
						tempint, err := transportMS.UDPConn.Write(rtpBuf)
						if err != nil {
							log.Printf("发送rtperr : %s  ,tempint :%d", err, tempint)
							return
						}
						time.Sleep(80 * time.Millisecond)
						log.Println("发送tempint", tempint)
					}

				}

4)按上述方法修改后,每次发送的语音都和上级发送的语音一致了,语音播报重复的问题得到了解决。

除了提供API接口供用户调用、集成与二次开发,EasyGBS还能提供个性化定制,以满足用户的多样化功能需求。

udp

0 人点赞