• Главная
  • Контакты
Подписаться:
  • Twitter
  • Facebook
  • RSS
  • VK
  • PushAll
logo

logo

  • Все
    • Положительные
    • Отрицательные
  • За сегодня
    • Положительные
    • Отрицательные
  • За вчера
    • Положительные
    • Отрицательные
  • За 3 дня
    • Положительные
    • Отрицательные
  • За неделю
    • Положительные
    • Отрицательные
  • За месяц
    • Положительные
    • Отрицательные
  • За год
    • Положительные
    • Отрицательные
  • Сортировка
    • По дате (возр)
    • По дате (убыв)
    • По рейтингу (возр)
    • По рейтингу (убыв)
    • По комментам (возр)
    • По комментам (убыв)
    • По просмотрам (возр)
    • По просмотрам (убыв)
Главная
  • Все
    • Положительные
    • Отрицательные
  • За сегодня
    • Положительные
    • Отрицательные
  • За вчера
    • Положительные
    • Отрицательные
  • За 3 дня
    • Положительные
    • Отрицательные
  • За неделю
    • Положительные
    • Отрицательные
  • За месяц
    • Положительные
    • Отрицательные
  • Главная
  • Трансляция RTMP видеопотока из Live Encoder на WebRTC

Трансляция RTMP видеопотока из Live Encoder на WebRTC +6

24.04.2017 08:02
flashphoner 1 1600 Источник
Разработка систем связи*, Разработка веб-сайтов*, Программирование*, JavaScript*, Блог компании Flashphoner

HTTP протоколы доставки видеоконтента, такие как HLS и DASH давно потеснили Flash в нише воспроизведения онлайн-видео контента в браузерах.

Тем не менее, изначально флэшовый протокол RTMP, остается одним из самых популярных способов доставки Live видео от источника видео до сервера ретранслятора. RTMP продолжают использовать такие сервисы, как Facebook Live, Youtube Live, и другие, где требуется вещать живое видео и проводить трансляции. Таким образом, несмотря на предсказания и констатации скорой кончины Flash, протокол RTMP все еще на коне и не уступает своих позиций в нише видеотрансляций.

Для захвата видео с камер, с последующей кодировкой в RTMP создано много хардварных и софтверных решений — коробок, которые подключаются к одной или нескольким камерам, обрабатывают полученные видеосигналы и отправляют полученную картинку по RTMP на удаленный сервер или сервис для дальнейшей ретрансляции. Классическая схема трансляции выглядит так:


Недостатком такой схемы можно назвать только задержку в видеотрансляции, которая может быть около 30 секунд. Если же вместо HLS и DASH использовать Adobe Flash Player и RTMP, то снова возвращаемся к Flash плагину, который находится, мягко говоря, не в авангарде современных средств отображения онлайн видео.

WebRTC


Решение, позволяющее отыграть поток без плагинов и с минимальной задержкой — это WebRTC и конвертация RTMP в WebRTC на стороне сервера решает задачу воспроизведения потока на большом числе устройств и браузеров.

Однако здесь следует понимать, что WebRTC — это технология, заточенная под реалтайм. В отличие, например от того же HTTP (HLS), где просто отдаются сегменты по протоколу HTTP, WebRTC работает гораздо сложнее и использует плотный обмен данными между отправителем и получателем трафика, с использованием RTCP-фидбеков, контролем полосы пропускания и таргетированием задержки.

Поэтому прежде чем включать WebRTC для простого воспроизведения потока, нужно ответить на один простой вопрос: требуется ли в проекте доставки видео низкая задержка. И если низкая задержка не требуется, то есть смысл рассмотреть другие технологии доставки, такие HLS и DASH чтобы избежать оверхеда с WebRTC.


Для максимальной совместимости с другими устройствами и сохранения возможности раздачи на HLS, необходимо выбрать правильные кодеки. Как правило, RTMP кодеры поддерживают H.264 видео кодек и AAC аудио кодек. Эта комбинация достаточно стандартная и встречается очень часто.

