gpt4 book ai didi

javascript - 为什么 "onicecandidate"不起作用?

转载 作者:可可西里 更新时间:2023-11-01 01:23:13 26 4
gpt4 key购买 nike

我无法理解 webRTC 及其 PeerConnection 和“onicecandidate”事件。

据我了解,您必须使用 STUN(或 TURN)服务器启动对等连接,因为它会将您发回 ICE 候选人以与另一个对等方通信。

我见过一些示例,其中省略了 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”事件会触发,但它不起作用。我也尝试了其他公共(public) STUN 服务器,但没有任何反应。所以我认为我的理解可能有问题:)

最佳答案

在您调用 setLocalDescription() 之前,PeerConnection 不会开始收集候选人;提供给 setLocalDescription 的信息告诉 PeerConnection 需要收集多少候选人。 (setLocalDescription 的这种行为在 https://datatracker.ietf.org/doc/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 当前不会生成“trickle candidates”。这意味着它会将其候选地址作为“c”行包含在提议/答案中,并且永远不会调用 onicecandidate 回调。

这种方法的缺点是 Firefox 必须等待它的所有候选人都被收集起来才能创建它的报价/答案(这个过程可能涉及联系 STUN 和 TURN 服务器并等待响应或请求超时) .

关于javascript - 为什么 "onicecandidate"不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15484729/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com