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

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

  • 相关阅读:
    智能聊天机器人——基于RASA搭建
    十分钟学会写shell脚本
    浅谈并发并行异步同步
    C/S系统实现两数求和(非阻塞+epoll+心跳包检测用户在线状况+滚动日志+配置文件.)
    编程之美第一篇 01分数规划
    欧拉函数
    奇妙的算法之LCS妙解
    N种方法妙讲LIS算法
    基于FeignClient提供简单的用户查询服务
    SpringCloud简介
  • 原文地址:https://www.cnblogs.com/EasyNVR/p/13444351.html
Copyright © 2011-2022 走看看