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

ПРОБЛЕМА:

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

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

А теперь представьте, что вас 10 000 посетителей: 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, но они должны решить эти возможные проблемы: задержка, общая стабильность сетевого соединения, формула масштабируемости (они, вероятно, не являются бесконечно масштабируемыми).

ПРЕДЛОЖЕНИЯ

  1. Уменьшение ЦП / пропускной способности за счет настройки аудио и видео кодеков;
  2. Получите медиа-сервер.

person igorpavlov    schedule 19.08.2013    source источник
comment
Единственный способ создать масштабируемое приложение - использовать решение на стороне сервера. Вроде все понятно ... Что касается WebRTC, то он никогда не предназначался для масштабных трансляций. Используйте для этого что-то, что поддерживает многоадресную рассылку, или, если вам нужно выходить через Интернет, соединение один-к-одному на основе сервера, поскольку интернет-провайдеры не маршрутизируют многоадресную рассылку.   -  person Dark Falcon    schedule 19.08.2013
comment
Спасибо за ответ, мне все ясно и ... к сожалению, чего я ожидал. Что насчет HLS, можно ли использовать, скажем, getUserMedia () для захвата видео с веб-камеры, отправки его на сервер в режиме реального времени и предоставления другим людям возможности извлекать его с сервера?   -  person igorpavlov    schedule 20.08.2013
comment
Отказ от ответственности: мне надоел Flash, поэтому Flash у меня не работает.   -  person igorpavlov    schedule 20.08.2013
comment
Почему бы не использовать WebRTC от клиента к серверу? Проблема заключается в распределении, поскольку соединение клиента не может ее обработать, поэтому отправьте один поток на сервер и выполните поток оттуда клиентам. Пропускная способность будет дорогой, но вы не можете обойтись ни с отправкой одного потока каждому пользователю, ни с тем, чтобы пользователь отправлял поток другим пользователям.   -  person Dark Falcon    schedule 20.08.2013
comment
Мне известно как минимум две компании, которые пытаются осуществлять доставку видео в формате p2p на основе webrtc: affovi.com /rtcplayer.html - в основном для живого видео; и peer5.com - в основном для VOD.   -  person Svetlin Mladenov    schedule 25.09.2013
comment
Почему бы не использовать WebRTC от клиента к серверу? - дорого, узкие места, не масштабируемо. Есть другие причины?   -  person igorpavlov    schedule 13.06.2014
comment
@SvetlinMladenov affovi.com недоступен. Вы знаете альтернативу?   -  person Ramil Amerzyanov    schedule 22.09.2014
comment
@RamilAmr вот он: viblast.com/demo   -  person Svetlin Mladenov    schedule 23.09.2014
comment
@igorpavlov Вы можете проверить: github.com/muaz-khan/WebRTC-Scalable-Broadcast Хотя работает только в хроме, а аудиотрансляции пока нет.   -  person Muaz Khan    schedule 12.11.2014
comment
Очень красивый проект. Что произойдет, если у ретранслятора плохое интернет-соединение (только ваше мнение)?   -  person igorpavlov    schedule 12.11.2014
comment
Я думаю, что лучший способ реализовать это - использовать других пиров в качестве серверов для новичков, например, если я присоединюсь к этой трансляции в качестве 6-го человека, сервер будет сигнализировать другим клиентам и соединит меня с любым другим присоединенным клиентом и отправит свой приходящий поток новичку. как одноранговый трафик. Это можно масштабировать по горизонтали, когда каждый новичок связывает приход своего предка. и если ваше соединение разрывается, сервер просто отправляет другое одноранговое соединение, как это было раньше.   -  person Melih    schedule 22.01.2015
comment
Мелих, есть ли какая-нибудь хорошо работающая услуга / реализация? Кроме того, это теоретически хорошая схема, но рассматриваете ли вы также задержки как главную проблему?   -  person igorpavlov    schedule 22.01.2015
comment
Какие недавние изменения вы имеете в виду?   -  person Alexander O'Mara    schedule 18.02.2015
comment
Текущие ответы могут быть устаревшими. Эта технология является передовой, и последние ответы были даны как минимум полгода назад.   -  person igorpavlov    schedule 18.02.2015
comment
Невозможно достичь такой масштабируемости без какого-либо MCU. WebRTC предназначен для работы в одноранговой сети. Вы не можете транслировать с него, не нанеся абсолютного удара вашему вещателю (с уникальным одноранговым соединением для каждого потока, который стажируется, это другой поток, который кодируется). Что касается ретрансляции мультимедиа от одноранговой сети, это могло бы быть возможным, но, конечно, это повлекло бы за собой дополнительную задержку для каждого однорангового узла, добавленного к потоку позже. Для обеспечения качества и масштабируемости наличие сервера MCU webrtc - единственное реальное решение.   -  person Benjamin Trent    schedule 19.02.2015
comment
Обнаружил это при поиске связанной темы. Вчера я провел потрясающую беседу, которая может вам помочь, проверьте этот greta.io   -  person Jose Rocha    schedule 14.01.2016
comment
Звучит хорошо, но я просто не могу понять, как они решают проблему нестабильного соединения пиров. Наверное, скоро с ними поговорю.   -  person igorpavlov    schedule 14.01.2016
comment
У вас есть решение на 2017 год?   -  person Nam Vu    schedule 29.03.2017
comment
Пока нет решения. Я думаю, это связано с фундаментальными ограничениями сетевых протоколов.   -  person igorpavlov    schedule 29.03.2017
comment
@igorpavlov: может быть, WebRTC-Scalable-Broadcast - отличный выбор на данный момент, не так ли?   -  person Nam Vu    schedule 30.03.2017


