ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

国标GB28181协议EasyGBS视频平台如何调阅EasyNVR的直播视频?

2021-04-25 14:57:23  阅读:206  来源: 互联网

标签:视频 级联 EasyGBS GB28181 EasyNVR 直播 avFrame codec


很多用户反应EasyGBS的级联功能十分便捷,EasyGBS除了能够级联海康这样的视频平台,也能够级联用户自己的第三方平台,此外也可以与我们其他的视频平台,比如EasyNVR进行级联。EasyNVR级联注册到EasyGBS上之后,通过EasyGBS已经可以看到EasyNVR的通道信息,也就能通过EasyGBS进行观看EasyNVR通道的直播。

EasyNVR方案二.png

EasyNVR直播原理是通过EasyNVR的拉流库对EasyNVR通道配置的RTSP地址进行拉流,然后通过EasyNVR推流库进行推流,推到nginx里面,然后通过地址就可以观看直播。

EasyGBS直播原理(级联)是先通过GB28181协议发送给级联客户端,然后进行udp或tcp通道传输RTP包,存到nginx里面,然后通过地址就可以观看直播。

EasyGBS是如何实现调阅EasyNVR的视频流的?由于两者的直播原理不同,我们就想到在EasyNVR拉流库获取裸流然后通过推流库推到nginx的地方添加一个逻辑,如果EasyNVR有级联到EasyGBS上面,就多推一份视频流到EasyGBS上。

if client.CascadeSink != nil {
   //log.Printf("----------------------------codec:%d", int(frameInfo.codec))
   client.CascadeSink.SendRTMP(avFrame, int(frameInfo.codec))
}

此处的frameInfo.codec是判断视频格式是H.264还是H.265的。

func (obj *SinkUDP) SendRTMP(avFrame *C.EASY_AV_Frame, codec int) (err error) {
   defer func() {
      if err := recover(); err != nil {
         fmt.Sprintf("%s\n", err)
         fmt.Sprintln(string(debug.Stack()))
      }
   }()
   //avFrame := (*C.EASY_AV_Frame)(unsafe.Pointer(data))
   if avFrame.u32AVFrameFlag == C.EASY_SDK_VIDEO_FRAME_FLAG {
      resbuf := make([]byte, int(avFrame.u32AVFrameLen))
      copy(resbuf, (*[1 << 32]byte)(unsafe.Pointer(avFrame.pBuffer))[:int(avFrame.u32AVFrameLen)])
      if avFrame.u32VFrameType == C.EASY_SDK_VIDEO_FRAME_I {
         out, _ := ps.ConvertEs2Rtp(resbuf, 0, codec, true, &obj.rtpInfo)
         for _, v := range out {
            _, err := obj.DataConn.Write(v.Payload)
            if err != nil {
               //log.Println(err.Error())
            }
         }
      } else {
         out, _ := ps.ConvertEs2Rtp(resbuf, 0, codec, false, &obj.rtpInfo)
         for _, v := range out {
            _, err := obj.DataConn.Write(v.Payload)
            if err != nil {
               //log.Println(err.Error())
            }
         }
      }
   } else {
      resbuf := (*[1 << 32]byte)(unsafe.Pointer(avFrame.pBuffer))[:int(avFrame.u32AVFrameLen)]
      out, _ := ps.ConvertEs2Rtp(resbuf, 1, codec, false, &obj.rtpInfo)
      for _, v := range out {
         _, err := obj.DataConn.Write(v.Payload)
         if err != nil {
            //log.Println(err.Error())
         }
      }
   }
   return
}

将拉流库获取到的裸流进行一层RTP封包,然后就通过udp或tcp传输到EasyGBS的nginx里面,之后EasyGBS就可以观看EasyNVR的通道直播了。

1429.png

1430.png

关于EasyGBS的级联,有兴趣的朋友可以阅读下EasyGBS级联接入下级宇视平台以及海康平台上进行级联配置步骤。如有疑问,欢迎和我们一起探讨。此外,视频相关解决方案均可访问TSINGSEE青犀视频,可以联系我们获取演示方案,直观感受,也可自行进行下载及测试。

标签:视频,级联,EasyGBS,GB28181,EasyNVR,直播,avFrame,codec
来源: https://blog.51cto.com/u_15179958/2731547

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有