很多用户反应EasyGBS的级联功能十分便捷,EasyGBS除了能够级联海康这样的视频平台,也能够级联用户自己的第三方平台,此外也可以与我们其他的视频平台,比如EasyNVR进行级联。EasyNVR级联注册到EasyGBS上之后,通过EasyGBS已经可以看到EasyNVR的通道信息,也就能通过EasyGBS进行观看EasyNVR通道的直播。
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的通道直播了。
关于EasyGBS的级联,有兴趣的朋友可以阅读下EasyGBS级联接入下级宇视平台以及海康平台上进行级联配置步骤。如有疑问,欢迎和我们一起探讨。此外,视频相关解决方案均可访问TSINGSEE青犀视频,可以联系我们获取演示方案,直观感受,也可自行进行下载及测试。