Simulcast: адаптивное качество видео
Simulcast -- технология одновременной отправки видеопотока в нескольких качествах, позволяющая SFU-серверу выбирать оптимальный поток для каждого участника в зависимости от пропускной способности.
Как работает simulcast
При включении simulcast браузер отправляет три слоя видео одновременно:
| Слой | RID | Разрешение | Битрейт (примерно) |
|---|---|---|---|
| Высокий | h | Полное (720p/1080p) | 1500-2500 кбит/с |
| Средний | m | Уменьшенное (360p) | 500-800 кбит/с |
| Низкий | l | Минимальное (180p) | 100-200 кбит/с |
Работа с SFU
Aulynk использует SFU (Selective Forwarding Unit) на базе Pion WebRTC. SFU не декодирует и не перекодирует видео -- он выбирает, какой слой пересылать каждому подписчику.
Процесс:
- Отправитель публикует видео с тремя simulcast-слоями.
- SFU получает все три потока и группирует их в
sfuSimulcastGroup. - Каждый получатель изначально подписывается на высокий слой (
h). - При ухудшении связи клиент или сервер переключает получателя на более низкий слой.
- При переключении слоя SFU запрашивает ключевой кадр (keyframe) у отправителя для мгновенного перехода.
Экономия трафика
Без simulcast в групповом звонке с N участниками каждый отправляет один поток максимального качества, и SFU пересылает его всем. С simulcast:
- Участники с плохим соединением получают слой
l(100-200 кбит/с вместо 1500+). - Участники, чьё видео отображается в маленьком окне, получают слой
m. - Только активный спикер (крупное окно) получает слой
h.
В звонке на 10 человек это может снизить общий исходящий трафик SFU в 3-5 раз.
Выбор слоя (sfu:set_layer)
Клиент может запросить переключение слоя через WebSocket-команду:
{
"type": "sfu:set_layer",
"callId": "call-uuid",
"publisherId": 42,
"layer": "m"
}
Параметры:
| Поле | Описание |
|---|---|
callId | ID звонка |
publisherId | ID пользователя, чей поток переключаем |
layer | Целевой слой: h, m или l |
{
"type": "sfu:set_layer_ack",
"callId": "call-uuid",
"ok": true
}
Если запрошенный слой недоступен (например, отправитель не публикует h), SFU автоматически выберет ближайший доступный слой (bestAvailableLayer).
Когда simulcast не работает
- Аудиопотоки всегда передаются без simulcast (один слой).
- Если браузер не поддерживает simulcast, видео передаётся одним потоком -- SFU обрабатывает это прозрачно.
- Демонстрация экрана (screenshare) может не использовать simulcast в зависимости от настроек клиента.