Javascript 添加多个视频&x2B;简单对等网络中的音频流

Javascript 添加多个视频&x2B;简单对等网络中的音频流,javascript,webrtc,simple-peer,Javascript,Webrtc,Simple Peer,我正在尝试构建一个webRTC视频聊天应用程序,该应用程序还可以选择将本地视频文件加载到浏览器,然后将其流式传输给对等方。 这是一个网状拓扑中的群组视频聊天,因此对于聊天室中的n用户,每个人都有一个大小为n-1的对等方阵列 到目前为止,我已经通过getUserMedia访问的网络摄像头和麦克风流,成功地建立了对等方之间的所有连接。现在我正在尝试添加本地视频文件。我的当前代码等待将视频文件添加到浏览器中,然后使用captureStream捕获流,然后迭代所有对等方的数组,并使用addStream将

我正在尝试构建一个webRTC视频聊天应用程序,该应用程序还可以选择将本地视频文件加载到浏览器,然后将其流式传输给对等方。 这是一个网状拓扑中的群组视频聊天,因此对于聊天室中的
n
用户,每个人都有一个大小为
n-1
的对等方阵列

到目前为止,我已经通过
getUserMedia
访问的网络摄像头和麦克风流,成功地建立了对等方之间的所有连接。现在我正在尝试添加本地视频文件。我的当前代码等待将视频文件添加到浏览器中,然后使用
captureStream
捕获流,然后迭代所有对等方的数组,并使用
addStream
将新流添加到每个连接。但是,我不确定如何在接收端处理新添加的流,因为('stream')事件不会触发

这就是我的客户端代码现在的样子

const socket=io.connect(“/”);
让我的同伴=[];
const videoGrid=document.getElementById(“视频网格”);
const myVideo=document.createElement(“视频”);
myVideo.muted=true;
navigator.mediaDevices
.getUserMedia({
视频:没错,
音频:是的,
})
。然后((流)=>{
添加视频流(myVideo,stream);
干流;
});
功能(主流){
//加入时,告诉服务器和房间中的所有用户
插座。发射(“连接房间”,房间标识);
//当收到已在房间中的所有用户的信息时
socket.on(“所有用户”,(用户)=>{
//初始化新数组以进行渲染
常量对等点=[];
users.forEach((userId)=>{
const peer=createPeer(userId、socket.id、stream);
//推入当前用户的对等阵列
push({peerId:userId,peer});
peer.push(peer);
});
});
socket.on(“用户已加入”,(有效负载)=>{
const item=myPeers.find((p)=>p.peerId==payload.callerId);
如果(!项){
const peer=addPeer(payload.signal、payload.callerId、stream);
我的朋友,推({
皮里德:有效载荷,卡莱里德,
同龄人
});
}
});
socket.on(“接收到的返回信号”,(有效负载)=>{
const item=myPeers.find((p)=>p.peerId==payload.id);
项目.对等信号(有效载荷.信号);
});
函数addPeer(输入信号、被调用方、流){
const peer=新的SimplePeer({
发起者:错,,
涓流:错,
溪流:[溪流],
});
//信号事件将在当前用户获取和提供时触发
对等点开启(“信号”),(信号)=>{
//让打电话的人知道我们的信号
emit(“返回信号”{signal,callerId});
});
peer.on(“流”,(流)=>{
const video=document.createElement(“视频”);
添加视频流(视频,流);
});
//发回信号-接受报价
对等信号(输入信号);
返回同伴;
}
函数createPeer(userToSignal、myId、stream){
const peer=新的SimplePeer({
发起者:对,,
涓流:错,
溪流:[溪流],
});
//信号事件将立即触发,因为当前用户是启动器
对等点开启(“信号”),(信号)=>{
emit(“发送信号”{userToSignal,callerId:myId,signal});
});
peer.on(“流”,(流)=>{
const video=document.createElement(“视频”);
添加视频流(视频,流);
});
返回同伴;
}
}
函数addVideoStream(视频,流){
if(视频中的“srcObject”){
video.srcObject=流;
}否则{
video.src=window.URL.createObjectURL(流);
}
附加(视频);
video.play();
}
//每当新视频添加到网站时,都要将其添加到每个对等方的流中。这还不起作用,需要修复。
让localVideoInput=document.querySelector(“视频输入”);
localVideoInput.addEventListener(“添加的视频”,()=>{
localVideo=document.querySelector(“本地视频”);
stream=localVideo.captureStream();
myPeers.forEach((peer)=>{
peer[“peer”].addStream(stream);
});
插座。发射(“添加视频”,房间标识);
});
socket.on(“添加的视频”,()=>{
myPeers.forEach((peer)=>{
对等方[“对等方”]。在(“流”,()=>{
日志(“接收到的流”);
});
});
});
有没有关于如何在接收端检索新流和旧流的建议? 谢谢大家!