Skip to content

Адаптивное потоковое вещание по WebRTC

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

Адаптивное потоковое вещание основано на технологии ABR (Adaptive Bitrate, адаптивный битрейт), предназначенной для эффективной доставки видео на большое количество разных устройств. Для реализации ABR из одного и того же источника с помощью транскодера генерируется несколько видео- и аудиодорожек с различными битрейтами и разрешениями — мультибитрейтный поток (MBR). Между сервером и каждым клиентским устройством устанавливается канал, в который отправляется одна из видео- и одна из аудиодорожек, причем в режиме ABR сервер сам выбирает, какую дорожку передавать в зависимости от текущей скорости сети у пользователя. При необходимости в клиентском приложении может быть предусмотрен ручной выбор дорожки.

Flussonic выбирает дорожку с приемлемым для пользователя битрейтом и качеством на основании следующих показателей, которые получает от браузера пользователя:

  • Индикатор потерь пакетов — NACK (Negative ACKnowledgement). Это количество потерянных пакетов за единицу времени.
  • Индикатор скорости передачи пакетов — REMB (Receiver Estimated Maximum Bitrate) или TWCC (Transport-wide Congestion Control). Это время доставки пакета от сервера до клиентского устройства. Подробнее об этих показателях см. Использование REMB или TWCC для ABR ниже.

Настройка ABR

Режим ABR включен для WebRTC по умолчанию. Это означает, что плееры будут работать в режиме автоматического переключения auto, пока зритель вручную не изменит качество видео. Чтобы включить режим auto вновь, необходимо выбрать его в настройках плеера.

Для того чтобы задать доступные в ABR дорожки, задайте параметры транскодера, например:

stream webrtc-abr {
  input fake://;
  webrtc_abr;
  transcoder vb=1000k size=1920x1080 bf=0 vb=300 size=320x240 bf=0 ab=64k acodec=opus;
}

Использование REMB или TWCC для ABR

Проигрывая потоки по WebRTC, Flussonic использует для отправки видео и аудио кадров протокол RTP. Для этого протокола доступны два механизма измерения пропускной способности. Flussonic может использовать какой-либо из этих механизмов в алгоритме ABR для принятия решения о переключении битрейта на более высокое значение.

REMB

Можно использовать механизм, основанный на сообщении REMB (Receiver Estimated Maximum Bitrate), получаемом от клиента. Битрейт отправленного видео не может превышать битрейт, указанный в сообщении REMB. Однако если значение REMB растет, Flussonic может переключиться на трек с более высоким битрейтом. Подробнее о REMB.

Этот механизм довольно прост, но у него есть ряд недостатков:

  • После кратковременной потери пакетов (например, из-за сбоя сетевого соединения), REMB стремительно падает, а затем растет очень медленно (в течение 5-15 минут). В результате Flussonic долго не может переключиться на трек с более высоким качеством, хотя клиент может его проиграть.
  • Flussonic не может контролировать это значение, т.к. оно вычисляется на стороне клиента.
  • Этот механизм отмечен как deprecated, и его дальнейшее развитие под вопросом.

Чтобы включить механизм REMB, укажите в директиве webrtc_abr параметр bitrate_prober=false.

TWCC

По умолчанию Flussonic использует механизм, доступный как расширение RTP: TWCC (Transport-wide Congestion Control). Подробнее о TWCC.

В этом случае Flussonic добавляет к каждому отправляемому пакету заголовок RTP, который содержит ID расширения и порядковый номер пакета. В ответ клиент отправляет сообщение RTCP, в котором содержится время получения и порядковый номер каждого полученного пакета. Таким образом, Flussonic знает время отправки и получения каждого пакета и может вычислить разницу между ними. Кроме того, Flussonic знает размер каждого пакета, так что может вычислить фактический битрейт, с которым он был отправлен.

Чтобы оценить максимально возможный битрейт, Flussonic периодически, через регулярные интервалы времени, отправляет группы так называемых пробных пакетов. Эти пакеты отправляются с битрейтом выше текущего. После получения этих пакетов Flussonic вычисляет их фактический битрейт, как описано выше. Если после очередной итерации вычисленный битрейт превышает битрейт следующей дорожки (с более высоким качеством) на 10 % и соблюдены условия по потерям пакетов (NACK), Flussonic переключается на следующий трек.

Этот механизм дает больше контроля и гибкости, так как большая часть его логики работает на стороне отправителя.

Вы можете задать следующие параметры TWCC в конфигурацию потока следующие параметры директивы webrtc_abr :

  • bitrate_prober=true – включить использование TWCC
  • bitrate_probing_interval– интервал отправки пробных пакетов, в секундах.

Например:

webrtc_abr bitrate_prober=true bitrate_probing_interval=2;