视频综合管理平台EasyNVS是新一代的云上架构,能够将分布在不同区域和网络环境下的多套EasyNVR设备,统一接口进行登记和管理,借助云端的宽带资源解决单路设备在云直播中多路分发观看所需的上行宽带问题,及分布式存储在云端的回放问题。
我们在最初研发EasyNVS的时候,通道列表是没有rtmp和rtsp的穿透地址的,如下图:
因为有些用户的现场需求,所以我们将EasyNVR设备的rtsp和rtmp的地址内部穿透,在EasyNVS的通道列表中显示出来。
我们采用的实现方式需要NVR和NVS的互相交互,具体代码如下,大家可以作为参考看下:
EasyNVR的代码
代码语言:javascript复制//请求获得可以穿透的端口
addr := fmt.Sprintf("http://%s:%d", ip, interfacePort)
ret, err2 := http.PostForm(fmt.Sprintf("%s/api/v1/getIndexTunnel", addr), url.Values{"DeviceId": {uid}})
if err2 != nil {
log.Println("获取信息失败:", err2.Error())
return
}
type Port struct {
RtmpPort int
RtspPort int
}
var rsp Port
body, err1 := ioutil.ReadAll(ret.Body)
if err1 != nil {
log.Println("获取信息失败:", err1.Error())
}
err = json.Unmarshal(body, &rsp)
iniText := ""
localPort := utils.Conf().Section("base_config").Key("port").MustInt(10800)
rtmpHost := utils.Conf().Section("base_config").Key("rtmp_host").MustString("")
rtspHost := utils.Conf().Section("base_config").Key("rtsp_host").MustString("")
var cameras []models.Camera
models.DB.Table("camera").Find(&cameras)
if rtmpHost == "" {
rtmpPort := dss.GetRTMPPort()
rtspPort := dss.GetRTSPPort()
iniText = fmt.Sprintf(iniTemp, ip, port, uid, uname, token, utils.ShortID(), localPort, ip, uid, utils.ShortID(),
"127.0.0.1", rtmpPort, rsp.RtmpPort, utils.ShortID(), "127.0.0.1", rtspPort, rsp.RtspPort)
for _, v := range cameras {
if v.Enable == 1 {
v.RemoteRtmp = fmt.Sprintf("rtmp://%s:%d/hls/stream_%d", ip, rsp.RtmpPort, v.ID)
v.RemoteRtsp = fmt.Sprintf("rtsp://%s:%d/stream_%d", ip, rsp.RtspPort, v.ID)
models.DB.Save(&v)
}
}
}
EasyNVS的代码
代码语言:javascript复制port.rtmpPort, _ = strconv.Atoi(remotePorts[0])
port.rtspPort, _ = strconv.Atoi(remotePorts[1])
if len(newFreePorts) > 0 {
tunnel.PortFreeList = strings.Join(newFreePorts, ",")
} else {
tunnel.PortFreeList = ""
}
db.SQLite.Delete(models.SysTunnel{}, "id = ?", 1)
db.SQLite.Create(&tunnel)
var deviceTunnel models.DeviceTunnel
deviceTunnel.DeviceId = deviceId
deviceTunnel.RemoteRtmpPort, _ = strconv.Atoi(remotePorts[0])
deviceTunnel.RemoteRtspPort, _ = strconv.Atoi(remotePorts[1])
db.SQLite.Where("device_id = ?", deviceId).Create(&deviceTunnel)
c.JSON(http.StatusOK, gin.H{
"RtmpPort": port.rtmpPort,
"RtspPort": port.rtspPort,
})
更新后的列表如下,可以看到地址已经显示,能够给用户带来一定的便捷: