问题描述
我正在尝试构建一个webRTC视频聊天应用程序,该应用程序还可以选择将本地视频文件加载到浏览器,然后将其流式传输到同位体。
这是网状拓扑中的小组视频聊天,因此,对于聊天室中的n
个用户,每个用户都有一个大小为n-1
个对等体的数组。
到目前为止,我已经设法使用getUserMedia
访问的网络摄像头和麦克风流在同级之间建立了所有连接。现在,我正在尝试添加本地视频文件。我当前的代码等待将视频文件添加到浏览器,然后使用captureStream
捕获流,然后迭代所有对等点的数组,并使用addStream
将新流添加到每个连接。但是,由于on('stream')
事件不会触发,因此我不确定如何在接收方处理新添加的流。
这是我的客户端代码现在的样子。
const socket = io.connect("/");
let myPeers = [];
const videoGrid = document.getElementById("video-grid");
const myVideo = document.createElement("video");
myVideo.muted = true;
navigator.mediaDevices
.getUserMedia({
video: true,audio: true,})
.then((stream) => {
addVideoStream(myVideo,stream);
main(stream);
});
function main(stream) {
//On join,tell the server and all the users in the room tha
socket.emit("join-room",ROOM_ID);
//When received info on all users already in a room
socket.on("all-users",(users) => {
//initialize new array for rendering purposes
const peers = [];
users.forEach((userId) => {
const peer = createPeer(userId,socket.id,stream);
//Push into the array of current user's peers
myPeers.push({ peerId: userId,peer });
peers.push(peer);
});
});
socket.on("user-joined",(payload) => {
const item = myPeers.find((p) => p.peerId == payload.callerId);
if (!item) {
const peer = addPeer(payload.signal,payload.callerId,stream);
myPeers.push({
peerId: payload.callerId,peer,});
}
});
socket.on("received-returned-signal",(payload) => {
const item = myPeers.find((p) => p.peerId === payload.id);
item.peer.signal(payload.signal);
});
function addPeer(incomingSignal,callerId,stream) {
const peer = new SimplePeer({
initiator: false,trickle: false,streams: [stream],});
//The signal event is going to be fired when current user is getting and offer
peer.on("signal",(signal) => {
//Let the caller know our signal
socket.emit("return-signal",{ signal,callerId });
});
peer.on("stream",(stream) => {
const video = document.createElement("video");
addVideoStream(video,stream);
});
//Signal back - accept the offer
peer.signal(incomingSignal);
return peer;
}
function createPeer(userToSignal,myId,stream) {
const peer = new SimplePeer({
initiator: true,});
//The signal event is going to fire instantly,because current user is initiator
peer.on("signal",(signal) => {
socket.emit("sending-signal",{ userToSignal,callerId: myId,signal });
});
peer.on("stream",stream);
});
return peer;
}
}
function addVideoStream(video,stream) {
if ("srcObject" in video) {
video.srcObject = stream;
} else {
video.src = window.URL.createObjectURL(stream);
}
videoGrid.append(video);
video.play();
}
// Whenever new video is added to the website,add it to each peer's stream. This does not work yet,needs to be fixed.
let localVideoInput = document.querySelector("#video-input");
localVideoInput.addEventListener("added-video",() => {
localVideo = document.querySelector("#local-video");
stream = localVideo.captureStream();
myPeers.forEach((peer) => {
peer["peer"].addStream(stream);
});
socket.emit("added-video",ROOM_ID);
});
socket.on("added-video",() => {
myPeers.forEach((peer) => {
peer["peer"].on("stream",() => {
console.log("received stream");
});
});
});
有人建议我如何在接收方检索新的流以及旧的流吗? 谢谢!
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)