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;
}

Если вы хотите иметь больше контроля над адаптивным вещанием, задайте дополнительные параметры для webrtc_abr:

Параметр Описание Пример
start_track Номер видеодорожки, с которой начнётся проигрывание. Возможный формат указания значения: v1, v2, v3 и т.д.

Если параметр start_track не задан, или вместо видео- указана аудиодорожка (start_track=a3, или указанная видеодорожка не существует, то проигрывание начнётся с дорожки из середины списка доступных (например, v2 если у вас есть дорожки v1, v2 и v3) и в дальнейшем подстроится под пропускную способность канала.

Если дорожки ограничены параметром строки запроса ?filter=tracks:..., то Flussonic будет искать ближайшую доступную дорожку с меньшим номером, вплоть до v0.
Если такой дорожки не найдётся, то Flussonic будет искать ближайшую дорожку с большим номером.
start_track=v4
loss_count Целое число потерянных пакетов. По умолчанию loss_count=2. loss_count=3
up_window Если в последние up_window секунд число потерянных пакетов меньше значения loss_count и полоса пропускания (по REMB/TWCC) достаточна для видео дорожки следующего качества, то произойдет переключение на дорожку более высокого качества.
По умолчанию up_window=20.
up_window=17
down_window Если в последние down_window секунд число потерянных пакетов больше значения loss_count, то независимо от REMB/TWCC произойдет переключение на видео дорожку с более низким битрейтом.
По умолчанию down_window=5.
down_window=6
ignore_remb Если ignore_remb=true, Flussonic игнорирует значение REMB (Receiver Estimated Maximum Bitrate) от клиента при увеличении битрейта.

Если ignore_remb=false, значение битрейта не будет превышать значение REMB от клиента.
Используется только с REMB, ни на что не влияет при использовании TWCC.
По умолчанию ignore_remb=false.
ignore_remb=true
bitrate_prober Если принимает значение true, Flussonic периодически отправляет пробные пакеты для измерения пропускной способности и переключает битрейт на более высокий, если возможно. Подробнее: Использование REMB или TWCC для ABR.
По умолчанию false.
bitrate_prober=true
bitrate_probing_interval Интервал отправки пробных пакетов, в секундах. Подробнее: Использование REMB или TWCC для ABR. bitrate_probing_interval=2

Использование 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;