zoukankan      html  css  js  c++  java
  • RTSP/GB28181/Ehome协议安防视频云平台EasyCVR级联至国标平台EasyGBS视频自动停播问题排查过程

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

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

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

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

    1. 将EasyCVR级联到EasyGBS中,并分配通道
    2. 在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的用途比其他视频平台更加广泛,如果大家有需求,欢迎联系我们了解详情。

  • 相关阅读:
    三道趣味题目
    iOS开发中使用静态库 .a 文件
    java Graphics2D 画图
    堆和栈的区别
    iOS开发中KVC、KVO简介
    GPUImage的简单使用
    OC中 self.view.frame.size.height = 100; 不能通过编译的原因
    Xcode7 低版本iOS系统上下有黑边的问题
    c语言数组赋值
    ELF interpreter /libexec/ld-elf32.so.1 not found
  • 原文地址:https://www.cnblogs.com/TSINGSEE/p/13840982.html
Copyright © 2011-2022 走看看