网络摄像头IPC网页无插件直播国标gb28181协议视频平台EasyGBS开启云端录像后断流如何解决?

TSINGSEE青犀视频研发团队研发的国标GB28181协议视频平台有三种录像方式,分别是云端录像、实时录像和设备录像,三种录像方式有不同的功能(云端录像存储及计划保存介绍)。

EasyGBS架构2.5D.png

在EasyGBS运行的时候我们发现了一个问题,设备接入到EasyGBS上,刚开始能正常播放,随后开启云端录像,就出现流断流的现象,这其中我们并没有进行停止播放的操作。

进过抓包分析,排查出是程序向设备发送了停止推流的请求。

95.png

但是此时设备的状态确实在播放的状态,所以我们仍然需要继续排查。

96.png

在排查代码之后我们发现,在设备网络不好的时候设备会断流,然后超过指定的时间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
			}
		}
	}

修改过后录像播放都正常了

97.png

扫描二维码关注公众号,回复: 11904588 查看本文章

直播间录像录制机制说明一文中,我们详细说明了EasyDSS视频平台录像机制,其实在EasyGBS内的机制也是一样的,如果大家对EasyGBS有兴趣或者有需求,欢迎联系我们。

猜你喜欢

转载自blog.csdn.net/EasyGBS/article/details/108843514