为什么不“onicecandidate”的工作?(why doesn't “onicecan

2019-07-21 22:01发布

我无法理解的WebRTC与它的PeerConnection这和“onicecandidate”事件。

据我了解它,你必须开始使用STUN一个PeerConnection等(或TURN)服务器,因为它会您发回你的冰候选人与另一对等通信。

我见过的例子离开PeerConnection等的服务器参数对象了,我不明白为好,但我们只能说这确实需要服务器的参数。

所以,当我写下如下代码:

    var pc, ice = { "iceServers": [{ "url": "stun:stun.l.google.com:19302" }] };
if(typeof mozRTCPeerConnection === 'function') {

    pc = new mozRTCPeerConnection(ice);
}
else {
    console.log('google');
    pc = new webkitRTCPeerConnection(ice);
}


pc.onicecandidate  = function(event) { 
    console.log(event);
}

我想到的是,“onicecandidate”事件会火,但它不工作。 我试过其他公共STUN服务器为好,但没有任何反应。 所以,我认为有可能出错了我的理解:)

Answer 1:

该PeerConnection这将无法启动,直到调用setLocalDescription()收集候选人; 提供给setLocalDescription的信息告诉PeerConnection等很多考生需要如何收集的。 (此行为对于setLocalDescription在其定义在指示http://tools.ietf.org/html/draft-ietf-rtcweb-jsep-03#section-4.2.4 )

这里有一个完整的流程是什么样子在同一个浏览器窗口中确立2个PeerConnections之间的连接(添加省略专注于信号MediaStreams的):

var pc1, pc2, offer, answer;

pc1 = new webkitRTCPeerConnection(options);
pc2 = new webkitRTCPeerConnection(options);

pc1.onicecandidate = function(candidate) {
  pc2.addIceCandidate(candidate);
};

pc2.onicecandidate = function(candidate) {
  pc1.addIceCandidate(candidate);
};

pc1.createOffer(onOfferCreated, onError);

function onError(err) {
  window.alert(err.message);
}

function onOfferCreated(description) {
  offer = description;
  pc1.setLocalDescription(offer, onPc1LocalDescriptionSet, onError);
}

function onPc1LocalDescriptionSet() {
  // after this function returns, pc1 will start firing icecandidate events
  pc2.setRemoteDescription(offer, onPc2RemoteDescriptionSet, onError);
}

function onPc2RemoteDescriptionSet() {
  pc2.createAnswer(onAnswerCreated, onError);
}

function onAnswerCreated(description) {
  answer = description;
  pc2.setLocalDescription(answer, onPc2LocalDescriptionSet, onError);
}

function onPc2LocalDescriptionSet() {
  // after this function returns, you'll start getting icecandidate events on pc2
  pc1.setRemoteDescription(answer, onPc1RemoteDescriptionSet, onError);
}

function onPc1RemoteDescriptionSet() {
  window.alert('Yay, we finished signaling offers and answers');
}

既然你在你的问题包括了mozPeerConnection,我会注意到,Firefox不会产生目前“涓流候选人。 这意味着它将包括其候选地址作为要约/应答“C”线和onicecandidate回调将不会被调用。

这样做的缺点的方法是,火狐必须等待所有候选人创造其要约/应答(这可能涉及接触STUN和TURN服务器,等待任何响应或请求超时的过程)之前收集的。



文章来源: why doesn't “onicecandidate” work?