这几天翻了一下以前的博文,发现讲到频率比较多的还是关于视频流的卡顿、延时相关的问题,我已经迫切的感受到了大家对于视频流质量的要求了。
但是我不能否认,视频质量在5G时代,也是有很大发展空间的,像我们开发的支持国标GB28181协议的视频平台EasyGBS,可以说是一个比较完善成熟的视频平台了,但也会遇到视频流卡顿,或者无法播放的问题。
网络是衡量视频流质量高低的一个重要标准,当摄像头网络卡顿时,接收视频流的平台EasyGBS无疑会收到影响,点击播放视频的时候页面请求会一直得不到响应,导致程序误以为系统崩溃卡死。
经排查发现,是在网页点击播放之前,会向后端去请求播放地址,后端请求播放地址的时候回去获取视频编码,获取方式是循环的去读取流信息。
VideoCode := 0
for {
tempstream := uas.Server.GetStreamFromRedis(stream.StreamID)
if tempstream != nil {
VideoCode = tempstream.VideoCode
}
if VideoCode == 0 {
time.Sleep(time.Second * 1)
continue
}
break
}
这种做法不好之处就是没有添加超时返回,导致视频一直请求,但又一直得不到响应。
解决方案就是添加指定次数后超时返回,修改代码如下:
VideoCode := 0
loopcount := 0
for {
tempstream := uas.Server.GetStreamFromRedis(stream.StreamID)
if tempstream != nil {
VideoCode = tempstream.VideoCode
}
if loopcount >= 5 {
break
}
if VideoCode == 0 {
time.Sleep(time.Second * 1)
loopcount++
continue
}
break
}
修改过后,假如摄像头网络不好,超时也会有返回数据,从而让服务器能够取读。