zoukankan      html  css  js  c++  java
  • 视频综合管理平台EasyNVS通道列表如何获得RTMP地址和RTSP地址?

    视频综合管理平台EasyNVS是新一代的云上架构,能够将分布在不同区域和网络环境下的多套EasyNVR设备,统一接口进行登记和管理,借助云端的宽带资源解决单路设备在云直播中多路分发观看所需的上行宽带问题,及分布式存储在云端的回放问题。

    我们在最初研发EasyNVS的时候,通道列表是没有rtmp和rtsp的穿透地址的,如下图:

    因为有些用户的现场需求,所以我们将EasyNVR设备的rtsp和rtmp的地址内部穿透,在EasyNVS的通道列表中显示出来。

    我们采用的实现方式需要NVR和NVS的互相交互,具体代码如下,大家可以作为参考看下:

    EasyNVR的代码

    //请求获得可以穿透的端口
    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的代码

    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,
    })
    
    

    更新后的列表如下,可以看到地址已经显示,能够给用户带来一定的便捷:

  • 相关阅读:
    激活函数(ReLU, Swish, Maxout)
    损失函数
    md5sum命令行使用注意事项
    Jetson ARM SeetaFace编译
    Linux下的wine生活(QQ/微信/Office)
    人脸识别引擎SeetaFace编译 ubuntu
    Python为8bit深度图像应用color map
    MySQL、MongoDB、Redis数据库Docker镜像制作
    bash的管道符与重定向
    Docker 及 nvidia-docker 使用
  • 原文地址:https://www.cnblogs.com/EasyNVR/p/13444351.html
Copyright © 2011-2022 走看看