Я просто создаю приложение для потоковой передачи видео peerjs в NodeJs и ReactJs
Приведенный ниже код работает нормально, я могу создать новый одноранговый узел, и событие open
также работает.
const peer = new Peer(undefined,{
host:"/",
port:"5001"
});
peer.on('open',id=>{
socket.emit('join-room', roomId,id);
})
На стороне сервера всякий раз, когда генерируется событие 'join-room'
, сервер генерирует другое событие 'user-disconnected'
и передает userId (peerjs)
клиенту.
// server.js
socket.on('join-room',(roomId,userId)=>{
console.info(`user ${userId} joined ${roomId}`);
socket.join(roomId);
socket.to(roomId).emit('user-connected',userId);
socket.on('disconnect', () => {
socket.to(roomId).emit('user-disconnected', userId)
})
})
Всякий раз, когда 'user-connected'
запускается на стороне клиента, я звоню connectToNewUser
, и до этого все работает нормально.
socket.on('user-connected',userId=>{
console.info("New user connected...")
connectToNewUser(userId, stream)
});
Это регистрируется на консоли console.info('connectToNewUser',1222.....)
, ошибки нет.
Но этот call.on('stream')
никогда не называют
connectToNewUser(userId, stream) {
console.info('connectToNewUser',userId)
const call = peer.call(userId, stream);
const video = getVideo();
call.on('stream', userVideoStream => {
// never called
console.info('connectToNewUser','on','stream')
addVideoStream(video, userVideoStream)
});
call.on('close', () => {
video.remove()
})
peers[userId] = call
}
Причина того, что call.on('stream')
никогда не вызывается, заключается в том, что peer.on('call')
никогда не вызывается.
peer.on('call', call => {
// never called
console.info('This peer is being called...');
call.answer(stream)
const video = getVideo();
call.on('stream', userVideoStream => {
console.info('This peer is being called...on-stream...');
addVideoStream(video, userVideoStream)
})
});
Ваш код похож на проект, над которым я работаю. У меня возникли проблемы с тем, где я запускал экземпляр peer
. Мне пришлось переместить его на один уровень вверх в моем дереве компонентов, потому что что-то, что я делал, вызывало повторный рендеринг, и экземпляр peer
создавался заново с новым id
.
Также проверьте, где вы создаете свою розетку. Убедитесь, что ваше событие user-connected
регистрируется в useEffect()
.
useEffect(() => {
videoSocket = initiateVideoSocket(roomId, username, peer.id);
// When a viewer connects, this event is emitted and the streamer will connect to the viewer.
videoSocket.on("user-connected", (roomId, viewerPeerId) => {
connectToNewViewer(viewerPeerId, videoStream);
});
}, [videoStream]);
const viewerVideoSocket = initiateVideoSocket(
room,
props.username,
viewerPeerId
);
const viewerChatSocket = initiateChatSocket(room, props.username);
let streamerVideoDiv;
useEffect(() => {
viewerVideoSocket.emit(
"user-connected",
room,
props.username,
viewerPeerId
);
viewerPeer.on("call", (call) => {
call.answer();
call.on("stream", (stream) => {
streamerVideoDiv = document.getElementById("streamer-video");
const content = document.createElement("video");
content.srcObject = stream;
content.addEventListener("loadedmetadata", () => {
content.play();
});
streamerVideoDiv.append(content);
});
});
return () => {
disconnectSocket();
};
}, []);
Верно. Итак, ваш сокет генерирует событие join-room
, и функция вызывается. Можете ли вы подключить console.info()
к вашему экземпляру peer
, чтобы убедиться, что он работает правильно?
да, сокет генерирует событие join-room
Кроме того, в функции connectToNewUser()
это успешно регистрируется console.info('connectToNewUser',userId)
, но я думаю, что этот оператор не работает const call = peer.call(userId, stream)
Если есть время, можно пройти репо github.com/ats1999/conference
Я потратил много времени, но до сих пор не могу решить эту проблему.
Я вытащил ваш код и позже смогу изучить его более подробно. Но с первого взгляда две вещи. Сначала, когда я создаю комнату, а затем нажимаю «Присоединиться к комнате», я попадаю на страницу комнаты, но никакие данные недоступны при загрузке компонента. Ссылка на созданный экземпляр VideoApp
отсутствует до тех пор, пока я не обновлю страницу. Во-вторых, при создании экземпляра VideoApp
не устанавливается Peer ID. Я не знаю, потому что вы передаете undefined
при его создании. Я смогу поискать больше позже, если вы еще не догадались.
until after I refresh the page
, правда, прежде чем исправлю это я бы хотел исправить подключение peerjs
it's because you're passing in undefined
причина, по которой я передаю undefined, заключается в том, что я хочу сгенерировать уникальный идентификатор пользователя сервером peerjs
.
peerjs server->>
Я установил peerjs
глобально, затем запустил сервер
install-> npm i -g peerjs
run -> peerjs --port 5001
Спасибо за ваше драгоценное время.
Если вы хотите, чтобы сервер PeerJS генерировал идентификаторы, вы не передаете undefined. Вы можете просто создать одноранговый объект, например let my_peer = new Peer()
. Если вам нужно запустить его на вашем собственном сервере, вам необходимо сгенерировать свой собственный идентификатор для каждого однорангового соединения. github.com/peers/peerjs-server
Я проверю, сработает это или нет.
peer.on('open',id=>{ socket.emit('join-room', roomId,id); })
работает нормально, это означает, что одноранговый узел может установить соединение с сервером.