我无法理解的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服务器为好,但没有任何反应。 所以,我认为有可能出错了我的理解:)
该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服务器,等待任何响应或请求超时的过程)之前收集的。