如何在创建商品时将候选添加到peerConnection.addIceCandidate()

时间:2015-07-15 11:01:40

标签: node.js webrtc getusermedia peer

我想用nodejs和webrtc进行语音呼叫。当我打电话给其他用户然后收到错误时,ICE失败了,请参阅:webrtc了解更多详情'。 HTML只包含一个调用offer()的按钮。

我可以确认优惠和SessionDescriptions从一个客户端成功传输到另一个客户端。   请帮帮我

 Client Side Javasrcipt: 
    navigator.getUserMedia({video:false, audio:true}, function(stream)                 {
document.getElementById("localvideo").mozSrcObject = stream;
document.getElementById("localvideo").play();
document.getElementById("localvideo").muted = true;

// var pc = new mozRTCPeerConnection();
var pc = new PeerConnection(iceServers, options);
pc.addStream(stream);

pc.onaddstream = function(obj) {
log("Got onaddstream of type " + obj.type);
document.getElementById("remotevideo").mozSrcObject = obj.stream;
document.getElementById("remotevideo").play();
document.getElementById("dialing").style.display = "none";
document.getElementById("hangup").style.display = "block";
};

pc.createOffer(function(offer) {
console.log("Created offer" + JSON.stringify(offer));
pc.setLocalDescription(offer, function() {
// Send offer to remote end.       
pc.iceCandidate = new RTCIceCandidate();      
console.log(pc.iceCandidate);
    peerc = pc;
    jQuery.post(
      "offer", {
        to: user,
        from: document.getElementById("user").innerHTML,
        offer: JSON.stringify(offer)
      },
      function() { console.log("Offer sent!"); }
    ).error(error);
  }, error);
}, error);

});

我的服务器端脚本 -

        app.post("/offer", function(req, res) { 
          var channel = users[req.body.to];
           channel.write("event: offer\n");
          channel.write("data: " + JSON.stringify(req.body));
          channel.write("\n\n");
          res.send(200);
        });

3 个答案:

答案 0 :(得分:1)

我不是这里的情况,要么你没有提供有竞争力的应用程序代码,要么你的应用程序代码正确的webrtc连接不完整,

对于初学者来说,尽管webrtc简化了视频聊天,但只是发送优惠sdp就行不通(我假设你在另一边创建了答案sdp并发送),你将不得不交换ICE候选人也。同伴的候选人有点像他们的电话卡告诉他们如何联系到他们。因此,如果不进行解释,他们就无法进行交流。

enter image description here

通常情况下,浏览器会在onIceCandidate事件中为您提供候选人,这是您发送给您的同行的,这会将其添加为peerConnection.addIceCandidate(candidate),最初是在我开始时this doc帮助我理解了WebRTC的基础知识,你可以尝试一下。

答案 1 :(得分:1)

您需要添加接收端并处理ICE候选者。我看到createOffer但不是createAnswer,ICE失败可能是因为没有发信号通知ICE候选人(这种做法叫做Trickle ICE,现在是必需的)。

看起来你正在使用Firefox,所以你应该能够运行这个本地循环演示(没有信令),我仍然希望指出关闭循环的缺失部分。我使用视频是因为音频在本地循环中工作非常明显(反馈):

var pc1 = new mozRTCPeerConnection(), pc2 = new mozRTCPeerConnection();

pc1.onicecandidate = e => !e.candidate ||
    pc2.addIceCandidate(e.candidate).catch(failed);
pc2.onicecandidate = e => !e.candidate ||
    pc1.addIceCandidate(e.candidate).catch(failed);
pc2.onaddstream = e => v2.mozSrcObject = e.stream;

function start() {
  navigator.mediaDevices.getUserMedia({ video: true })
  .then(stream => pc1.addStream(v1.mozSrcObject = stream))
  .then(() => pc1.createOffer())
  .then(offer => pc1.setLocalDescription(offer))
  .then(() => pc2.setRemoteDescription(pc1.localDescription))
  .then(() => pc2.createAnswer())
  .then(answer => pc2.setLocalDescription(answer))
  .then(() => pc1.setRemoteDescription(pc2.localDescription))
  .then(() => log("Connected!"))
  .catch(failed);
}

var log = msg => div.innerHTML += "<p>" + msg + "</p>";
var failed = e => log(e +", line "+ e.lineNumber);
<video id="v1" height="120" width="160" autoplay></video>
<video id="v2" height="120" width="160" autoplay></video><br>
<button onclick="start()">Start!</button><div id="div"></div>

答案 2 :(得分:0)

您是否在另一端生成答案并将其发送回第一方进行处理?