Снижение задержки в массовых видеотрансляциях до менее чем 1 секунды с помощью WebRTC

Возможно ли добиться задержки менее секунды в видеобродкасте? А если стрим идёт на тысячную аудиторию? Да, возможно. Как? Ответим на этом примере — проекта Worldcast Live. Мы реализовали его на базе WebRTC. WCL транслирует концерты в HD-качестве на аудиторию в сотни и тысячи человек.
Зачем понижать задержку в видеотрансляции в прямом эфире?
Задержка (latency) менее секунды в видеоконференции — норма, иначе общаться невозможно. Для односторонней трансляции на большую аудиторию норма — и 2, и даже 20 секунд. Часто это приемлемо: задержка телевизионного сигнала — тоже около 6 секунд.
Но бывают случаи, когда в бродкасте нужна задержка менее секунды — например, в видеочате:
- Спортивные события
Вряд ли пользователь будет доволен, когда все соседи закричат: «Гол!», а на его трансляции мяч всё ещё в центре поля. А если он ещё и ставит вживую?
- Интервью
В век пандемии в онлайн перешло не только общение между друзьями, но и интервью с известными личностями. Сложите задержки интервьюера и интервьюируемого, добавьте миллисекунды, потраченные по дороге к пользователю. Чем больше результат — тем хуже опыт для всех сторон.
- Концерты
Плейер WCL встраивается на разные сайты. Трансляция концерта идёт на них одновременно в прямом эфире. Если вы смотрите с другом с разных сайтов, задержка в 20 секунд испортит впечатление от просмотра. Сегодня организаторы концертов стараются минимизировать задержку у конечного пользователя. Ему, конечно, не так важно, услышит он гитарный рифф сразу или через 2 секунды, но общий тренд — на уменьшение задержки. Чем быстрее, тем лучше :)
А ещё...
Примеры выше комбинируются. В Worldcast Live зрители и исполнители на концерте общаются через видеочат. Значит, и задержка должна быть как у видеочата: важно минимальное время между вопросом и ответом.
Как добиться задержки менее секунды в бродкасте?
Используйте WebRTC
Стандартный пакет WebRTC обеспечивает среднюю задержку в 500 миллисекунд (полсекунды). На этом можно было бы остановиться: просто создать видеочат, где пользователи подключаются друг к другу — технически это не сложно. Но сложно добиться стабильной работы на тысячах пользователей и реализовать гибкую настройку потоков для улучшения качества.
Базовый WebRTC — это не HD-стриминг. Качество аудио подходит для разговора, но не для передачи музыки. Чтобы снизить задержку, WebRTC может ухудшать качество, пропускать короткие фрагменты видео и звука. Чтобы этого избежать, пришлось глубоко изучить работу WebRTC — и мы это сделали.
Настройте WebRTC
Для того чтобы уменьшение задержки не ухудшало качество и опыт конечного пользователя, требуется дополнительная разработка. Что мы сделали для WCL, которая транслирует HD-концерты на аудиторию в несколько тысяч человек:
- включили многоканальное аудио
Стандартное аудио в WebRTC — моно, то есть один канал. Стерео — два канала. На WCL — 5 аудиоканалов.
- повысили битрейт
Настройки WebRTC по умолчанию ограничивают скорость передачи видео до 500 кб/с. Для активных действий на экране этого мало: если быстро сменяются яркие цвета и есть ограничение в 500 кб/с — качество видео будет понижаться, чтобы уложиться в узкий канал, и появятся пиксели. Так себе опыт просмотра концерта. Поэтому мы увеличили битрейт (пропускную способность) до 1,5 Гб, чтобы передавать HD-видео
- повысили частоту дискретизации
Таким образом мы улучшили качество аудио и видеопотоков — низкие и высокие частоты теперь не теряются при кодировании. Что именно мы сделали, рассказывать здесь не будем, но если интересно — пишите нам!
Масштабируйте Kurento
Kurento Media Server — это WebRTC-сервер с открытым исходным кодом. Для видеотрансляции настройте Master Kurento, через который будет идти стрим. К одному Master Kurento можно подключить до 500 зрителей, которые напрямую получают видеопоток. Если зрителей больше, включается Edge Kurento — его можно подключить к Master, и к нему уже присоединяются дополнительные пользователи. Чем больше зрителей, тем больше Edge Kurento нужно задействовать. Всё вместе это образует структуру в виде дерева.

В каких случаях оставить задержку больше секунды?
В условиях ограниченного бюджета WebRTC дороже HLS, если требуется масштабирование. Сервер WebRTC на WCL стоит 0,17 доллара в час — это около 122,40 долларов в месяц при расчёте на 30 дней.
HLS стоит $0,23 в час, и, в отличие от WebRTC, его можно включать и выключать — платим только за реальное использование, без расходов на простой. При трёх часовых концертах в неделю за 12 концертов в месяц выйдет чуть меньше $0,28. Разница ощутима. Учтите, что провайдеров серверов много и цены различаются, но на примере нашего проекта масштаб понятен.
Первая стабильная версия оптимальной задержки для WCL заняла 3,5 недели разработки. Если вам не нужна задержка менее одной секунды — например, вы не проводите интервью во время концерта — стоит ли вообще вкладываться в это?
А если кратко?
Задержка не более секунды в видеобродкасте необходима, если участники общаются между собой или смотрят мероприятие, где происходят быстрые изменения. С WebRTC это возможно даже для тысяч зрителей, если правильно использовать технологию.
Если ваше приложение подходит под эти задачи — обязательно обратите внимание на WebRTC. И свяжитесь с нами — поможем.