WebRTC в браузерах не поддерживает кодек AAC, поэтому придется транскодировать AAC в Opus или AAC в G.711. Транскодинг в Opus дает лучшее качество и позволяет, при желании, выкрутить его еще выше с помощью настроек. Поэтому если и транскодить, то предпочтительно делать это в Opus.

Так как мы используем H.264 при получении видеопотока сервером и при его воспроизведении с WebRTC-устройств, то транскодинга здесь не требуется, а требуется депакетизация полученного по RTMP видео с последующей пакетизацией в SRTP (WebRTC). Процесс ре-пакетизации, очевидно отнимает меньше процессорного времени чем транскодинг, что позволяет обслужить больше входящих потоков.

Однако, не все устройства поддерживают H.264. Например браузер Chrome под Android не везде дает использовать этот кодек. В этом случае включится полноценный транскодинг в WebRTC кодек VP8 и схема будет выглядеть так:


Транскодинг на стороне сервера предъявляет серьезные требования к CPU, поэтому нужно быть готовым заложить около 1 ядра сервера, при необходимости транскодинга потока высокого разрешения, например 720p

Кодеры


Профессиональные коробочки вроде такой стоят хороших денег и требуются для профессионального вещания 24x7 и серьезных бизнес-задач:


Для вещания более простых мероприятий подойдут софтверные решения, одним из которых является бесплатный Live Media Encoder от Adobe.


Версия кодера для Mac OS имеет поддержку кодеков H.264 и AAC. Поэтому если использовать Live Media Encoder на Mac, он может в каком-то смысле стать заменой хардварного кодера или платного софта, позволяющего вещать RTMP в сеть с теми же кодеками.

Тестирование


Для начала убедимся, что поток доступен и играет по RTMP. Если с воспроизведением по RTMP все в порядке и поток на месте, подключаемся к нему по WebRTC.

Процесс стриминга видеопотока на сервер называется публикация (publishing) и требует как минимум:

  1. Выбрать используемую камеру.
  2. Указать RTMP-адрес публикации потока
    Пример:
    rtmp://192.168.88.59/live
  3. Указать имя потока
    Пример:
    stream2229


Если адрес сервера правильный, есть доступ к камере, то при нажатии кнопки Start, кодер должен получить соединение с сервером по протоколу RTMP и начать публикацию видеопотока по указанному адресу и с указанным именем stream2229.


Теперь нужно забрать видеопоток с сервера по RTMP. Для этого будем использовать простое Flash-приложение Flash Streaming, которое также доступно по этой ссылке. Это обычная флэшка (swf-файл), которая располагается на web-странице и выполняется в Adobe Flash Player. Поэтому убедитесь, что Flash Player установлен и доступен в вашей системе для этого теста.

Здесь требуется ввести те же данные: адрес RTMP потока и его имя. В результате получаем видео на веб-странице. Его играет Flash Player.


Далее, вспоминаем, что нашей целью было протестировать воспроизведение с помощью WebRTC, и воспроизведение во Flash было лишь промежуточным тестом, подтверждающим работу RTMP кодера и сервера трансляции.

Для теста просто заберем видеопоток WebRTC плеером. Этот плеер не требует указания RTMP-адреса, так как для подключения к серверу используется протокол Websockets и адрес будет таким: wss://192.168.88.59:8443

Здесь:

wss — это вебсокеты через SSL
192.168.88.59 — адрес WebRTC сервера
8443 — порт сервера для протокола Websockets SSL


После того, как в качестве имени потока указали stream2229, нажимаем Play и получаем картинку уже по WebRTC.

Здесь нужно отметить, что несмотря на то, что подключение к серверу произошло по Websockets и порт указан 8443, видеотрафик пойдет не через это соединение. Для видео будут открыты специальные UDP порты на стороне браузера и на стороне сервера и именно через эти открытые UDP порты будет осуществляться передача видео. Через Websockets же будут переданы простые команды воспроизведения, статусы, а также конфигурация кодеков и другой важной для WebRTC информации.

