我跟随this tutorial,制作一个WebRTC的简单示例。但远程视频不会出现在任何浏览器中,Chrome也不会显示错误:
未捕获(在promise中)DOMException:处理ICE候选
时出错
我做了一个日志而不是setRemoteDescription方法:
peerConn.setRemoteDescription(new RTCSessionDescription(signal.sdp), function(){
alert('success')
}, function(e){ console.log(e); alert(e)});
然后我收到以下错误:
OperationError:无法设置远程商品sdp:调用错误状态: STATE_SENTOFFER
在相关教程中,作者声称他能够做正确的事情并且错误应该在我身边。有没有人经历过这个?
(抱歉我的英文)
编辑:(包含代码)
我仍然是这个主题的门外汉,开头引用的教程链接是我发现最开始玩的最干净。我认为这个来源很重要:
后端 - server.js
/** successful connection */
wss.on('connection', function (client) {
console.log("A new WebSocket client was connected.");
/** incomming message */
client.on('message', function (message) {
/** broadcast message to all clients */
wss.broadcast(message, client);
});
});
// broadcasting the message to all WebSocket clients.
wss.broadcast = function (data, exclude) {
var i = 0, n = this.clients ? this.clients.length : 0, client = null;
if (n < 1) return;
console.log("Broadcasting message to all " + n + " WebSocket clients.");
for (; i < n; i++) {
client = this.clients[i];
// don't send the message to the sender...
if (client === exclude) continue;
if (client.readyState === client.OPEN) client.send(data);
else console.error('Error: the client state is ' + client.readyState);
}
};
前端 - webrtc.js
wsc.onmessage = function (evt) {
var signal = null;
if (!peerConn) answerCall();
signal = JSON.parse(evt.data);
if (signal.sdp) {
console.log("Received SDP from remote peer.");
peerConn.setRemoteDescription(new RTCSessionDescription(signal.sdp),
function(){},
function(e){ console.log(e);
});
}
else if (signal.candidate) {
console.log("Received ICECandidate from remote peer.");
peerConn.addIceCandidate(new RTCIceCandidate(signal.candidate));
} else if ( signal.closeConnection){
console.log("Received 'close call' signal from remote peer.");
endCall();
}
};
答案 0 :(得分:3)
如果没有看到代码,很难回答,但至少有两个问题,从两个错误判断:
未捕获(在promise中)DOMException:处理ICE候选
时出错
这来自peerConn.addIceCandidate(candidate)
并且候选输入存在问题,表明它不正确或以某种方式损坏。您应该从另一方peerConn.onicecandidate
通过您的信号通道发出信号。如果需要更多帮助,请显示代码。
它&#34;未被捕获&#34;因为它会返回一个承诺,并且您错过了.catch
:
peerConn.addIceCandidate(candidate).catch(e => console.log(e));
OperationError:无法设置远程商品sdp:调用错误状态:STATE_SENTOFFER
这表明两个同行都试图同时发送报价,这是对称且错误的。
报价/回答交换本质上是不对称的。一方必须从一个提议开始,另一方接收它,SetRemote,createAnswer,并将答案发送回第一个同行,后者执行setRemote。这个舞蹈是state-machine。任何失误都会得到这样的错误。