网络摄像头IPC网页无插件直播国标gb28181协议视频平台EasyGBS开启云端录像后断流如何解决?
程序员文章站
2022-07-05 20:00:25
...
TSINGSEE青犀视频研发团队研发的国标GB28181协议视频平台有三种录像方式,分别是云端录像、实时录像和设备录像,三种录像方式有不同的功能(云端录像存储及计划保存介绍)。
在EasyGBS运行的时候我们发现了一个问题,设备接入到EasyGBS上,刚开始能正常播放,随后开启云端录像,就出现流断流的现象,这其中我们并没有进行停止播放的操作。
进过抓包分析,排查出是程序向设备发送了停止推流的请求。
但是此时设备的状态确实在播放的状态,所以我们仍然需要继续排查。
在排查代码之后我们发现,在设备网络不好的时候设备会断流,然后超过指定的时间30s(EasyGBS平台默认值),就会主动去清除流媒体服务,但是redis中的流数据还在,而当设备在录像的时候,自动保活会去从redis中去保活流数据,所以就会出现设备状态显示是在播放的状态,但是流已经消失的情况。
为了解决这个断流问题,我们决定在设备进行播放保活的时候对流信息进行判断,添加一个最后的处理流时间,如果超过指定时间就自动重新拉流。代码示例如下:
if stream != nil {
latestGetFrameTime := stream.LatestGetFrameTime
if latestGetFrameTime != "" {
lastStreamTime, err := time.ParseInLocation("2006-01-02 15:04:05", latestGetFrameTime, time.Local)
if err != nil {
log.Printf("stop stream [%s] lastStreamTime %s err [%s]", streamid, latestGetFrameTime, err.Error())
StreamStop(streamid)
stream = nil
}
d := time.Since(lastStreamTime)
if int(d.Seconds()) >= 60 {
log.Printf("stop stream [%s] lastStreamTime %s", streamid, latestGetFrameTime)
StreamStop(streamid)
stream = nil
}
}
}
修改过后录像播放都正常了
在直播间录像录制机制说明一文中,我们详细说明了EasyDSS视频平台录像机制,其实在EasyGBS内的机制也是一样的,如果大家对EasyGBS有兴趣或者有需求,欢迎联系我们。
上一篇: 标题中的引号分享到微信不识别问题解决
下一篇: keepalived原理和安装