Чтобы посмотреть как заходит WebRTC видеотрафик, используем браузер Google Chrome и во время воспроизведения открываем chrome://webrtc-internals


Графики показывают, что битрейт принимаемого видеопотока составляет около 600 kbps, фрейм рейт 28-30 FPS.


Следующие графики дают информацию о количестве потерянных UDP пакетов (50), о скорости приема пакетов в секунду, о разрешении видеопотока 640x480, о джиттере и времени декодирования.

Таким образом, мы протестировали воспроизведение RTMP видеопотока, отправленного с Adobe Live Media Encoder на HTML5 — странице в браузере с поддержкой WebRTC и не использовали дополнительных браузерных плагинов. Тестирование проходило с сервером Web Call Server 5, который поддерживает входящие RTMP потоки с последующей раздачей по RTMP, WebRTC и другим протоколам.

Код страницы — WebRTC плеера


Минимальный код плеера для встраивания в веб-страницу выглядит так

<html>
<head>
    <script language="javascript" src="flashphoner.js"></script>
    <script language="javascript" src="player.js"></script>
</head>
<body onLoad="init()">
<h1>The player</h1>
<div id="remoteVideo" style="width:320px;height:240px;border: 1px solid"></div>
<input type="button" value="start" onClick="start()"/>
<p id="status"></p>
</body>
</html>

Этот код опирается на файл API flashphoner.js, который доступен в сборке Web SDK. Сам плеер будет встроен в div-элемент remoteVideo.

Скрипт player.js использует три функции: инициализацию с помощью Flashphoner.init(), создание подключения к серверу с помощью Flashphoner.createSession() и воспроизведение WebRTC видеопотока session.createStream(...).play().

Статусы соединения с сервером отслеживаются с помощью событий: ESTABLISHED, DISCONNECTED, FAILED.

Статусы видеопотока отслеживаются с помощью событий PLAYING, STOPPED, FAILED.

Таким образом получаем полный контроль над соединением с сервером и статусами видеопотока.

var remoteVideo;

function init(){
    Flashphoner.init();
    remoteVideo = document.getElementById("remoteVideo");
}

function start() {
    Flashphoner.createSession({urlServer: "wss://wcs5-eu.flashphoner.com:8443"}).on(Flashphoner.constants.SESSION_STATUS.ESTABLISHED, function (session) {
        //session connected, start streaming
        startPlayback(session);
    }).on(Flashphoner.constants.SESSION_STATUS.DISCONNECTED, function () {
        setStatus("DISCONNECTED");
    }).on(Flashphoner.constants.SESSION_STATUS.FAILED, function () {
        setStatus("FAILED");
    });
}

function startPlayback(session) {
    session.createStream({
        name: "stream2229",
        display: remoteVideo,
        cacheLocalResources: true,
        receiveVideo: true,
        receiveAudio: true
    }).on(Flashphoner.constants.STREAM_STATUS.PLAYING, function (playStream) {
        setStatus(Flashphoner.constants.STREAM_STATUS.PLAYING);
    }).on(Flashphoner.constants.STREAM_STATUS.STOPPED, function () {
        setStatus(Flashphoner.constants.STREAM_STATUS.STOPPED);
    }).on(Flashphoner.constants.STREAM_STATUS.FAILED, function () {
        setStatus(Flashphoner.constants.STREAM_STATUS.FAILED);
    }).play();
}

function setStatus(status) {
    document.getElementById("status").innerHTML = status;
}

Минимальный код WebRTC плеера доступен для скачивания по этой ссылке и для работы требует установленного WebRTC-сервера Web Call Server 5. Сервер может быть скачан и установлен на Linux-хост https://flashphoner.com/download или же запущен в виде образа на Amazon EC2.

Минимальный код WebRTC плеера в работе


