WebRTC - масштабируемая трансляция / мультикастинг в прямом эфире

115

ПРОБЛЕМА:

WebRTC дает нам одноранговые видео / аудио соединения. Идеален для p2p звонков, тусовок. А как насчет широковещания («один ко многим», например, от 1 до 10000)?

Допустим, у нас есть вещатель «B» и двое посетителей «A1», «A2». Конечно, это кажется разрешимым: мы просто соединяем B с A1, а затем B с A2. Таким образом, B отправляет видео / аудиопоток напрямую в A1, а другой поток - в A2. B отправляет потоки дважды.

А теперь представьте, что вас 10000 человек: A1, A2, ..., A10000. Это означает, что B должен отправить 10000 потоков. Каждый поток составляет ~ 40 КБ / с, что означает, что B требуется исходящая скорость Интернета 400 МБ / с для поддержания этой трансляции. Неприемлемый.

ОРИГИНАЛЬНЫЙ ВОПРОС (УСТАРЕЛ)

Можно ли как-то решить эту проблему, чтобы B отправлял только один поток на какой-то сервер, а посетители просто извлекали этот поток с этого сервера? Да, это означает, что исходящая скорость на этом сервере должна быть высокой, но я могу ее поддерживать.

А может, это означает разрушение идеи WebRTC?

НОТЫ

Flash не подходит для моих нужд из-за плохого UX для конечных клиентов.

РЕШЕНИЕ (НЕ ДЕЙСТВИТЕЛЬНО)

26.05.2015 - На данный момент нет такого решения для масштабируемого вещания для WebRTC, где бы вы вообще не использовали медиа-серверы. На рынке представлены как серверные решения, так и гибридные (p2p + серверная часть в зависимости от различных условий).

Хотя есть несколько многообещающих технологий, таких как https://github.com/muaz-khan/WebRTC-Scalable-Broadcast, но они должны ответить на эти возможные проблемы: задержка, общая стабильность сетевого соединения, формула масштабируемости (они, вероятно, не являются бесконечно масштабируемыми. ).

SUGGESTIONS

  1. Уменьшите ЦП / пропускную способность за счет настройки аудио и видео кодеков;
  2. Получите медиа-сервер.
игорпавлов
источник
3
«Единственный способ создать масштабируемое приложение - использовать решение на стороне сервера». Вроде все понятно ... Что касается WebRTC, то он никогда не предназначался для масштабных трансляций. Используйте для этого что-то, что поддерживает многоадресную рассылку, или, если вам нужно выходить через Интернет, соединение «один-к-одному» на основе сервера, поскольку интернет-провайдеры не маршрутизируют многоадресную рассылку.
Dark Falcon
1
Почему бы не использовать WebRTC от клиента к серверу? Проблема заключается в распространении, поскольку соединение клиента не может ее обработать, поэтому отправьте один поток на сервер и выполните поток оттуда клиентам. Пропускная способность будет дорогой, но вы не можете обойтись ни с отправкой одного потока каждому пользователю, ни с тем, чтобы пользователь отправлял поток другим пользователям.
Dark Falcon
1
Я знаю как минимум две компании, которые пытаются осуществлять доставку p2p-видео на основе webrtc : affovi.com/rtcplayer.html - в основном для живого видео; и peer5.com - в основном для VOD.
Светлин Младенов
1
@igorpavlov Вы можете проверить: github.com/muaz-khan/WebRTC-Scalable-Broadcast Хотя он работает только в хроме, а аудиотрансляции пока нет.
Муаз Хан
4
Невозможно достичь такой масштабируемости без какого-либо MCU. WebRTC предназначен для работы в одноранговой сети. Вы не можете транслировать с него, не подавив своего вещателя (с уникальным одноранговым соединением для каждого потока, который стажируется, это другой поток, который кодируется). Что касается ретрансляции мультимедиа от одноранговой сети, это может быть возможно, но, конечно, это повлечет за собой дополнительную задержку для каждого однорангового узла, добавленного в поток позже. С точки зрения качества и масштабируемости, наличие сервера MCU webrtc - единственное реальное решение.
Бенджамин Трент,

Ответы:

66

Поскольку это было в значительной степени рассмотрено здесь, то, что вы пытаетесь сделать здесь, невозможно с обычным старомодным WebRTC (строго одноранговым). Потому что, как было сказано ранее, соединения WebRTC повторно согласовывают ключи шифрования для шифрования данных для каждого сеанса. Таким образом, вашему телевещательному агентству (B) действительно нужно будет загружать свой поток столько раз, сколько есть участников.

Однако есть довольно простое решение, которое работает очень хорошо: я его протестировал, он называется шлюзом WebRTC. Янус - хороший пример. Это полностью открытый исходный код ( здесь репозиторий github ).