Ответы (11)


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

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

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

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

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

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

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

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

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

person nschoe    schedule 21.02.2015
comment
Верно ли говорить, что в настоящее время это не работает в Safari (или в любом браузере, не поддерживающем WebRTC?). Кто-нибудь знает о гибридном решении, в котором вы транслируете из браузера на сервер с помощью WebRTC, а затем перекодируете видео в HLS / HDS (или даже RTMP), чтобы оно соответствовало традиционной системе вещания? - person Ben; 13.03.2015
comment
@Ben да, это не работает с браузерами, которые не поддерживают WebRTC. В те дни (когда я писал это) Safari явно не поддерживал это. Однако сегодня я не проверял. Но я все еще думаю, что они не поддерживают WebRTC (правда, требует подтверждения). Что касается использования его в гибридной системе, это вполне возможно, на самом деле это то, что я сделал для компании, в которой работал; как вы сказали, я транслирую из браузера на сервер, а оттуда я построил и подключил конвейер GStreamer для перекодирования фида. Вы тоже можете это сделать! - person nschoe; 20.04.2016
comment
есть идеи о джитси? jitisi тоже то же самое? - person ishandutta2007; 01.08.2017
comment
@nschoe Это лучше, чем использовать веб-сокет для того же? - person Navigateur; 12.05.2020
comment
Вы фактически объясняете, как работает SFU (Selective Forwarding Unit). То же самое можно сделать с помощью mediasoup. - person Dirk V; 17.06.2020
comment
какие есть другие альтернативы, что вы гуглите? - person Muhammad Umer; 19.10.2020

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

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

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

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

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

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

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

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

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

https://web.archive.org/web/20160306014615/http://tomkrcha.com/?p=1526.

person Tom    schedule 13.02.2015
comment
Люди не убивают технологии. Технология убивает себя, обеспечивая очень плохой UX, особенно когда разрешены микрофон / камера. Вот где выигрывает getusermedia. - person igorpavlov; 16.02.2015
comment
Не считая плохого ux, это было бы решением? Сервер меньше? - person rubo77; 03.06.2015

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

person Angel Genchev    schedule 17.11.2013
comment
но чаты уже работают с WebRTC, поэтому все видят каждое сообщение, поэтому для видео тоже должно работать одно-ко многим. - person rubo77; 26.05.2015
comment
@ rubo77 Данные, отправленные с помощью текстового сообщения, - ничто по сравнению со скоростью и объемом данных, отправленных с видеопотоками. Таким образом, чаты могут легко содержать больше пользователей одновременно. - person Dirk V; 17.06.2020

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

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

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

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

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

person shacharz    schedule 17.03.2014
comment
Спасибо. Я знаю о peer5 и считаю его довольно привлекательным решением. Однако цель этого вопроса состояла в том, чтобы найти решение, абсолютно безсерверное (разрешено только STUN / TURN). - person igorpavlov; 17.03.2014

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

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

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

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

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

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