Пример плеера и скриншоты представленные выше, имели некоторые дополнительные стили и скрипты для позиционирования картинки.

В минимальном коде мы ограничились простейшим HTML и урезанным скриптом для максимально быстрого внедрения в страницу сайта. Результат выглядит так:


Этот плеер можно интегрировать в любую веб-страницу сайта или проекта, т.к. он требует лишь включения скрипта API flashphoner.js и одного div-блока под видео на веб-странице.

Сервер, который работает с WebRTC может физически находиться на другой независимой машине, никак не связанной с хостингом веб-проекта.


В итоге, мы описали код WebRTC-плеера и показали как встроить плеер в веб-страницу сайта и развернуть на собственном веб-сервере. Плеер играет WebRTC H.264 видеопоток. Источником потока RTMP является Adobe Live Media Encoder.

Ссылки


Adobe Flash Media Encoder — кодер от Adobe, позволяющий стримить RTMP.
Flash Streaming Demo — воспроизведение RTMP потока в Flash Player.
Player — стандартный пример плеера WebRTC с исходным кодом.
Player Minimal — скачать скрипты минимального плеера WebRTC player.html и player.js
WebRTC Server — сервер Web Call Server 5 для ретрансляции RTMP потока по WebRTC.
Web SDK — сборка содержит flashphoner.js — файл API для плеера.
Поделиться с друзьями
-->

Комментарии (1)


  1. keydon2
    24.04.2017 22:40
    #10189358

    При http-based протоколах можно просто чаще пакетизировать(да, возрастет немного трафик) и при приемлиемых временных задержках трансляции мы получаем всю развитую структуру для HTTP протокола. Логи, анализаторы, балансировка, кэширование, отсутствие проблем с файерволами.
    Расскажите пожалуйста как осуществляется продвинутое логирование(траблшутинг) и анализ трансляций(какие посоветуете бесплатные анализаторы кроме ffprobe) по WebRTC и RTMP на серверах, что вы используете.
    Под логированием я подразумеваю информацию, которую можно было бы использовать для траблшутинга — время отдачи пакетов, проблемы с приемом данных от энкодера. Как используется кэширование?
    В чем преимущество раздачи WebRTC перед применением HTML5 плееров для RTMP? Например, небезизвестный videojs.

МЕТКИ

  • Хабы
  • Теги

Разработка систем связи

Разработка веб-сайтов

Программирование

JavaScript

Блог компании Flashphoner

webrtc

RTMP

live encoder

трансляция видео

H.264

AAC

Opus

flash

Player

плеер

html5

HLS

HTTP

видеопоток

СЕРВИСЫ
  • logo

    CloudLogs.ru - Облачное логирование

    • Храните логи вашего сервиса или приложения в облаке. Удобно просматривайте и анализируйте их.
Все публикации автора
  • Делаем превью-снимки WebRTC видеопотока в PNG картинках +10

    • 25.05.2017 07:41

    7 способов отобразить видео с RTSP IP-камеры на веб-странице и 2 в мобильном приложении +13

    • 22.05.2017 06:10

    Как мы публиковали iOS приложение для видеочата в App Store +1

    • 12.05.2017 09:19

    Задержка в онлайн-трансляциях с веб-камеры, бессердечная ты стерва +9

    • 10.05.2017 10:37

    Транслируем видеопоток с веб-страницы по WebRTC на Facebook и YouTube одновременно +13

    • 04.05.2017 07:16

    Несколько строк JS кода для звонка из браузера на мобильный телефон -3

    • 27.04.2017 09:22

    А ваша вебкамера работает в новом Firefox 53? +3

    • 24.04.2017 11:48

    Трансляция RTMP видеопотока из Live Encoder на WebRTC +6

    • 24.04.2017 08:02

    Запись WebRTC видеопотока с веб-камеры браузера с буксировкой на Amazon S3 +6

    • 18.04.2017 08:00

    WebRTC, Safari +15

    • 08.04.2017 15:49

