Пересылка MediaStreams с WebRT C не работает в определенных сценариях - PullRequest
0 голосов
/ 22 апреля 2020

Я пытаюсь создать систему вещания (потоковая передача от одного до многих) с использованием WebRT C. Механизм, который я использую, представляет собой древовидную структуру, в которой узел root отправляет поток своим дочерним узлам, а каждый дочерний узел отправляет данные своим детям и т. Д. c.

Я столкнулся с двумя проблемами один с телефоном android, а другой с устройством iOS.

1) Самый простой воспроизводимый пример:

Root -> Android -> Node

Проблема как следует. Когда телефон Android принимает поток от root, у него нет проблем с его воспроизведением, но когда он пересылает поток, принимающий узел не может видеть видео, он может только слышать звук.

2) Простейший воспроизводимый пример выглядит следующим образом:

Root -> iOS -> NodeA -> NodeB

Проблема заключается в следующем (это странная проблема). Когда устройство iOS получает поток от root, оно не испытывает проблем с его воспроизведением, равно как и NodeA, но когда NodeB принимает поток от NodeA, оно не может видеть видео, оно может только слышать аудио.

В обоих случаях проверка объекта MediaStream показывает, что он содержит как звуковую дорожку, так и видеодорожку.

Моя первоначальная мысль: возникла некоторая проблема с реализацией библиотеки, которую я используя peerJS, но после некоторых исследований я обнаружил, что та же проблема возникает в Muaz Khan - Scalable Broadcast . Теперь, возможно, причина, по которой эта проблема также возникает в предоставленной ссылке, заключается в том, что, подобно peerJS, они являются довольно старыми библиотеками, но это не кажется мне очень вероятным. Я более склонен думать, что с MediaStream есть какая-то странность, что видео MediaStreamTrack умирает.

Причина, по которой я больше склонен верить, заключается в том, что решение, которое я придумал, которое работает, но резко снижает качество потока, заключается в воссоздании видеодорожки MediaStream. Я могу переслать поток еще раз. Я воссоздаю поток следующим образом:

1) В сценарии Android я рисую видео на холст на телефоне Android, а затем с помощью canvas.captureStream получаем объект MediaStream Я добавляю звуковую дорожку из удаленного объекта MediaStream к этому новому и пересылаю новый объект MediaStream.

2) В сценарии iOS это то же решение, что и Android телефон, но я рисую на холсте на NodeA (то есть на узле, который подключен к устройству iOS

Есть мысли?

...