TSINGSEE青犀视频研发团队开发的新平台EasyCVR与以往的视频服务平台有所不同。以往的平台大多只能支持单一协议摄像头的接入,比如EasyNVR只支持RTSP协议,EasyGBS只支持国标GB28181协议,所以当一个项目场景中有多种不同协议的摄像头时,部署就会稍显复杂。
EasyCVR的开发正是为了解决这一问题,EasyCVR可以是个协议融合平台,能够同时接入RTSP协议及GB28181协议的设备,并且已经开发集成了海康SDK、Ehome协议等私有协议,目前其他的协议也在拓展当中,有兴趣的用户可以看一下我们的Ehome协议开发过程(Ehome协议调用流程介绍)。
最近研发人员发现EasyCVR通道向上级平台级联后,开启按需播放,上级平台播放一段时间后会停止播放,这一问题在我们开发其他平台及联的时候都有遇到过,是个比较普遍的问题。
我们首先来复现一下问题:
- 将EasyCVR级联到EasyGBS中,并分配通道
- 在EasyGBS中播放级联上来的通道播放一段时间就会停止,过一会又开始播放。使用VLC播放,过一会就会自动停止。如果在EasyCVR中非按需,则能在GBS中持续播放
从现象中分析是下级平台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
}
}
本文EasyCVR级联国标平台视频无法播放的原因分析到底就是一个保活的问题,实际上,EasyCVR的用途比其他视频平台更加广泛,如果大家有需求,欢迎联系我们了解详情。