Подписка


ЛУЧШЕЕ

  • Сегодня
  • Вчера
  • Позавчера
07:01

Как я сделал ремастер «Том и Джерри» в 4K за два года: дубль два +38

04:00

Отвратительные вопросы для Гофера +17

07:05

Ваш телефон здесь бесполезен. Большой обзор транкинговой связи. Часть 1 +15

07:00

Спидраним переезд производства IRL (ПОТРАЧЕНО) +12

06:05

GigaChat 3.5 Reasoning — первая в России открытая модель с рассуждениями +12

07:00

350 коммитов в неделю: как контрибьютить в проект, который меняется быстрее, чем ты пишешь +11

07:46

Что не так с попытками бизнеса заменить джунов на ИИ +10

05:56

Как искать работу в 2026, когда по обе стороны ИИ: личный пошаговый план +10

08:11

Публикуем секреты в Production без регистрации и SMS +9

07:34

Зачем ИИ-агент, если есть дашборды? Отвечаем на вопросы по живым данным 1С +8

07:18

Индийский локомотив экономического роста: Tata Motors +7

07:50

Купил, но не владеешь: где проходит граница собственности в эпоху as a Service +5

07:22

Threat Intelligence без мифов: чем TI не является и почему его часто внедряют неправильно +5

07:16

Открыл обычный VBS, а внутри оказался PowerShell, AES и MSBuild +5

05:39

Ideco NGFW Novum v23: Shadow AI, enterprise-маршрутизация и контроль трафика +5

08:05

Сервера: распределяем нагрузку +4

07:10

Экономика личности: от рабства до ИИ +4

09:01

Как мы сделали RAG, который почти не галлюцинирует +3

08:30

Неужели так просто найти хакера в сетевом трафике облака? +3

08:17

Как засунуть Protobuf в CEL и выиграть (или проиграть): наш опыт в MWS Cloud Platform +3

12:27

AmneziaWG: от 2.0 к 3.1, и что творится у вас под капотом +55

12:50

Рынок IT-вакансий сломался и ничего не понятно? А ведь за изучение таких процессов в 2010 году дали Нобелевскую премию +42

09:08

PCIe и DDR3 на ПЛИС Gowin: как мы заставили работать то, что не работало у производителя +41

09:04

Видит ли MAX ваш VPN при Split Routing, если VPN не установлен на компьютере? +33

09:01

Что происходит в Wi-Fi: анализ трафика на канальном уровне +29

13:38

Мощный ИИ агент в 16гб VRAM +28

13:01

«Машина времени для света»: голографические лазеры +24

10:00

Как мы разобрали геймификацию на микросервисы и стали выпускать механики за неделю вместо года +24

07:05

Как Невил Маскелайн взломал беспроводной телеграф Маркони +24

08:01

Как защитить веб‑приложения с помощью Coraza (ModSecurity) +23

02:35

Как я объяснял племяннику 2x + 4 = 10 и случайно собрал визуальную лабораторию (сайт) +23

17:35

А чё, так можно было? Недокументированный C# +22

08:04

PostgreSQL и временные таблицы. Часть 2: почему 1024 счётчиков бывает мало +20

08:43

AI‑дайджест #4: закон об ИИ, кризис доверия и мнение коллег из Лаборатории искусственного интеллекта +18

11:59

Тест DeepSeek, Qwen, GLM и прочих LLM на продвинутом пользовательском железе +15

08:01

Как работает протокол нового агента Битрикс24 Коворк/Код +14

12:00

ИИ-агенты все помнят. И это плохо +13

11:37

Восемь часов онлайн ≠ восемь часов работы. Зачем мы вообще логируем время сотрудников? +13

07:02

Периодическая таблица аббревиатур корпоративного ландшафта: проектирование, производство и активы +13

20:52

А чё, так можно было? Приватное поле за 0,25 наносекунды +10

13:42

