PeerConnection无法创建答案

Dra*_*orn 5 javascript webrtc

我得到这个错误在我的catch块,当我做myPeerConnection.createAnswer()

PeerConnection不能在具有have-remote-off或have-local-pranswer之外的状态下创建答案。

我正在使用socket.io作为信令服务器。我正在遵循MDN的教程

这是我的代码:

myPeerConnection.setRemoteDescription(desc).then(() => {
    return navigator.mediaDevices.getUserMedia(mediaConstraints);
  }).then((stream) => {
    localStream = stream;
    document.getElementById("localVideo").srcObject = localStream;
    return myPeerConnection.addStream(localStream);
  }).then(() => {
    return myPeerConnection.createAnswer(); //No error when removed this then chain
  }).then((answer) => {
    return myPeerConnection.setLocalDescription(answer); // No error when removed this then chain
  }).then(() => {
    socket.emit('video-answer', {
      sdp: myPeerConnection.localDescription
    });
  }).catch(handleGetUserMediaError);
Run Code Online (Sandbox Code Playgroud)

这里的答案也没有帮助我。

我已将整个项目上传到Github。您可以在此处查看脚本文件。

任何帮助表示赞赏。

jib*_*jib 5

这是我一年半之前提交的Chrome浏览器中的一个长期错误

您将在onclick处理程序和中创建对等连接,并handleVideoOfferMsg完成一个onnegotiationneeded调用的处理程序createOffer。没关系,这完全符合规范示例

handleVideoOfferMsg您继续进行呼叫时setRemoteDescription(desc),使该对等连接进入have-remote-offer状态,然后在其中添加音轨以获取答案。

Chrome中的错误是negotiationneeded,当规范 说只能将negotiationneeded标志设置为"stable"状态时,添加这些轨道会触发事件。

在Firefox中尝试。它应该在那里工作。

您可以在Chrome中解决此问题,如下所示:

pc.onnegotiationneeded = e => {
  if (pc.signalingState != "stable") return;
  ..
}
Run Code Online (Sandbox Code Playgroud)


Phi*_*cke 3

打个比方来说,你试图在没有被问到问题的情况下回答一个问题。这是没有意义的——peerconnection API 准确地告诉了你这一点。