国标视频云服务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还能提供个性化定制,以满足用户的多样化功能需求。