Используйте поток WebRTC / GetUserMedia в качестве входных данных для FFMPEG - PullRequest
2 голосов
/ 22 января 2020

Я записываю свой экран с помощью gerUserMedia и получаю видео и аудио поток. Затем я использую WebRT C для отправки / получения этого потока на другом устройстве. Можно ли как-то использовать этот входящий поток webrt c в качестве входных данных для ffmpeg, преобразовав его как-нибудь?

Все, с чем я работаю, находится в javascript.

Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 10 февраля 2020

Это довольно распространенное требование в наши дни (2020 г.), поэтому я дам вам свое мнение о проблеме:

Прежде всего, вы наталкиваетесь на прекрасный пример несовместимости dramati c ( кодеки и потоковые протоколы) между двумя разными мультимедийными доменами (WebRT C и ffmpeg). Поэтому для обеспечения их взаимодействия вам понадобится сложная техника и программное обеспечение сторонних производителей.

  1. ffmpeg сам по себе не может поддерживать "WebRT C", поскольку WebRT C не является полностью определенным протоколом. , Механизм сигнализации WebRT C (обменивающийся SDP и ледяными кандидатами) не определен: приложение оставлено для его реализации. На этом самом первом шаге WebRT C приложение должно подключиться к серверу сигнализации по какому-либо протоколу (обычно через websocket или http-запрос). Таким образом, для поддержки WebRT C (RTCPeerConnection) ffmpeg необходимо будет взаимодействовать с каким-либо сторонним сервером сигнализации. Другой альтернативой может быть реализация сервера сигнализации внутри самого ffmpeg, но тогда ffmpeg должен будет прослушивать какой-то порт, и этот порт должен быть открыт в брандмауэрах (это то, что делает сервер сигнализации). Не очень практичная идея для ffmpeg.

  2. Поэтому реальное практическое решение состоит в том, что ffmpeg получает поток от какого-либо стороннего шлюза / сервера WebRT C. Ваша веб-страница публикуется через WebRT C на этот шлюз / сервер, а затем ffmpeg извлекает из него поток.

    a. Если ваша веб-страница WebRT C кодирует видео H264 + аудио Opus, то ваша жизнь относительно легка. Вы можете установить Wowza или Unreal Media Server и опубликовать sh ваш поток через WebRT C на этих серверах. Затем запустите вещание MPEG2-TS этого потока в Wowza / Unreal и получите этот поток MPEG2-TS с помощью ffmpeg. Миссия выполнена, и в поток не было выполнено транскодирование / декодирование, только трансмуксирование (распаковка из контейнера RTP, используемого в WebRT C, и упаковка в контейнер MPEG2-TS), что является очень недорогой вещью для ЦП.

    б. Настоящая «красота» возникает тогда, когда вам нужно использовать кодеки VP8 / VP9 на веб-странице публикации WebRT C. Вы не можете выполнить процедуру, предложенную в предыдущем параграфе, потому что ffmpeg не поддерживает потоковый протокол, который может переносить видео в кодировке VP8 / VP9. Миссия все еще может быть выполнена для ffmpeg в ОС Windows, но очень неловко: используйте два исходных фильтра DirectShow из Unreal: исходный фильтр WebRT C и исходный фильтр Video Mixer. Вы не можете использовать исходный фильтр WebRT C самостоятельно, потому что ffmpeg не может получать сжатое видео от исходных фильтров DirectShow (это большой недостаток в ffmpeg). Итак: Сконфигурируйте исходный фильтр Video Mixer для получения видео из исходного фильтра WebRT C (который, в свою очередь, будет получать ваш опубликованный поток с Unreal Media Server). Фильтр источника видеомикшера распаковывает поток в видео RGB24 и звук PCM. Затем ffmpeg может получить этот контент, используя ffmpeg -f dshow -i video="Unreal Video Mixer Source".

1 голос
/ 25 января 2020

ffmpeg не поддерживает WebRT C (пока), но у вас есть несколько других известных мне опций.

...