Simulcast: адаптивное качество видео

Simulcast -- технология одновременной отправки видеопотока в нескольких качествах, позволяющая SFU-серверу выбирать оптимальный поток для каждого участника в зависимости от пропускной способности.

Как работает simulcast

При включении simulcast браузер отправляет три слоя видео одновременно:

СлойRIDРазрешениеБитрейт (примерно)
ВысокийhПолное (720p/1080p)1500-2500 кбит/с
СреднийmУменьшенное (360p)500-800 кбит/с
НизкийlМинимальное (180p)100-200 кбит/с
Каждый слой имеет уникальный RID (Restriction ID), по которому SFU различает потоки.

Работа с SFU

Aulynk использует SFU (Selective Forwarding Unit) на базе Pion WebRTC. SFU не декодирует и не перекодирует видео -- он выбирает, какой слой пересылать каждому подписчику.

Процесс:

  1. Отправитель публикует видео с тремя simulcast-слоями.
  2. SFU получает все три потока и группирует их в sfuSimulcastGroup.
  3. Каждый получатель изначально подписывается на высокий слой (h).
  4. При ухудшении связи клиент или сервер переключает получателя на более низкий слой.
  5. При переключении слоя SFU запрашивает ключевой кадр (keyframe) у отправителя для мгновенного перехода.

Экономия трафика

Без simulcast в групповом звонке с N участниками каждый отправляет один поток максимального качества, и SFU пересылает его всем. С simulcast:

В звонке на 10 человек это может снизить общий исходящий трафик SFU в 3-5 раз.

Выбор слоя (sfu:set_layer)

Клиент может запросить переключение слоя через WebSocket-команду:

{
  "type": "sfu:set_layer",
  "callId": "call-uuid",
  "publisherId": 42,
  "layer": "m"
}

Параметры:

ПолеОписание
callIdID звонка
publisherIdID пользователя, чей поток переключаем
layerЦелевой слой: h, m или l
Сервер отвечает подтверждением:

{
  "type": "sfu:set_layer_ack",
  "callId": "call-uuid",
  "ok": true
}

Если запрошенный слой недоступен (например, отправитель не публикует h), SFU автоматически выберет ближайший доступный слой (bestAvailableLayer).

Когда simulcast не работает