Web LiveStreaming WebRTC и сокеты (Flask Backend)

Я хочу создать приложение для прямой трансляции. Мой мыслительный процесс:

  1. Получите данные видео/аудио от navigator.mediaDevices.getUserMedia(constraints); [клиент-стример]
  2. создавать комнаты с помощью сокетов (Socket.IO или WebSockets из фляги) [бэкенд]
  3. Отправьте данные в 1 членам комнаты с помощью сокетов.
  4. отображать медиа на стороне клиента.

Это правильно? Как я должен это делать?

как передавать данные определенным участникам комнаты, а не всем? (flask) Как последовательно отправлять данные со стримера -> сервер -> участники комнаты. поток дан из 1 это объект, где данные?

любые другие лучшие идеи будут великолепны! Спасибо.

  • Мне нужно реализовать серверную часть самостоятельно, без помощи библиотек, которые сделают всю работу за меня.

person Sahar Cohen    schedule 12.03.2021    source источник


Ответы (2)


Объяснение всего этого выходит далеко за рамки ответа переполнения стека.

Вот несколько советов:

  1. Вам необходимо использовать API MediaRecorder для захвата сжатых данных из ваш поток gUM (getUserMedia). Поддержка MediaRecorder несовместима между производителями и моделями браузеров. хотя.

  2. Время от времени он запускает Blob в свой обработчик onndatavailable. Они сжаты как поток данных webm.

  3. Вы можете отправить эти BLOB-объекты на сервер с помощью socket.io, а сервер может развернуться и отправить их любым клиентам, которым вы хотите.

  4. Играть в вебм на клиентах сложно. В браузерах некоторых марок и моделей вы можете передавать поток webm в Media Source API с использованием appendBuffer( ). Но некоторые браузеры не могут использовать потоки webm.

  5. Эти веб-потоки бесполезны для игрока без упорядоченных данных BLOB-объектов. Вы не можете просто начать отправлять новому клиенту BLOB-объекты потока, когда он входит в систему; вам необходимо перезапустить MediaRecorder.

  6. (Возможно, вам удастся заставить его работать без перезапуска MediaRecorder, если вы отправите первые несколько k байтов потока каждому новому клиенту перед отправкой текущего BLOB-объекта. Извлечение этих байтов — сложная задача программирования, включающая пакет ebml для анализа потока webm и извлечения пролога. Я не проверял эту концепцию.)

  7. Поскольку заставить все это работать — создатель — сервер — средство просмотра — такая головная боль в шее ххх, вы можете исследовать, используя что-то вроде mediasoup вместо этого. Он использует транспорт WebRTC, а не socket.io, и работает кроссплатформенно.

person O. Jones    schedule 12.03.2021
comment
Большое спасибо! Я попробую. - person Sahar Cohen; 12.03.2021

Внедрение потоковой платформы не является тривиальной задачей. К сожалению, это не так просто, как передача фрагментов, полученных от MediaRecorder с onndatavailable и пересылкой их пользователям с помощью сервера WebSocket — это не масштабируется, не эффективно и не надежно.

Ниже приведены некоторые стратегии, которые вы можете попробовать для различных типов сценариев:

P2P: если вам нужна простая одноранговая потоковая передача, вы можете использовать WebRTC для достижения этого с помощью простого сервера socket.io для целей сигнализации.

Конференция. Здесь все становится сложнее. Вам понадобится медиа-сервер, если вы хотите быть несколько масштабируемым. Один из подходов – направить поток пользователям с помощью SFU или MCU. Это позаботится об эффективной пересылке/обработке мультимедиа различным одноранговым узлам.

Трансляция: Здесь тоже все нетривиально. Общие архитектуры на основе WebRTC включают прием потока WebRTC и его пересылку на сервер HLS, который позволяет ваши потоковые фрагменты доступны для клиентов через CDN или выполнить RTP перенаправление потока WebRTC, преобразовать его в RTMP с помощью чего-то вроде FFmpeg и доставить это через Youtube Live или Twitch, чтобы использовать их инфраструктуру.

Имейте в виду, что последние 2 элемента требуют больших ресурсов и, безусловно, будут недешевыми в обслуживании.

Ниже приведены некоторые проекты с открытым исходным кодом, которые могут вам помочь:

Удачи!

person lnogueir    schedule 13.03.2021
comment
Спасибо. Я уже пробовал метод Broadcast (RTMP/HLS), и он не работал. Работает ли P2P только с двумя людьми в одном звонке? как видеозвонок? - person Sahar Cohen; 13.03.2021
comment
Да. Вы, вероятно, можете получить до 4 человек в разговоре, не более того. Ознакомьтесь с этим примером приложения, использующего стратегию P2P, которая поддерживает более 2 человек: github.com/lnogueir/webrtc -сокетио-образец - person lnogueir; 13.03.2021