Причина, по которой это происходит, заключается в том, что вещатель посылает сигнал, как только он сделан. Таким образом, сигнал будет отправлен от вещателя только один раз, когда зритель подключится позже, он не получит никакого сигнала.
Чтобы решить эту проблему, можно сначала настроить программу просмотра и попросить вещателя создать новое соединение.
В этом проекте github вы можете увидеть пример, где более 2 партнера могут быть подключены одновременно.
Вот реализация:
Broadcaster. js
// this method is the same
componentDidMount() {
navigator.mediaDevices.getUserMedia({
video: true,
audio: true,
})
.then(stream => {
// Display own video
if("srcObject" in this.localVideo.current) {
this.localVideo.current.srcObject = stream;
}
else {
this.localVideo.current.src = window.URL.createObjectURL(stream);
}
// Stream video to attendees
this.gotMedia(stream);
})
.catch(error => {
console.error(error);
});
}
// new way to handle
gotMedia = (stream) => {
this.localStream = stream
this.broadcaster = new Peer({ initiator: true, stream: this.localStream });
this.broadcaster.on("signal", data => {
this.socket.emit("signal", data);
});
// destroy current peerconnection and create a new one
this.socket.on("startConnection", () => {
if(this.broadcaster) this.broadcaster.destroy()
this.broadcaster = new Peer({ initiator: true, stream: this.localStream });
this.broadcaster.on("signal", data => {
this.socket.emit("signal", data);
});
});
this.socket.on("signal", data => {
this.broadcaster.signal(data);
});
};
Просмотр. js
componentDidMount() {
const attendee = new Peer();
attendee.on("signal", data => {
this.socket.emit("signal", data);
});
this.socket.on("signal", data => {
attendee.signal(data);
});
// Get remote video stream and display it
attendee.on("stream", stream => {
if("srcObject" in this.remoteVideo.current) {
this.remoteVideo.current.srcObject = stream;
}
else {
this.remoteVideo.current.src = window.URL.createObjectURL(stream);
}
});
// Ask broadcaster to start his connection
this.socket.emit("startConnection")
}
Сервер
// Handle socket connections
io.on("connection", socket => {
socket.on("startConnection", () => {
socket.broadcast.emit("startConnection")
});
socket.on("signal", (data) => {
socket.broadcast.emit("signal", data);
});
});