peer.on('callll') 永远不会被调用

Rah*_*hul 5 node.js webrtc reactjs peerjs

Peer js 不工作

我只是在 NodeJs 和 ReactJs 中创建peerjs 视频流应用程序


下面的代码工作正常,我能够创建新的对等点,并且open事件也正常工作。

const peer = new Peer(undefined,{
            host:"/",
            port:"5001"
        });

peer.on('open',id=>{
  socket.emit('join-room', roomId,id);
})
Run Code Online (Sandbox Code Playgroud)

在服务器端,每当'join-room'发出事件时,服务器都会发出另一个事件'user-disconnected'并传递userId (peerjs)给客户端。

// server.js
socket.on('join-room',(roomId,userId)=>{
    console.log(`user ${userId} joined ${roomId}`);
    socket.join(roomId);
    socket.to(roomId).emit('user-connected',userId);

    socket.on('disconnect', () => {
        socket.to(roomId).emit('user-disconnected', userId)
    })
})
Run Code Online (Sandbox Code Playgroud)

每当 'user-connected'在客户端触发时,我都会打电话connectToNewUser,到目前为止一切正常。

socket.on('user-connected',userId=>{
    console.log("New user connected...")
    connectToNewUser(userId, stream)
});
Run Code Online (Sandbox Code Playgroud)

错误

这是登录控制台console.log('connectToNewUser',1222.....)没有错误。

但是,这call.on('stream')从来没有被称为

connectToNewUser(userId, stream) {
    console.log('connectToNewUser',userId)
    const call = peer.call(userId, stream);
    const video = getVideo();
    call.on('stream', userVideoStream => {
      // never called
      console.log('connectToNewUser','on','stream')
      addVideoStream(video, userVideoStream)
    });
    call.on('close', () => {
      video.remove()
    })

    peers[userId] = call
}
Run Code Online (Sandbox Code Playgroud)

call.on('stream')从未被调用的原因是peer.on('call')从未被调用。

peer.on('call', call => {
    // never called
    console.log('This peer is being called...');
    call.answer(stream)
    const video = getVideo();
    call.on('stream', userVideoStream => {
        console.log('This peer is being called...on-stream...');
        addVideoStream(video, userVideoStream)
    })
});
Run Code Online (Sandbox Code Playgroud)

Github 仓库

Usm*_*san 2

您的代码的唯一问题是,您在客户端上初始化 peer.on("call") 事件之前从服务器发出用户连接的事件,这最终导致新客户端错过该事件。最好的解决方案是在初始化peer.on("call",...) 事件后发出一个ready 事件。

peer.on('call', call => {
console.log('This peer is being called...');
call.answer(stream)
const video = getVideo();
call.on('stream', userVideoStream => {
    console.log('This peer is being called...on-stream...');
    addVideoStream(video, userVideoStream)
})})
socket.emit("ready")`
Run Code Online (Sandbox Code Playgroud)

然后在服务器端调用“ready”事件监听器内的“user-connected”广播事件:

socket.on('join-room',(roomId,userId)=>{
console.log(`user ${userId} joined ${roomId}`);
socket.join(roomId);
socket.on('ready',()=>{
socket.broadcast.to(roomId).emit('user-connected',userId);
})

socket.on('disconnect', () => {
 socket.to(roomId).emit('user-disconnected', userId)
})})
Run Code Online (Sandbox Code Playgroud)

这将在客户端准备好接收 peer.on("call"....) 事件后广播用户连接的事件