让 WebRTC 工作(如何调试 ICE 失败?)

Getting WebRTC working (how to debug ICE Fail?)

我不知道如何调试 WebRTC。我不断收到 'ICE Failed' 错误,但我怀疑这就是问题所在。这是我的代码:https://github.com/wamoyo/webrtc-cafe/tree/master/2.1%20Establishing%20a%20Connection%20%28within%20a%20Local%20Area%20Network%29

我正在使用 node.js/express/socket.io 来设置房间和连接对等点,然后使用一些默认的 public 服务器来发送信号。

奇怪的是,客户端上似乎有 remoteStream。

这是我遇到的两个错误(顺便说一句,目前,我只是尝试从我的 phone 连接到笔记本电脑或两个浏览器选项卡,都在局域网内):

HTTP "Content-Type" of "text/html" is not supported. Load of media resource http://192.168.1.2:3000/%5Bobject%20MediaStream%5D failed.

ICE failed, see about:webrtc for more details

任何帮助都会很棒!

我已经发表了一些评论,但我认为写一个答案也是值得的。

在我第一次快速阅读您的代码后,我看到了 3 件大事。除了表面阅读之外,我还没有尝试 运行 或调试您的代码。

首先,您应该像设置本地视频流一样设置remoteVideo.src URL参数:

pc.onaddstream = function(media) { // This function runs when the remote stream is added.
    console.log(media);
    remoteVideo.src = window.URL.createObjectURL(media.stream);
}

其次,您应该将约束对象传递给 RTCPeerConnectioncreateOffer()createAnswer() 方法。约束 should/could 如下所示:

var constraints = {
    mandatory: {
        OfferToReceiveAudio: true,
        OfferToReceiveVideo: true
    }
};

然后在成功和错误回调参数之后传递:

pc.createOffer(..., ..., constraints);

和:

pc.createAnswer(..., ..., constraints);

最后,你们没有在同行之间交换 ICE 候选人。 ICE 候选人可以成为 offer/answer SDP 的一部分,但并非总是如此。为确保发送所有这些,您应该在 RTCPeerConnection:

上实现一个 onicecandidate 处理程序
pc.onicecandidate = function (event) {
    if (event.candidate) {
        socket.emit("ice candidate", event.candidate);
    }
}

您必须在 server.js

中的客户端之间实施 "ice candidate" 消息中继

希望对您有所帮助,祝您好运!