生成ICE候选人

时间:2013-12-01 17:41:18

标签: webrtc

我正在使用WebRTC API在两台运行在Chrome浏览器上的PC之间进行视频通话。我的观察是ICE候选人只有在我连接到互联网时生成,否则不会产生冰候选者。为什么会那样?

连接块

var pc_config = {"iceServers":[]};

      pc = new webkitRTCPeerConnection(pc_config);
       pc.onicecandidate=function (evt) {

       if(evt.candidate){
         console.log("Sending candidate to other peer"+evt);
        jWebSocketClient.broadcastText("",evt);
        }
      };  

谢谢, Sureshkumar Menon

3 个答案:

答案 0 :(得分:6)

据我了解,ICE候选人有四种类型:

  1. 主持人候选人:来自您的本地界面。
  2. 服务器自反候选者:由STUN服务器提供,将您的本地地址翻译成公共网络。
  3. 中继候选:由TURN服务器提供,数据将由服务器中继
  4. Peer reflexive candidate:一种罕见的情况(?),在连接检查期间发现候选人。我将跳过这一部分,因为它非常罕见,我不太清楚它的大局。
  5. 如果您没有为您的程序提供任何STUN / TURN地址或者它们无法访问,则唯一可以检索的候选地点是主机地址。请注意,您的本地地址(127.0.0.1)不被视为潜在候选人。 希望它有所帮助。

    但是,我并不完全确定您的用例。两台计算机是否在同一本地网络上?如果您的界面已启动,则应至少获得候选主机。我只使用C ++ API,但我不明白为什么它会与Javascript有不同的行为。

答案 1 :(得分:0)

如果我没弄错,ICE候选人是通过联系STUN服务器创建的,因此您需要互联网连接。这样做是为了将私人地址转换为公共地址,以使您的客户能够连接(并连接)到其他客户端。

答案 2 :(得分:-2)

是的,您必须在PC共享SDP之前连接到互联网。这是因为ICE服务器不在您的本地计算机上,而是在Internet上。 ICE服务器在此行中的WEB RTC中连接:

if (browser === 'firefox') { PeerConnConfig = { iceServers: [{ url: "stun:23.21.150.121" // FF doesn't support resolving DNS in iceServers yet } ] }; mediaConstraints = { mandatory: { OfferToReceiveAudio: true, OfferToReceiveVideo: true, MozDontOfferDataChannel: true // Tell FF not to put datachannel info in SDP or chrome will crash } }; // FF doesn't expose this yet MediaStream.prototype.getVideoTracks = function () { return []; }; MediaStream.prototype.getAudioTracks = function () { return []; }; } else { PeerConnConfig = { iceServers: [{ url: "stun:stun.l.google.com:19302" } ] }; mediaConstraints = { mandatory: { OfferToReceiveAudio: true, OfferToReceiveVideo: true }, optional: [{ DtlsSrtpKeyAgreement: true } ] }; // API compat for older versions of chrome if (!MediaStream.prototype.getVideoTracks) { MediaStream.prototype.getVideoTracks = function () { return this.videoTracks; }; MediaStream.prototype.getAudioTracks = function () { return this.audioTracks; }; } if (!PeerConnection.prototype.getLocalStreams) { PeerConnection.prototype.getLocalStreams = function () { return this.localStreams; }; PeerConnection.prototype.getRemoteStreams = function () { return this.remoteStreams; }; } }

我从WEBRTC_SHIM上面删了代码。请特别考虑将ICE服务器定义为:url:“stun:stun.l.google.com:19302”。