【问题标题】:webRTC- not getting stream and ice candidates from other peerwebRTC-没有从其他对等方获取流和冰候选者
【发布时间】:2018-11-13 02:27:11
【问题描述】:

我正在使用 webRTC 和 socket.io 开发视频通话应用程序。我看过其他类似的项目,并正在尝试实施我自己的项目。

第一个对等点创建报价,另一个对等点获取报价并将其保存到其远程描述符并创建由第一个对等点接收的答案。但是冰候选没有交换,也是流。 这是客户端代码:

var socket = io();
var peerConn,
  onlineUsers = [],
  username,
  caller;

function createOffer(callee) {
  peerConn = new RTCPeerConnection();
  peerConn.onicecandidate = onIce;
  peerConn.onaddstream = onAddStream;
  navigator.mediaDevices
    .getUserMedia({ audio: true, video: { height: 240, width: 320 } })
    .then(stream => (window.myVideo.srcObject = stream))
    .then(stream => peerConn.addStream(stream));
  peerConn.createOffer().then(offer => {
    peerConn.setLocalDescription(offer);
    socket.emit("call", callee, peerConn.localDescription);
  });
  caller = callee;
}

socket.on("call", (callee, caller, sdp) => {
  if (callee == username) createAnswer(sdp, caller);
});
function createAnswer(sdp, caller) {
  peerConn = new RTCPeerConnection();
  peerConn.onicecandidate = onIce;
  peerConn.onaddstream = onAddStream;
  window.caller = caller;
  navigator.mediaDevices
    .getUserMedia({ audio: true, video: { height: 240, width: 320 } })
    .then(stream => (window.myVideo.srcObject = stream))
    .then(stream => peerConn.addStream(stream));
  peerConn.setRemoteDescription(new RTCSessionDescription(sdp));
  peerConn.createAnswer().then(answer => {
    peerConn.setLocalDescription(answer);
    socket.emit("answer", caller, peerConn.localDescription);
  });
  console.log(peerConn.localDescription);
  console.log(peerConn.remoteDescription);
}

function onIce(event) {
  if (event.candidate) {
    socket.emit("ice", caller, event.candidate);
    console.log("sent ice");
  } else {
    console.log("Sent all ice");
  }
}

function onAddStream(event) {
  console.log("remote stream added");
  frndsVideo.srcObject = event.stream;
}

socket.on("answer", (callee, caller, sdp) => {
  if (caller == username) setRemoteDes(sdp);
});
function setRemoteDes(sdp) {
  peerConn.setRemoteDescription(sdp);
  console.log(peerConn.localDescription);
  console.log(peerConn.remoteDescription);
}

function addIce(caller, callee, ice) {
  peerConn.addIceCandidate(new RTCIceCandidate(ice));
  console.log("ice added");
}

socket.on("ice", addIce);

以及服务端js代码:

socket.on("call", (callee, sdp) => {
    console.log(`${socket.username} calling ${callee}  ${sdp}`);
    onlineUsers.forEach((user, i) => {
      if (user.username == callee || user.username == socket.username) {
        onlineUsers[i].inCall = true;
      }
    });
    socket.broadcast.emit(`call`, callee, socket.username, sdp);
  });
  socket.on("answer", (caller, sdp) => {
    console.log(`${socket.username} answered ${caller}  ${sdp}`);
    socket.broadcast.emit("answer", socket.username, caller, sdp);
  });
  socket.on("ice", (caller, ice) => {
    socket.broadcast.emit("ice", socket.username, caller, ice);
    console.log("ice recived and sent");
  });

请帮帮我。

【问题讨论】:

    标签: javascript node.js socket.io webrtc


    【解决方案1】:

    在 Firefox 中运行它,你会看到这个错误:

    InvalidStateError: Cannot create offer when there are no valid transceivers.
    

    您在addStream 之前调用createOffer,这会产生一个空的报价并且没有候选人。

    setLocalDescription 完成之前,您还在使用peerConn.localDescription

    这些是异步方法,需要按顺序运行,而不是并行运行。尝试链接它们:

    function createOffer(callee) {
      peerConn = new RTCPeerConnection();
      peerConn.onicecandidate = onIce;
      peerConn.onaddstream = onAddStream;
      navigator.mediaDevices
        .getUserMedia({audio: true, video: {height: 240, width: 320}})
        .then(stream => {
          peerConn.addStream(myVideo.srcObject = stream);
          return peerConn.createOffer();
        })
        .then(offer => peerConn.setLocalDescription(offer))
        .then(() => socket.emit("call", callee, peerConn.localDescription))
        .catch(e => console.log(e));
      caller = callee;
    }
    

    此外,在接听电话方面,切勿延迟致电setRemoteDescription,否则您可能会错过候选人。正如我在another answer 中解释的那样,这是时间敏感的。

    function createAnswer(sdp, caller) {
      peerConn = new RTCPeerConnection();
      peerConn.onicecandidate = onIce;
      peerConn.onaddstream = onAddStream;
      window.caller = caller;
      peerConn.setRemoteDescription(sdp)
      .then(() => navigator.mediaDevices
        .getUserMedia({audio: true, video: {height: 240, width: 320}}))
      .then(stream => {
        peerConn.addStream(myVideo.srcObject = stream);
        return peerConn.createAnswer();
      })
      .then(answer => peerConn.setLocalDescription(answer))
      .then(() => socket.emit("answer", caller, peerConn.localDescription))
      .catch(e => console.log(e));
    }
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-13
    • 2016-11-06
    • 1970-01-01
    • 1970-01-01
    • 2014-06-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多