person igorpavlov    schedule 20.11.2013
comment
Как насчет скорости потока в решении на стороне сервера? Поделись, пожалуйста. - person user2003356; 19.02.2014
comment
Имеется ввиду серверное решение? Что вы использовали? Это было бы полезно для моего исследования. Поделись, пожалуйста. Спасибо. - person user2003356; 19.02.2014
comment
Серверное решение - это Opentok от Tokbox. Я их не афиширую, таких решений на рынке масса, но я придерживаюсь этого. Он работает как медиа-сервер. P.S. Что вы подразумеваете под многосторонним общением? Я не понимаю. - person igorpavlov; 20.02.2014
comment
@igorpavlov не могли бы вы дать список компаний, которые предоставляют серверную часть webrtc? Знаю только Flashphoner и Opentok. Спасибо - person Ramil Amerzyanov; 22.09.2014
comment
Мне было бы любопытно посмотреть, будет ли это масштабироваться. Несомненно, будут проблемы масштабирования с задержкой в ​​ОГРОМНЫХ группах (1000+), но если их всего 5-10, я могу представить, что это будет работать довольно хорошо, но потребуется некоторая причудливая работа ногой, если кто-то в середине одноранговой цепочки уйдет. и повторное подключение всех последующих пиров, если это всего лишь одна цепочка, было бы ОГРОМНЫМ над головой. Возможно, лучше использовать двоичную / троичную древовидную структуру. - person Benjamin Trent; 19.02.2015
comment
Эта архитектура работает в случае а) отсутствия задержки, б) стабильного и быстрого подключения к Интернету, в) минимального времени подключения. Так что это определенно работает через локальную сеть. Может быть полезно для трансляции видео / аудио в реальном времени через сотрудников вашей компании, если они, например, находятся в одном здании. - person igorpavlov; 19.02.2015
comment
Более того, архитектура, в которой каждый участник ретранслирует на 2 человека и каждый участник получает потоки от 2 человек, также снижает проблему повторных подключений в случае отключения однорангового узла от цепочки. B (вещатель) отправляет сообщения A1 (участник 1) и A2. A1 отправляет сообщения A2 и A3. A2 отправляет в A3 и A4. Допустим, A2 отключается, тогда A3 по-прежнему получает от A1 (поэтому вам нужно просто быстро переключать потоки), A4 все еще получает от A3, тогда вся архитектура цепочки восстанавливается в фоновом режиме, и это почти решает проблему времени подключения. - person igorpavlov; 19.02.2015
comment
А компьютер A1 выходит из строя, а это означает, что все, кто находится ниже по течению, - SOL. - person Tracker1; 25.02.2015
comment
Не совсем так. A2 будет переключаться на B, A3 на A2 и B, A4 на A3 и A2 и т. Д. И вы можете обработать 2 потока, чтобы увидеть, какой из них имеет наилучшее качество. Но с каждым одноранговым узлом временная задержка будет увеличиваться, поскольку передача видео на самом деле не в реальном времени. И этот метод основан на предположении, что в среднем не менее 50% пиров имеют хорошее соединение (что статистически неверно). - person igorpavlov; 25.02.2015

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

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

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

person imalice    schedule 06.02.2019

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

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

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

person videoking    schedule 27.11.2018

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

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

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

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

Наконец, все приведенное выше является ссылкой из Ссылка.

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

Я работаю над Relay версией WebRTC, но не уверен, что она будет работать. Мой тест предназначен только для одного пользователя Johnny и смотрю, может ли этот поток relayed быть другим пользователям.

  1. У нас открыто два окна браузера. Первый - это пользователь Johnny, второй - специальный пользователь Relay.
  2. На дисплее у вас будет local и remote видеоэлементы для тестирования.
  3. При запуске просмотра пользователи, подключенные к Hub, автоматически отображаются в окне браузера.
  4. Щелкните в первом окне пользователя Relay, и этот пользователь отобразится в элементе remote video первого окна браузера, а Johnny отобразится в окне remote второго окна браузера.
  5. Теперь приходит большая уловка, все остальные пользователи, которые хотят подключиться к Johnny, должны будут подключиться к remote окну специального пользователя relay. В этом примере один пользователь, но relay окно может иметь больше окон (RTCPeerConnections) для подключения большего количества пользователей.
  6. Окно браузера relay будет сервером для других пользователей. Все пользователи подключаются к relay окну браузера. RTCPeerConnections будет создан для каждого подключенного пользователя.

В моем примере я визуализирую это с помощью <video> элементов, но в relay окне браузера RTCPeerConnections должно быть достаточно.

Это логика идеи или я что-то упускаю?

person Herman Van Der Blom    schedule 09.09.2020