网络穿透/组网服务/视频协议转换系统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加密协议,具有运算速度快,安全性高,资源损耗低的优势,且基于动态组网服务创建智能网络,按需选择需要组网的网络成员实现点点互联。

posted on 2021-04-08 18:04  TSINGSEE  阅读(66)  评论(0编辑  收藏  举报