Это работает следующим образом: ваш вещатель связывается со шлюзом (Janus), который поддерживает WebRTC . Таким образом, происходит согласование ключей: B безопасно передает (зашифрованные потоки) в Janus.

Теперь, когда посетители подключаются, они снова подключаются к Janus: согласование WebRTC, защищенные ключи и т. Д. С этого момента Janus будет отправлять потоки обратно каждому посетителю.

Это хорошо работает, потому что вещатель (B) только один раз загружает свой поток на Janus. Теперь Янус декодирует данные, используя свой собственный ключ, и имеет доступ к необработанным данным (то есть пакетам RTP) и может отправлять эти пакеты каждому посетителю (Янус позаботится о шифровании за вас). А поскольку вы помещаете Janus на сервер, у него отличная пропускная способность для загрузки, поэтому вы сможете передавать потоки многим одноранговым узлам.

Так что да, это действительно связано с сервером, но этот сервер использует WebRTC, и вы «владеете» им: вы реализуете часть Janus, поэтому вам не нужно беспокоиться о повреждении данных или о человеке в середине. Ну, если, конечно, ваш сервер не скомпрометирован. Но вы можете сделать так много.

Чтобы показать вам, насколько легко использовать Janus, у вас есть функция с именем incoming_rtp()incoming_rtcp()), которую вы можете вызвать, которая дает вам указатель на пакеты rt (c) p. Затем вы можете отправить его каждому посетителю (они хранятся в sessionsтом, что Janus очень легко использует). Посмотрите здесь одну реализацию incoming_rtp()функции , парой строк ниже вы можете увидеть, как передавать пакеты всем посетителям, и здесь вы можете увидеть фактическую функцию для ретрансляции пакета rtp.

Все работает неплохо, документацию довольно легко читать и понимать. Я предлагаю вам начать с примера "echotest", он самый простой и вы можете понять внутреннюю работу Януса. Я предлагаю вам отредактировать файл эхо-теста, чтобы создать свой собственный, потому что нужно написать много избыточного кода, поэтому вы также можете начать с полного файла.

Радоваться, веселиться! Надеюсь, я помог.

nschoe
источник
1
Верно ли сказать, что в настоящее время это не работает в Safari (или в любом браузере, не поддерживающем WebRTC?). Кто-нибудь знает о гибридном решении, в котором вы транслируете из браузера на сервер с помощью WebRTC, а затем перекодируете видео в HLS / HDS (или даже RTMP), чтобы оно соответствовало традиционной системе вещания?
Бен,
1
@Ben да, это не работает с браузерами, которые не поддерживают WebRTC. В те дни (когда я писал это) Safari явно не поддерживал это. Однако сегодня я не проверял. Но я все еще думаю, что они не поддерживают WebRTC (правда, требует подтверждения). Что касается использования его в гибридной системе, то это вполне возможно, на самом деле это то, что я сделал для компании, в которой работал; как вы сказали, я транслирую из браузера на сервер, а оттуда я построил и подключил конвейер GStreamer для перекодирования потока. Вы тоже можете это сделать!
nschoe
есть идеи о джитси? jitisi тоже то же самое?
ishandutta2007 01
@nschoe Это лучше, чем использование веб-сокета для того же?
Navigateur
Фактически вы объясняете, как работает SFU (Selective Forwarding Unit). Вы можете сделать то же самое с mediasoup
Dirk V
11

Как отметил выше @MuazKhan:

https://github.com/muaz-khan/WebRTC-Scalable-Broadcast

работает в хроме, и пока нет аудиотрансляции, но, похоже, это первое решение.

Демонстрация масштабируемого однорангового вещания WebRTC.

Этот модуль просто инициализирует socket.io и настраивает его таким образом, чтобы одна трансляция могла передаваться неограниченному количеству пользователей без каких-либо проблем с полосой пропускания / использованием ЦП. Все происходит в одноранговой сети!

введите описание изображения здесь

Это определенно должно быть возможно завершить.
Другие тоже могут этого добиться: http://www.streamroot.io/

rubo77
источник
2
Мне эта штука кажется немного устаревшей. Есть обновления или мысли по этой идее?
igorpavlov
Кроме того, решает ли это каким-либо образом проблемы с задержкой? Например, Peer1 разговаривает с Peer5, а Peer2 в конечном итоге теряет соединение. Или эта архитектура подходит только для LAN?
igorpavlov
Кроме того, похож ли Streamroot на Peer5?
igorpavlov
7

Насколько мне известно, единственной актуальной и зрелой реализацией этого является Adobe Flash Player, который поддерживает многоадресную передачу p2p для одноранговой передачи видео с версии 10.1.

