早在去年,我们就将EasyNTS的网络穿透功能和原本EasyRTMPLive的视频拉转推功能进行了融合,统称为EasyNTS上云网关。因此EasyRTMPLive仍有软件版本,但是在通道数量不高的情况下,我们仍建议大家选择更轻便的EasyNTS上云网关。
此前介绍了视频拉转推的操作方法,但是一直没有和大家分享我们的实现思路,所以本文我们就和大家分享一下。
EasyNTS上云网关是通过调用拉流库然后调用推流库来实现的该功能,重点是需要加载推拉流库。对于加载推拉流库有两种方式,第一种是加载dll文件实现,第二种是编译.a文件的静态库,实现golang调用c的接口然后接收c端的回调之后进行逻辑操作。
先拉取源地址的流,初始化拉流库,然后将得到的流推送到对应的rtmp地址,参考代码如下:
代码语言:javascript复制srcURL := channelInfo.SrcURL
// escape to +
srcURL = strings.Replace(srcURL, " ", "+", -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加密协议,具有运算速度快,安全性高,资源损耗低的优势,且基于动态组网服务创建智能网络,按需选择需要组网的网络成员实现点点互联。