Видеочат с несколькими USB-камерами

Я пытаюсь использовать веб-видеочат с помощью webrtc.
Я проверил webrtc, и этого достаточно для этого решения.
Но в моем случае есть три камеры (веб-камера, USB-камера) в одном компьютере.

                  camera1
 camera1    <->   camera2
                  camera3

Итак, я попытался добавить несколько потоков к одному RTCPeerConnection.
Но webrtc не поддерживает это.

Для этого мне нужно создать 3 RTCPeerConnection. Если я создам 3 пира, то это будет похоже на комнату для видеочата.

Есть другое решение?


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

Это возможно?


person Tom Woods    schedule 10.05.2019    source источник
comment
WebRTC абсолютно поддерживает несколько потоков. Что ты пробовал?   -  person jib    schedule 11.05.2019
comment
Не могли бы вы поделиться информацией об этом?   -  person Tom Woods    schedule 11.05.2019
comment
Ваш вопрос недостаточно конкретен, чтобы понять, с какой проблемой вы столкнулись, и может быть закрыт. Несколько потоков должны работать. Если вы поделитесь своим кодом, я могу указать на проблему и ее решение.   -  person jib    schedule 11.05.2019
comment
Код, который вы показываете, в порядке. Однако обратите внимание, что одноранговые соединения сегодня основаны на отслеживании, для улучшенного контроля, подобного этому, и pc.addStream устарел, поэтому он не будет работать во всех браузерах. Замените его на for (const track of stream.getTracks()) pc.addTrack(track, stream);. Вам необходимо уточнить свои ожидания в отношении принимающей стороны этой видеотриады, но в целом: прослушайте событие track на другой стороне, чтобы выбрать различные дорожки и связанные с ними потоки и назначить их предварительным элементам видео.   -  person jib    schedule 12.05.2019
comment
Я проверил pc.addTrack(), что функции можно использовать для add video, add audio, мне нужно добавить три видео к одному pc.   -  person Tom Woods    schedule 12.05.2019
comment
Вы можете вызывать pc.addTrack() несколько раз, чтобы добавить столько треков, сколько вам нужно.   -  person jib    schedule 12.05.2019
comment
Спасибо @jib. Это хорошо работает. И я могу добавить несколько видеопотоков в pc. С другой стороны, как я могу получить tracks?   -  person Tom Woods    schedule 13.05.2019
comment
Могу ли я добавить addTrack с camera index/id, чтобы определить, какой медиапоток (дорожка) камеры добавлен?   -  person Tom Woods    schedule 13.05.2019
comment
Нет, но порядок добавления определяет порядок срабатывания track событий на другом конце. Вы также можете связать их с разными потоками, и stream.ids реплицируются удаленно. Не могли бы вы прояснить свой вопрос, чтобы на него можно было ответить?   -  person jib    schedule 13.05.2019
comment
Это мой ответ pc.addTrack() multiple times от @jib. Как я могу отредактировать свой ответ? не могли бы вы отредактировать?   -  person Tom Woods    schedule 13.05.2019


Ответы (1)


Да, WebRTC поддерживает это, именно так, как вы показываете.

За исключением того, что addStream устарел, поэтому вы хотите использовать вместо него addTrack. Или воспользуйтесь полифиллом:

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.id по каналу данных и таким образом скоррелировать, поскольку stream.id идентичны удаленно. Обратите внимание, однако, что track.id таким образом нестабильны. Третий способ - корреляция с использованием transceiver.mid, который всегда стабилен, за исключением того, что изначально он равен null.

person jib    schedule 13.05.2019