zoukankan      html  css  js  c++  java
  • TSINGSEE青犀视频WebRTC播放Turn服务支持TCP连接功能

    在 EasyDSS、EasyNVR、EasyCVR、EasyGBS 等视频平台中支持 WebRTC 播放功能,其中有个流程需要到 stun/trun 服务器中进行网络打洞操作。

    该服务代码中,原始仅支持 UDP 的连接,在部分情况下,防火墙开启后,会将 UDP 包拦截导致无法连接,因此修改代码支持 TCP 连接的功能。

    原始 UDP 连接的代码如下:

    udpListener, err := net.ListenPacket("udp", "0.0.0.0:"+strconv.Itoa(config.UdpPort))
    if err != nil {
       gErrorLog.Panic("Failed to create TURN server udp listener: %s", zap.Error(err))
       os.Exit(0)
    }
    server.udpListener = udpListener
    
    turnServer, err := turn.NewServer(turn.ServerConfig{
       Realm:       config.Realm,
       AuthHandler: server.HandleAuthenticate,
       PacketConnConfigs: []turn.PacketConnConfig{
          {
             PacketConn: udpListener,
             RelayAddressGenerator: &turn.RelayAddressGeneratorStatic{
                RelayAddress: net.ParseIP(config.PublicIP),
                Address:      "0.0.0.0",
             },
          },
       },
    })
    
    

    在该代码上添加对应的 TCP 监听连接代码如下:

    udpListener, err := net.ListenPacket("udp", "0.0.0.0:"+strconv.Itoa(config.UdpPort))
    if err != nil {
       gErrorLog.Panic("Failed to create TURN server udp listener: %s", zap.Error(err))
       os.Exit(0)
    }
    server.udpListener = udpListener
    
    tcpListener, err := net.Listen("tcp", "0.0.0.0:"+strconv.Itoa(config.TcpPort))
    if err != nil {
       gErrorLog.Panic("Failed to create TURN server tcp listener: %s", zap.Error(err))
       os.Exit(0)
    }
    server.tcpListener = tcpListener
    
    turnServer, err := turn.NewServer(turn.ServerConfig{
       Realm:       config.Realm,
       AuthHandler: server.HandleAuthenticate,
       PacketConnConfigs: []turn.PacketConnConfig{
          {
             PacketConn: udpListener,
             RelayAddressGenerator: &turn.RelayAddressGeneratorStatic{
                RelayAddress: net.ParseIP(config.PublicIP),
                Address:      "0.0.0.0",
             },
          },
       },
       ListenerConfigs: []turn.ListenerConfig{
          {
             Listener: tcpListener,
             RelayAddressGenerator: &turn.RelayAddressGeneratorStatic{
                RelayAddress: net.ParseIP(config.PublicIP),
                Address:      "0.0.0.0",
             },
          },
       },
    })
    

    使用 netListener() 监听对应的 TCP 端口,再将对应的 TCP 连接加入到 ListenerConfigs 中。在对应的产品配置文件中修改配置使用 TCP 连接。

    可正常播放。

  • 相关阅读:
    二分多重匹配(HDU5093)
    2-sat(and,or,xor)poj3678
    某个点到其他点的曼哈顿距离之和最小(HDU4311)
    第k最短路A*启发式搜索
    求树的直径和中心(ZOJ3820)
    并查集hdu4424
    map容器结构体离散化
    二维坐标系极角排序的应用(POJ1696)
    【进阶3-3期】深度广度解析 call 和 apply 原理、使用场景及实现(转)
    判断js数据类型的四种方法,以及各自的优缺点(转)
  • 原文地址:https://www.cnblogs.com/TSINGSEE/p/15657190.html
Copyright © 2011-2022 走看看