zoukankan      html  css  js  c++  java
  • 网络穿透/组网服务/视频协议转换系统EasyNTS上云网关时如何实现视频拉转推的?

    早在去年,我们就将EasyNTS的网络穿透功能和原本EasyRTMPLive的视频拉转推功能进行了融合,统称为EasyNTS上云网关。因此EasyRTMPLive仍有软件版本,但是在通道数量不高的情况下,我们仍建议大家选择更轻便的EasyNTS上云网关。

    此前介绍了视频拉转推的操作方法,但是一直没有和大家分享我们的实现思路,所以本文我们就和大家分享一下。

    EasyNTS上云网关是通过调用拉流库然后调用推流库来实现的该功能,重点是需要加载推拉流库。对于加载推拉流库有两种方式,第一种是加载dll文件实现,第二种是编译.a文件的静态库,实现golang调用c的接口然后接收c端的回调之后进行逻辑操作。

    先拉取源地址的流,初始化拉流库,然后将得到的流推送到对应的rtmp地址,参考代码如下:

    srcURL := channelInfo.SrcURL
    // escape + to %2B
    srcURL = strings.Replace(srcURL, "+", "%2B", -1)
    client := stream.NewStreamClient(fmt.Sprintf("%s - 拉流", channelInfo.Name), srcURL, uint(channelInfo.ID), uint(channelInfo.ConnectTimeOut))
    switch channelInfo.ConnectType {
    case "tcp":
       client.TransType = stream.TransTypeTCP
    case "udp":
       client.TransType = stream.TransTypeUDP
    }
    client.AudioEnable = channelInfo.MediaType == "video|audio"
    _channelInfo := *channelInfo
    channelStream = &ChannelStream{
       Channel:     uint(channelInfo.ID),
       Name:        channelInfo.Name,
       Online:      0,
       ErrorString: "",
       channelInfo: &_channelInfo,
       client:      client,
       quit:        make(chan bool, 1),
    }
    channelStream.InitPushers(channelInfo)
    var exist bool
    channelsLock.Lock()
    if _, exist = channelSteams[channelStream.Channel]; !exist {
       channelSteams[channelStream.Channel] = channelStream
    } else {
       log.Printf("%v is already exist", channelStream)
    }
    channelsLock.Unlock()
    if exist {
       return
    }
    channelStream.delayTimer = time.AfterFunc(delay, channelStream.Start)
    return
    

    EasyNTS作为网络穿透服务以及视频流拉转推产品,目前支持市面上大部分的RTSP/Onvif协议设备:IP Camera/NVR/DVR/编码器等,用MQTT加密协议,具有运算速度快,安全性高,资源损耗低的优势,且基于动态组网服务创建智能网络,按需选择需要组网的网络成员实现点点互联。

  • 相关阅读:
    闭包
    正则的理解
    正则
    Date对象
    math对象
    js异步
    dom事件
    事件对象-2
    事件对象
    函数作用域
  • 原文地址:https://www.cnblogs.com/TSINGSEE/p/14633676.html
Copyright © 2011-2022 走看看