http://tomkrcha.com/?p=1526 .

Том
источник
1
Люди не убивают технологии. Технология убивает себя, обеспечивая очень плохой UX, особенно когда разрешены микрофон / камера. Вот где выигрывает getusermedia.
igorpavlov
Не могу с этим согласиться.
Том
Не считая плохого ux, это было бы решением? Сервер меньше?
rubo77 03
6

«Масштабируемое» вещание невозможно в Интернете, потому что там не разрешена многоадресная рассылка IP UDP. Но теоретически это возможно в локальной сети.
Проблема с Websockets заключается в том, что у вас нет доступа к RAW UDP по умолчанию, и это не будет разрешено.
Проблема с WebRTC заключается в том, что его каналы данных используют форму SRTP, где каждый сеанс имеет собственный ключ шифрования . Поэтому, если кто-то «не изобретает» или API не позволяет разделить один сеансовый ключ между всеми клиентами, многоадресная рассылка бесполезна.

Ангел Генчев
источник
1
но чаты уже работают с WebRTC, поэтому все видят каждое сообщение, так что для видео тоже должно работать «один ко многим»
rubo77
@ rubo77 Данные, отправленные с помощью текстового сообщения, - ничто по сравнению со скоростью и объемом данных, отправленных с видеопотоками. Таким образом, чаты могут легко содержать больше пользователей одновременно
Дирк V
5

Существует решение доставки с привлечением партнеров, что означает гибридный подход. И сервер, и одноранговые узлы помогают распределять ресурс. Это подход, который использовали peer5.com и peercdn.com .

Если мы говорим конкретно о прямой трансляции, это будет выглядеть примерно так:

  1. Вещатель отправляет живое видео на сервер.
  2. Сервер сохраняет видео (обычно также перекодирует его во все соответствующие форматы).
  3. Создаются метаданные об этом прямом эфире, совместимые с HLS, HDS или MPEG_DASH.
  4. Потребители переходят к соответствующему потоку в реальном времени, где игрок получает метаданные и знает, какие фрагменты видео получить дальше.
  5. При этом потребитель подключается к другим потребителям (через WebRTC)
  6. Затем игрок загружает соответствующий фрагмент либо непосредственно с сервера, либо от партнеров.

Следование такой модели может сэкономить до ~ 90% пропускной способности сервера в зависимости от битрейта живого потока и совместного восходящего канала зрителей.

отказ от ответственности: автор работает в Peer5

Shacharz
источник
Спасибо. Я знаю о peer5 и считаю его довольно привлекательным решением. Однако целью этого вопроса было найти решение, абсолютно безсерверное (разрешено только STUN / TURN).
igorpavlov
5

Мои мастера сосредоточены на разработке гибридного протокола прямой трансляции cdn / p2p с использованием WebRTC. Я опубликовал свои первые результаты на http://bem.tv

Все с открытым исходным кодом, и я ищу участников! :-)

Flavioribeiro
источник
Вы используете какое-либо серверное программное обеспечение вроде MCU?
igorpavlov
На самом деле я использую некоторые серверные компоненты от людей rtcio: github.com/rtc-io
flavioribeiro
1
Похоже, вы используете их компоненты для сигнализации. Как насчет потоковой передачи видео на стороне сервера? Или ваше решение - это абсолютно P2P?
igorpavlov
извините за долгую задержку с ответом вам @igorpavlov, я использую EvoStream для сегментации видео, и я зацикливаю источник видео и указываю на EvoStream с помощью кодировщика Elemental.
flavioribeiro
Это поставщик медиа-серверов. Более эффективным? Наверное. Это то, что я ищу? Нет.
igorpavlov
2

Ответ Ангела Генчева кажется правильным, однако существует теоретическая архитектура, позволяющая осуществлять трансляцию с малой задержкой через WebRTC. Представьте, что B (вещатель) передает поток A1 (участник 1). Затем подключается A2 (участник 2). Вместо потоковой передачи от B к A2, A1 начинает потоковую передачу видео от B к A2. Если A1 отключается, тогда A2 начинает получать от B.

Эта архитектура могла бы работать, если бы не было задержек и таймаутов соединения. Так что теоретически это правильно, но не практически.

На данный момент я использую решение на стороне сервера.

