RTSP/GB28181/Ehome协议安防视频云平台EasyCVR级联至国标平台EasyGBS视频自动停播问题排查过程

TSINGSEE青犀视频研发团队开发的新平台EasyCVR与以往的视频服务平台有所不同。以往的平台大多只能支持单一协议摄像头的接入,比如EasyNVR只支持RTSP协议,EasyGBS只支持国标GB28181协议,所以当一个项目场景中有多种不同协议的摄像头时,部署就会稍显复杂。

EasyCVR的开发正是为了解决这一问题,EasyCVR可以是个协议融合平台,能够同时接入RTSP协议及GB28181协议的设备,并且已经开发集成了海康SDK、Ehome协议等私有协议,目前其他的协议也在拓展当中,有兴趣的用户可以看一下我们的Ehome协议开发过程(Ehome协议调用流程介绍)。

EasyCVR架构图 2.5D.png

最近研发人员发现EasyCVR通道向上级平台级联后,开启按需播放,上级平台播放一段时间后会停止播放,这一问题在我们开发其他平台及联的时候都有遇到过,是个比较普遍的问题。

我们首先来复现一下问题:

  1. 将EasyCVR级联到EasyGBS中,并分配通道
  2. 在EasyGBS中播放级联上来的通道播放一段时间就会停止,过一会又开始播放。使用VLC播放,过一会就会自动停止。如果在EasyCVR中非按需,则能在GBS中持续播放

224.png

从现象中分析是下级平台EasyCVR按需播放,GB28181协议级联invite消息,需要下级平台一直推流,如果下级平台设置成按需的话,按需时间到会断流停止推流。

所以通过分析我们知道,要想平台不断流,下级平台就需要定时保活。我们可以按照以下代码保活视频流:

		//流保活
		ticker := time.NewTicker(15 * time.Second)
		go func() {
			defer func() {
				if err := recover(); err != nil {
					err_logger.Error(fmt.Sprintf("%s\n", err))
					err_logger.Error(fmt.Sprintln(string(debug.Stack())))
				}
			}()
			for {
				select {
				case <-ticker.C:
					stream.TouchStream(streamObj.ChannelID, "main")

					//_, err := uas.Server.TouchStream(stream.StreamID)
					//if err != nil {
					//	c.Client.dispatcher.Dispatch(fmt.Sprintf("Bye@%s", c.SipMsg.Req.User), stream.StreamID)
					//	return
					//}
					//log.Println("级联流保活", stream.StreamID)
				}
			}
		}()
		ch := make(chan bool)
		l := events.NewListener(fmt.Sprintf("Bye@%s", c.SipMsg.Req.User), func(i ...interface{}) bool {
			ticker.Stop()
			ch <- true
			log.Println("级联流被中断")
			return true
		})
		c.Client.dispatcher.AddListener(l)
		defer c.Client.dispatcher.RemoveListener(l)
		for {
			select {
			case <-ch:
				return
			}
		}

225.jpg

本文EasyCVR级联国标平台视频无法播放的原因分析到底就是一个保活的问题,实际上,EasyCVR的用途比其他视频平台更加广泛,如果大家有需求,欢迎联系我们了解详情。

猜你喜欢

转载自blog.csdn.net/TsingSee/article/details/109121087
今日推荐