使用 Node JS 构建 Zoom 克隆(点对点连接)

问题描述 投票:0回答:5

我尝试使用nodejs创建缩放克隆,我已成功在网页中显示我的视频,并为每个加入链接的人创建了id,但在主页中显示加入的人时不起作用。

我使用peerjs库来调用用户并将其显示在网页中。

服务器.js

const express = require('express');

const app = express();

const server = require('http').Server(app);

const io = require('socket.io')(server);

const {v4:uuidv4} = require('uuid');

const { ExpressPeerServer} = require('peer');

const peerServer = ExpressPeerServer(server, {
    debug:true
});

const { response } = require('express');

app.use('/peerjs',peerServer);

app.set('view engine','ejs');
app.use(express.static('public'))


app.get('/', (req, res) => {
    res.redirect(`/${uuidv4()}`);
})


app.get('/:room',(req, res)=>{
    res.render('room',{ roomId:req.params.room })
})

 io.on('connection', socket => {
    socket.on('join-room' , (roomId,userId) => {
        socket.join(roomId);
        socket.to(roomId).broadcast.emit('user-connected',userId);
     })
})

server.listen(3035);

房间.ejs

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Zoom CLone</title>
    <script src="https://unpkg.com/[email protected]/dist/peerjs.min.js"></script>
    <script src="/socket.io/socket.io.js"></script>
    <script>
        const ROOM_ID = "<%= roomId %>"
    </script>
    <style>
        #video-grid{
            display: flex;
            justify-content: center;

        }
        video{
            height: 300px;
            width: 400px;
            object-fit: cover;
        }
    </style>
</head>
<body>
    <div id="video-grid"></div>
    <script src="script.js"></script>    
</body>
</html>

script.js

const socket = io('/')
const videoGrid = document.getElementById('video-grid');
const myVideo=document.createElement('video');
myVideo.muted = true;

var peer = new Peer(undefined, {
    host:'/',
    port:'3031'
})
// const peer = new Peer(undefined, {
//     path: '/peerjs',
//     host: '/',
//     port: '3001'
//   })

peer.on('open',id => {
    socket.emit('join-room', ROOM_ID, id);
})

let myVideoStream
navigator.mediaDevices.getUserMedia({
    video:true,
    audio:true
}).then(stream => {
    myVideoStream=stream;
    addVideostream(myVideo,stream)

    peer.on('call', call => {
        call.answer(stream)
        const video = document.createElement('video')
        call.on('stream',userVideoStream => {
            addVideoStream(video, userVideoStream)
        })
    })
    socket.on('user-connected',(userId) => {
        connectToNewUser(userId, stream);
    })
})


  
const connectToNewUser = (userId, stream) => {
    const call = peer.call(userId, stream)
    const video = document.createElement('video')
    call.on('stream', userVideoStream => {
        addVideostream(video, userVideoStream)
    })
    call.on('close', () => {
      video.remove()
    })
}

const addVideostream = (video,stream) =>{
    video.srcObject = stream;
    video.addEventListener('loadedmetadata',() => {
        video.play();
    })
    videoGrid.append(video);
}

代码中也没有错误,我也在控制台中检查过。 唯一的问题是与链接视频相关的人没有显示在主页(主持人)上。

node.js webrtc peer peerjs
5个回答
1
投票

我正在从事同一个项目,我认为当用户加入频道时,他/她的视频不会显示在主机屏幕上的原因是因为 script.js 中的 getUserMedia 中存在

audio: true

navigator.mediaDevices.getUserMedia({
    video:true,
    audio:true
})

所以如果你把它改成 false,这个问题就解决了,第二个人的视频也会在那里看到,但另一个问题就会出现,那就是你们将无法通过音频进行交流。我还没有找到解决方案,但如果其他人找到了,请告诉我。


0
投票

您的代码看起来不错,没有错误,但在您的 script.js 中,您需要包含

路径:“/peerjs”

并且端口号应该与正在侦听的服务器相同,因此应该是 3035 而不是 3031,您的代码应该如下所示:

var peer = new Peer(undefined, {
  path: "/peerjs",
  host: "/",
  port: "3035",
}); 

还可以尝试删除 connectToNewUser 函数中的这一行

call.on('close', () => {
      video.remove()
    })

有时会因为网络连接不佳而发生这种情况,因此您需要不断刷新浏览器才能看到实时视频的变化。

希望这有帮助。有关 peerjs 库的更多信息,请查看其官方网站

我创建了类似的项目,其中有相同的代码和额外的功能,您可以参考我的 git 存储库 来比较您的代码。


0
投票

改变 对端端口:“3031” 到 端口:“443” 或者是其他东西 然后当你将它部署到在线服务器时它就会正常工作


0
投票

我可能迟到了,但我遇到了同样的问题 尝试改变

socket.on('user-connected',(userId) => {
    connectToNewUser(userId, stream);
})

})

 socket.on('user-connected', userId => {
    // user is joining`
    setTimeout(() => {
    // user joined
    connectToNewUser(userId, stream)
    }, 1000)
    })
})

这对我有用


0
投票

https://medium.com/nerd-for-tech/full-stack-zoom-clone-943289af8f7d 这篇文章很好地解释了peerjs和你的问题

© www.soinside.com 2019 - 2024. All rights reserved.