Нейронный Навье‑Стоксгейт: скандал с OpenAI вокруг решения «задачи тысячелетия» на $1'000'000 +141

14:43

От статьи на Хабре до Байконура: вывоз «Прогресса», хабраэффект и космический перенос +71

14:43

От статьи на Хабре до Байконура: вывоз «Прогресса», хабраэффект и космический перенос +71

09:01

HTML и CSS помогут вам сделать дружелюбный интерфейс! Вот моя коллекция простых лайфхаков +57

07:31

Как на ровном месте сэкономить 1000+ ядер, или Куда на самом деле уходили 80% CPU +47

07:23

ООН проголосовала за новую карту мира, показывающую истинный масштаб Африки +44

15:16

Полупроводниковый завод своими руками +43

08:00

Архитектура современных ИИ-агентов: собираем прототип за один вечер +43

18:52

Модель выложила системный промпт, в котором было написано его не выкладывать +36

13:01

Как выбрать IT-профессию и понять, что учить — метод на примере кибербезопасности +33

12:40

Как запустить Qwen3.8-Flash-Next 125B на 6 ГБ VRAM +32

12:22

Хотите, чтобы команда возненавидела таск-трекер? Вот 7 проверенных способов +29

07:00

Куда исчезли 15 тысяч кВт·ч: автоматизируем учет на старом заводе +24

05:01

Никто не просил — а я сделал банку робота‑секретаря +24

07:05

Хардварные стартапы — которые меняют мир +23

14:38

SPF, DKIM и DMARC на примере обычного письма: как работает email‑аутентификация +19

09:09

«Ключ к доверию. Безопасность в эпоху высоких технологий»: как готовили выставку Музея криптографии и Бастиона +19

05:57

Хакерспейсы Батуми и Тбилиси + ASIC чип спроектированный в Грузии +19

11:14

Черный экран смерти: как прочитать дамп за пять минут вместо переустановки Windows +18

07:01

Шесть ярких презентаций о технологиях как бесплатный архив идей и уроков +18

ОБСУЖДАЕМОЕ

  • Нейронный Навье‑Стоксгейт: скандал с OpenAI вокруг решения «задачи тысячелетия» на $1'000'000 +141

    • 273   59000

    ООН проголосовала за новую карту мира, показывающую истинный масштаб Африки +44

    • 265   19000

    Модель выложила системный промпт, в котором было написано его не выкладывать +36

    • 85   23000

    Рынок IT-вакансий сломался и ничего не понятно? А ведь за изучение таких процессов в 2010 году дали Нобелевскую премию +42

    • 68   18000

    Как настроить Arch Linux, чтобы он обошёл Windows 11 по производительности и стилю +5

    • 62   13000

    Как запустить Qwen3.8-Flash-Next 125B на 6 ГБ VRAM +32

    • 61   101000

    Cursor ограничивает доступ из России. Куда переходить? -6

    • 45   16000

    Видит ли MAX ваш VPN при Split Routing, если VPN не установлен на компьютере? +33

    • 36   43000

    Как мы обучаем обычных сотрудников использовать ИИ (и зачем) +2

    • 36   7000

    Восемь часов онлайн ≠ восемь часов работы. Зачем мы вообще логируем время сотрудников? +13

    • 32   10000

    Fermi Explorer: отправляем зонд к Альфе Центавра всего за 15 млн долларов +10

    • 30   7100

    Как словить вайб: разработка, паяльник, пчёлы и попытки убедить семью, что ты не сошёл с ума +10

    • 28   6200

    Как я объяснял племяннику 2x + 4 = 10 и случайно собрал визуальную лабораторию (сайт) +23

    • 28   14000

    Я не читаю свой код. Два месяца вайбкодинга большого проекта — честный отчёт +14

    • 26   6700

    Влияние ИИ на создание ПО. Всё, вышли на плато? +15

    • 24   11000
  • Главная
  • Контакты
© 2026. Все публикации принадлежат авторам.