我在通过PeerConnection和'onicecandidate'事件了解webRTC时遇到了麻烦。
据我了解,您必须使用STUN(或TURN)服务器启动对等连接,因为它会将您的ICE候选人发回给您,以便与其他对等方进行通信。
我已经看到了一些示例,这些示例省略了PeerConnection对象的server参数,我也不太理解,但是我们只说它确实需要server参数。
因此,当我写下以下代码时:
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'事件会触发,但不起作用。我也尝试了其他公共(public)STUN服务器,但没有任何 react 。所以我认为我的理解可能有问题:)
最佳答案
在您调用setLocalDescription()之前,PeerConnection不会开始收集候选人。提供给setLocalDescription的信息告诉PeerConnection需要收集多少候选者。 (setLocalDescription的此行为在http://tools.ietf.org/html/draft-ietf-rtcweb-jsep-03#section-4.2.4的定义中指示)
以下是在同一浏览器窗口中建立两个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当前不生成“tri流候选者”。这意味着它将在候选/答案中包括其候选地址作为“c”行,并且永远不会调用onicecandidate回调。
这种方法的缺点是,Firefox在创建要约/答案之前必须等待所有候选项被收集(该过程可能涉及联系STUN和TURN服务器并等待响应或请求超时)。
关于javascript - “onicecandidate”为什么不起作用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15484729/