【问题标题】:WebRTC - how to set always to use TURN server?WebRTC - 如何设置始终使用 TURN 服务器?
【发布时间】:2014-03-02 16:36:56
【问题描述】:

在标准规范中说您可以将 ENUM 值设置为“中继”:http://dev.w3.org/2011/webrtc/editor/webrtc.html#idl-def-RTCIceServer

但是,如何使用以下 Javascript 将枚举设置为“中继”? if (tmp.indexOf("typ relay ") >= 0) { 在我的测试中从未出现过。我怎样才能强制它枚举“中继”?

这是一个BUG吗? https://code.google.com/p/webrtc/issues/detail?id=1179

任何想法。

function createPeerConnection() {
  try {
    // Create an RTCPeerConnection via the polyfill (adapter.js).
    pc = new RTCPeerConnection(pcConfig, pcConstraints);
    pc.onicecandidate = onIceCandidate;
    console.log('Created RTCPeerConnnection with:\n' +
                '  config: \'' + JSON.stringify(pcConfig) + '\';\n' +
                '  constraints: \'' + JSON.stringify(pcConstraints) + '\'.');
  } catch (e) {
    console.log('Failed to create PeerConnection, exception: ' + e.message);
    alert('Cannot create RTCPeerConnection object; \
          WebRTC is not supported by this browser.');
      return;
  }
  pc.onaddstream = onRemoteStreamAdded;
  pc.onremovestream = onRemoteStreamRemoved;
  pc.onsignalingstatechange = onSignalingStateChanged;
  pc.oniceconnectionstatechange = onIceConnectionStateChanged;
}

function onIceCandidate(event) {
  if (event.candidate) {
    var tmp = event.candidate.candidate;
    if (tmp.indexOf("typ relay ") >= 0) {
      /////////////////////////////////////////// NEVER happens
      sendMessage({type: 'candidate',
                   label: event.candidate.sdpMLineIndex,
                   id: event.candidate.sdpMid,        
                   candidate: tmp}); 
      noteIceCandidate("Local", iceCandidateType(tmp));   

    }    
  } else {
    console.log('End of candidates.');
  }
}

【问题讨论】:

    标签: javascript google-chrome enums webrtc rfc5766turnserver


    【解决方案1】:

    这对我有用:

    iceServers = [
         { "url": "turn:111.111.111.111:1234?transport=tcp",
           "username": "xxxx",
           "credential": "xxxxx"
         }
       ]
    
    optionsForWebRtc = {
        remoteVideo : localVideoElement,
        mediaConstraints : videoParams,
        onicecandidate : onLocalIceCandidate,
        configuration: {
            iceServers: iceServers,
            iceTransportPolicy: 'relay'
        }
    }
    

    【讨论】:

    • 请分享我的完整代码。实际上,我已经在 aws 中部署了自己的转向服务器,但不知道如何与之连接。
    【解决方案2】:

    有一个 Chrome 扩展程序 WebRTC Network Limiter,它通过更改 Chrome 的隐私设置来配置 WebRTC 的网络流量的路由方式。您可以强制流量通过 TURN,而无需进行任何 SDP 修改。


    编辑 1

    在扩展程序中提供此功能的目的是为担心其安全性的用户提供。你可以查看this关于 WebRTC 安全性的优秀帖子。与此扩展相同,也可以在 FF 中通过更改标志 media.peerconnection.ice.relay_only 来完成。这可以在about:config 中找到。不知道其他两个,但我敢打赌他们确实有类似的东西。

    另一方面,如果您正在分发应用程序并希望所有客户都通过 TURN,您将无法访问他们的浏览器,也不能指望他们更改这些标志或安装任何扩展程序。在这种情况下,您将不得不破坏您的 SDP。您可以使用此代码

    function onIceCandidate(event) {
      if (event.candidate) {
        var type = event.candidate.candidate.split(" ")[7];
        if (type != "relay") {
          trace("ICE  -  Created " + type + " candidate ignored: TURN only mode.");
          return;
        } else {
          sendCandidateMessage(candidate);
          trace("ICE  - Sending " + type + " candidate.");
        }
      } else {
        trace("ICE  - End of candidate generation.");
      }
    }
    

    该代码取自 discuss-webrtc 列表。

    如果您从未获得这些候选人,很可能是您的 TURN 服务器配置不正确。您可以在this 页面查看您的 TURN 服务器。不要忘记删除该演示中配置的现有 STUN 服务器。


    编辑 2

    更简单:在您的 WebRtcPeer 配置中设置 iceTransportPolicy: "relay" 以强制 TURN:

    var options = {
        localVideo: videoInput, //if you want to see what you are sharing
        onicecandidate: onIceCandidate,
        mediaConstraints: constraints,
        sendSource: 'screen',
        iceTransportPolicy: 'relay',
        iceServers: [{ urls: 'turn:XX.XX.XX.XX', username:'user', credential:'pass' }]
    }
    
    webRtcPeerScreencast = kurentoUtils.WebRtcPeer.WebRtcPeerSendrecv(options, function(error) {
        if (error) return onError(error) //use whatever you use for handling errors
    
        this.generateOffer(onOffer)
    });
    

    【讨论】:

    • 我可以在 OPERA、FIREFOX 和 NODE-WebKit 中使用这个扩展吗?如果不是,那么将生活限制在仅适用于 Google 的扩展程序上又有什么意义呢?
    • @YumYumYum 恐怕这个扩展只适用于 Chrome。 FF 有另一种方法,所以我扩展了答案。那里还包括更多信息。
    • @YumYumYum 添加了另一种方法
    【解决方案3】:

    要强制使用 TURN 服务器,您需要拦截浏览器找到的候选者。就像你正在做的那样。

    但如果它从未在您的测试中出现,您的 TURN 服务器可能会出现一些问题。 如果你有一个工作的 TURN 服务器,你会得到typ relay 的候选人。

    请记住,您需要为 TURN 服务器配置身份验证。这是强制性的,如果请求通过身份验证,浏览器只会使用候选“中继”。 PeerConnection 的 iceServers 配置必须具有为 TURN 服务器定义的凭据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-21
      • 2014-12-08
      • 2017-06-19
      • 1970-01-01
      • 2021-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多