#node.js #sockets #peerjs
Вопрос:
Я создаю приложение для видеочата с помощью сокета.io и peerjs, но я застрял в этой проблеме, из-за которой я не могу подключить поток(видео) клиента к комнате. Я могу видеть только свой видеопоток. Я в основном сослался на видео умного программиста на YouTube(Zoom-клон). Так что любой, кто прошел через проблему или знает решение, ответьте, пожалуйста.
> server.js
var express = require('express');
var app = express();
const httpServer = require("http").Server(app);
var cors = require('cors')
const io = require("socket.io")(httpServer);
const { ExpressPeerServer } = require('peer');
const { v4: uuidV4 } = require('uuid')
const peerServer = ExpressPeerServer(httpServer, {
debug: true,
});
app.use(cors({
origin:'http://localhost:3000',
methods:["GET","POST"]
}))
app.set('view engine', 'ejs')
app.use(express.static('public'))
app.use('/peerjs', peerServer);
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).emit('user-connected',userId);
})
})
httpServer.listen(process.env.PORT || 3000);
> script.js
const socket = io('/')
const videoGrid = document.getElementById('video-grid')
const myPeer = new Peer(undefined, {
path: '/peerjs',
host: '/',
port: '443'
})
let myVideoStream;
const myVideo = document.createElement('video')
myVideo.muted = true;
navigator.mediaDevices.getUserMedia({
video: true,
audio: true
}).then(stream => {
myVideoStream = stream;
addVideoStream(myVideo, stream)
myPeer.on('call', call => {
call.answer(stream)
// console.log(stream)
const video = document.createElement('video')
call.on('stream', userVideoStream => {
addVideoStream(video, userVideoStream)
})
})
socket.on('user-connected', userId => {
connectToNewUser(userId, stream)
})
})
myPeer.on('open', id => {
socket.emit('join-room', ROOM_ID, id)
})
function connectToNewUser(userId, stream) {
const call = myPeer.call(userId, stream)
const video = document.createElement('video')
call.on('stream', userVideoStream => {
addVideoStream(video, userVideoStream)
})
}
function addVideoStream(video, stream) {
video.srcObject = stream
video.addEventListener('loadedmetadata', () => {
video.play()
})
videoGrid.append(video)
console.log(videoGrid)
}
> room.ejs
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Zoom</title>
<script>
const ROOM_ID = "<%= roomId %>"
</script>
<script src="https://unpkg.com/peerjs@1.3.1/dist/peerjs.min.js"></script>
<script src="/socket.io/socket.io.js" ></script>
<link rel="stylesheet" href="style.css">
<script src="https://kit.fontawesome.com/c939d0e917.js"></script>
<style>
#video-grid{
display: flex;
justify-content: center;
flex-wrap: wrap;
}
video{
height: 300px;
width: 400px;
object-fit: cover;
padding: 8px;
}
</style>
</head>
<body>
<div id="video-grid">
</div>
<script src="script.js" ></script>
</body>
</html>