игорпавлов
источник
Как насчет скорости потока в решении на стороне сервера? Поделись, пожалуйста.
user2003356
Значит серверное решение? Что вы использовали? Это было бы полезно для моего исследования. Поделись, пожалуйста. Спасибо.
user2003356
Серверное решение - это Opentok от Tokbox. Я их не афиширую, таких решений на рынке масса, но я придерживаюсь этого. Он работает как медиа-сервер. PS Что вы подразумеваете под многосторонним общением? Я не понимаю.
igorpavlov
@igorpavlov не могли бы вы дать список компаний, которые предоставляют серверную часть webrtc? Знаю только Flashphoner и Opentok. Спасибо
Рамиль Амерзянов
Мне было бы любопытно посмотреть, будет ли это масштабироваться. Несомненно, будут проблемы масштабирования с задержкой в ​​ОГРОМНЫХ группах (1000+), но если их всего 5-10, я могу представить, что это будет работать довольно хорошо, но потребуется некоторая необычная работа ног, если кто-то в середине цепочки одноранговых узлов "уходит, и переподключение всех последующих пиров, если это всего лишь одна цепочка, было бы ОГРОМНЫМ перебором. Возможно, лучше использовать двоичную / тройную древовидную структуру.
Бенджамин Трент,
2

На рынке доступно несколько решений для масштабируемого решения WebRTC. Они обеспечивают масштабируемую потоковую передачу Webrtc с малой задержкой. Вот несколько примеров. Янус , Jitsi , Wowza , Red5pro , Ant Media Server

Я разработчик Ant Media Server , мы предоставляем как общественную, так и корпоративную версию, включая SDK для Android и iOS. Сообщите нам, если мы сможем вам чем-то помочь.

далеко
источник
1

Вы описываете использование WebRTC с требованием «один ко многим». WebRTC разработан для одноранговой потоковой передачи, однако существуют конфигурации, которые позволят вам воспользоваться низкой задержкой WebRTC при доставке видео многим зрителям.

Хитрость заключается в том, чтобы не обременять клиента потоковой передачи каждым зрителем и, как вы упомянули, иметь «ретрансляционный» медиа-сервер. Вы можете создать это самостоятельно, но, честно говоря, лучшим решением часто является использование чего-то вроде продукта Wowza WebRTC Streaming .

Для эффективного стриминга с телефона вы можете использовать Wowza GoCoder SDK, но, по моему опыту, лучше всего работает более продвинутый SDK, такой как StreamGears .

видео
источник
1

Я разрабатываю систему вещания WebRTC с использованием Kurento Media Server . Kurento поддерживает несколько видов потокового протокола, таких как RTSP, WebRTC, HLS. Он также работает в режиме реального времени и масштабирования.

Следовательно, Kurento не поддерживает RTMP, который сейчас используется в Youtube или Twitch. Одна из моих проблем - количество пользователей, одновременно работающих с этим.

Надеюсь, это поможет.

imalice
источник
0

Поскольку peer1 - это только тот партнер, который вызывает getUserMedia (), т.е. peer1 создает комнату.

  1. Итак, peer1 захватывает медиа и запускает комнату.
  2. peer2 присоединяется к комнате и получает поток (данные) от peer1, а также открывает параллельное соединение с именем "peer2-connection"
  3. Когда peer3 присоединяется к комнате и получает поток (данные) от peer2, а также открывает параллельное соединение с именем «peer3-connection» и так далее.

Этот процесс продолжается по мере того, как многие одноранговые узлы подключаются друг к другу.

Следовательно, благодаря этому одна трансляция может передаваться неограниченному количеству пользователей без каких-либо проблем с пропускной способностью / загрузкой процессора.

Наконец, все вышеизложенное является ссылкой на ссылку .

susan097
источник
1
Этот подход уже упоминался, но он может не работать в реальном мире. Почему я как Peer3 должен заботиться о пропускной способности Peer2? Конечно, Peer3 может вернуться к Peer1, если Peer2 покинет цепочку, но это вызовет множество прерываний потока, повторных подключений и т. Д. Чем дальше я буду в цепочке, тем больше я буду страдать. Так что да, может работать по локальной сети, но, вероятно, это все.
igorpavlov
Параллельная широковещательная передача не заботится о пропускной способности, и если после установления соединения между одноранговым узлом3 и одноранговым узлом1 через одноранговый узел2 и таким образом, что одноранговый узел2 откатывается, узел3 остается подключенным к одноранговому узлу1.
susan097
Я не уверен, что понимаю. На самом деле я не имел в виду ссылку, теперь позвольте мне сослаться. По этой ссылке github.com/muaz-khan/WebRTC-Scalable-Broadcast есть изображение в разделе "Как это работает?" раздел. Это изображение ясно показывает, что как только, скажем, Peer5 отключается, Peer8, 9 и 10 отключаются от трансляции. Им нужно будет подключиться к Peer2 или Peer6, но это приведет к задержкам. Кроме того, у этого проекта нет ни участников, ни активности.
igorpavlov