我正在使用socket.io并在node.js上提供服务。
这是客户端的代码:
getUserMedia(constraints, handlemedia, error);
function handlemedia(stream) {
localStream = stream;
attachMediaStream(localVideo, stream);
socket = io.connect();
document.getElementById("connect").addEventListener("click", function(e){
remoteVideo = document.getElementById("remoteVideo");
console.log("We know what socket is.", socket);
servers = {"iceServers": [{ "url": "stun:stun.l.google.com:19302"}]};
pc = new RTCPeerConnection(servers);
pc.onicecandidate = console.log("GOT CANDIDATE");
pc.addStream(localStream);
pc.onaddstream = function(event)
{
attachMediaStream(remoteVideo, event.stream);
}
function error()
{
console.log("An error occurred in the create offer section. ");
}
sdpconstraints = {'mandatory': {
'OfferToReceiveVideo':true }};
pc.createOffer(function(sessiondesc)
{
console.log("Socket attemp 2: ", socket);
pc.setLocalDescription(sessiondesc);
console.log("Offer: ", sessiondesc);
console.log("local description was set. Don't worry.");
socket.emit("sessiondesc", sessiondesc);
}, error, sdpconstraints);
socket.on("sessiondesc", function(sessiondesc)
{
console.log("WE GOT THE FUNCTION ");
sdpconstraints = {'mandatory': {
'OfferToReceiveVideo':true }};
console.log("Your partner created an offer for you.");
pc.createAnswer(function(sessiondesc)
{
console.log("Socket attemp at create answer section: ", socket);
pc.setLocalDescription(sessiondesc);
console.log("Session description: ", sessiondesc);
console.log("Local desc for create answer section was set.");
socket.emit("sessiondesc", sessiondesc);
}, console.log("Error in create answer section occurred."), sdpconstraints);
});
}
}
这是使用node.js和socket.io的服务器代码:
var io = require('socket.io').listen(app);
io.sockets.on('connection', function(socket, webkitRTCPeerConnection, client, id){
socket.on("sessiondesc", function(sessiondesc)
{
console.log("Emitting session desc RIGHT NOW");
socket.broadcast.emit("sessiondesc", sessiondesc);
});
});
因此,我在浏览器中打开两个选项卡,在两个选项卡上都转到本地主机,并确保打开控制台以查看日志。
然后我单击第一个选项卡上的“连接”。它显示日志到“本地描述集,不用担心”,但它不显示“我们得到了功能”的东西,这是有道理的,因为我还没有在其他选项卡上连接。
所以我转到另一个选项卡,然后单击“连接”。现在,在第二个选项卡上,它仅显示本地描述集的内容,不用担心。显然,第二个选项卡没有从第一个选项卡接收任何内容!为什么?
但是当我返回第一个选项卡时,它确实收到了一些东西!它经历了我的代码的“我们得到了函数”部分。然后它确实说“你的合作伙伴为你创建了一个报价” 但问题是,接下来它说的是“创建答案部分出错”,所以创建答案中有一个错误!为什么是这样?为什么会调用这个错误呢?
它也不会在任何选项卡上显示任何远程视频。
最佳答案
我已经能够识别出您的代码的几个问题...
- 仅在用户单击连接按钮后,您才从套接字处理
sessiondesc
,因此当 tab1 发出该 session 时,tab2 不会捕获它。 - 其次,当tab2发送offer并且tab1尝试添加它时,它的peerConnection已经创建了offer,因此无法创建answer(这部分是我的假设,PeerConnection只能创建offer或创建answer。)
关于javascript - Webrtc 和 socket.io : createanswer() always has an error. 为什么?我的代码连接了两个对等点,但只有其中一个知道这一点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29243759/