网络摄像头IPC网页无插件直播国标gb28181协议视频平台EasyGBS开启云端录像后断流如何解决?
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有兴趣或者有需求,欢迎联系我们。