javascript - RTCPeerConnection connectionState 从不从 "new"移动到 "checking"/"connected"

标签 javascript google-chrome webrtc

我从某人那里接管了一个 WebRTC 项目,尽管我开始思考这些概念,但我仍然被一个特定问题所困扰:让 WebRTC 连接从new 正在检查/已完成等...

这是 chrome://webrtc-internals 的输出范围:

enter image description here

我们的代码调用connect():

connect(mediaStream, interviewUid, applicantUid) {
    return new Promise((resolve, reject) => {
      this.connectRtcPeerConnection()
        .then(() => {
          this.connectionState = Socket.CONNECTION_STATES.connected;
          this.rtcPeer.addStream(mediaStream);
          return this.rtcPeer.createOffer({ offerToReceiveAudio: 1, offerToReceiveVideo: 1 });
        }).then((offer) => {
          console.log('offer created', offer);
          return this.rtcPeer.setLocalDescription(offer);
        }).then(() => {
          const message = {
            id: SENDABLE_MESSAGES.connect,
            sdpOffer: this.rtcPeer.localDescription,
            interviewUid,
            applicantUid,
          };
          this.sendMessageToServer(message);
          resolve();
        })
        .catch((error) => {
          console.error(error);
          reject();
        });
    });
  }

依次调用 connectRtcPeerConnection():

connectRtcPeerConnection(

) {
    return new Promise((resolve, reject) => {
      if (this.rtcPeer) {
        resolve();
      }
      console.log('started connecting');

      const rtcPeerOptions = {
        iceServers: [TRUNCATED],
      };

      console.log('rtcPeerOptions', rtcPeerOptions);
      this.rtcPeer = new RTCPeerConnection(rtcPeerOptions);
      console.log('rtcPeer object: ', this.rtcPeer);
      this.rtcPeer.onerror = reject;
      this.rtcPeer.onicecandidate = (candidate) => { this.handleIceCandidateEvent(candidate); };
      this.rtcPeer.oniceconnectionstatechange = () => {
        this.handleIceConnectionStateChangeEvent();
      };
      this.rtcPeer.onaddstream = () => { console.log('handleAddStreamEvent'); };
      this.rtcPeer.onremovestream = () => { console.log('handleRemoveStreamEvent'); };
      this.rtcPeer.onicegatheringstatechange = () => { console.log('handleIceGatheringStateChangeEvent'); };
      this.rtcPeer.onsignalingstatechange = () => { console.log('handleSignalingStateChangeEvent'); };
      this.rtcPeer.onnegotiationneeded = () => { console.log('handleNegotiationNeededEvent'); };
      resolve();
    });
  }

这段代码永远不会被执行:

this.rtcPeer.oniceconnectionstatechange = () => {
  this.handleIceConnectionStateChangeEvent();
};

我已经跟踪了每条条件和代码路径,但目前看不出可能是什么问题。有没有人遇到过这种情况,并且能够阐明一些潜在的事情来观察/考虑?

谢谢!

最佳答案

当我为 iOS 实现 Kurento 库时,尝试过这样的事情:

Generated SDPOffer

Set LocalDescription at our end

WebRTC started generating IceCandidate

Sent Ice Candidate through WebSocket

At this point, other party sent SDPAnswer.

Processed SDPAnswer at our end.

Set RemoteDescription at our end.

Server started sending IceCandidate gathered at their end.

Added these IceCandidate in array at our end.

Here received change in connection state to "Checking"

Received RemoteStream at this point.

Here received change in connection state to "Connected"

希望对您有所帮助!

关于javascript - RTCPeerConnection connectionState 从不从 "new"移动到 "checking"/"connected",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51067900/

相关文章:

javascript - jQuery 自定义菜单 - 添加和删除类 onClick

javascript - 在让客户将 javascript 添加到网页之前,我应该采取哪些预防措施?

javascript - 在我的网站上禁用 chrome/safari 上的自动建议/自动完成

javascript - OSX 10.11 - 如何使用标志 --use-fake-device-for-media-stream 打开 chrome?

javascript - 使用指针事件单击重叠的 div 并隐藏 div

javascript - bgStretcher 无法在 FireFox 或 Chrome 中工作

ajax - 如何在谷歌浏览器中调试失败的ajax请求?

html - 不能使用 webrtc.io 包;浏览器上的 JavaScript 错误

javascript - WebRTC - 如何使本地音频输出静音

javascript - 异步工作的生成器函数