我想用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);
});
答案 0 :(得分:1)
我不是这里的情况,要么你没有提供有竞争力的应用程序代码,要么你的应用程序代码正确的webrtc连接不完整,
对于初学者来说,尽管webrtc简化了视频聊天,但只是发送优惠sdp就行不通(我假设你在另一边创建了答案sdp并发送),你将不得不交换ICE候选人也。同伴的候选人有点像他们的电话卡告诉他们如何联系到他们。因此,如果不进行解释,他们就无法进行交流。
通常情况下,浏览器会在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)
您是否在另一端生成答案并将其发送回第一方进行处理?