使用多个 USB 网络摄像头进行视频聊天

Video chat with multiple usb webcamera

我正在尝试使用 webrtc 进行网络视频聊天。
我检查了 webrtc,这对这个解决方案来说已经足够了。
但是,就我而言,一台计算机上有三个摄像头(网络摄像头、USB 摄像头)。

                  camera1
 camera1    <->   camera2
                  camera3

所以,我尝试将多个流添加到一个 RTCPeerConnection。
但是,webrtc 不支持这个。

我需要为此创建 3 个 RTCPeerConnection。 如果我创建3个peer,那好像是视频聊天室。

还有其他解决方案吗?


pc = new RTCPeerConnection(null);
pc.addStream(localStream1); 
pc.addStream(localStream2); 
pc.addStream(localStream3);` 

这可能吗?

是的,WebRTC 确实 支持这一点,正如您展示的那样。

Except addStream 已被弃用,因此您想改用 addTrack。或者使用 polyfill:

pc.addStream = stream => stream.getTracks().forEach(t => pc.addTrack(t, stream));

添加的顺序决定了 track 事件在另一端触发的顺序:

pc.ontrack = ({streams: [stream]}) => {
  for (const video of [remoteElement1, remoteElement2, remoteElement3]) {
    if (video.srcObject && video.srcObject.id != stream.id) continue;
    video.srcObject = stream;
    break;
  }
}

以上代码会将三个传入流依次分配给三个视频元素进行播放。 track 事件针对每个轨道触发,因此我们检查 stream.id 以防流具有多个轨道。

或者,我们可以通过数据通道发送 stream.ids 并以这种方式关联,因为 stream.ids 在远程是相同的。但是请注意,track.ids 并不稳定。第三种方法是使用 transceiver.mid 进行关联,它始终稳定,除了最初是 null