← Cloudflare Realtime / realtime / sfu
Simulcast
Simulcast представляет собой функцию WebRTC, которая позволяет издателю отправлять несколько видеопотоков одного медиаисточника с разным качеством. Это полезно, например, в сценариях, где нужно отправлять поток высокого качества пользователям настольных устройств и поток более низкого качества пользователям мобильных устройств.
graph LR
A[Publisher] -->|Low quality| B[Cloudflare Realtime SFU]
A -->|Medium quality| B
A -->|High quality| B
B -->|Low quality| C@{ shape: procs, label: "Subscribers"}
B -->|Medium quality| D@{ shape: procs, label: "Subscribers"}
B -->|High quality| E@{ shape: procs, label: "Subscribers"}
Как это работает
Simulcast в WebRTC позволяет кодировать один источник видео, например камеру или демонстрацию экрана, сразу в нескольких уровнях качества и отправлять их одновременно, что полезно для подписчиков с разными условиями сети и возможностями устройств. Источник видео кодируется в несколько потоков, каждый из которых определяется RID (RTP Stream Identifier) для конкретного уровня качества, например низкого, среднего и высокого. Эти потоки simulcast описываются в SDP, которое вы отправляете в Cloudflare Realtime SFU. Обеспечить доставку каждому подписчику потока подходящего качества в зависимости от условий сети и возможностей устройства обязан Cloudflare Realtime SFU.
Cloudflare Realtime SFU автоматически настраивает simulcast на основе SDP, которое вы отправляете от издателя. Затем SFU автоматически переключается между уровнями качества в зависимости от состояния сети подписчика, либо уровень качества можно задавать вручную через API. Управлять поведением переключения качества можно с помощью simulcast объект конфигурации при отправке вызова API для запуска получения удалённого трека.
Контроль качества
simulcast объект конфигурации в вызове API при запуске получения удалённого трека позволяет указать:
-
preferredRid: Предпочтительный уровень качества для видеопотока (RID для потока simulcast. RID могут быть заданы издателем. ↗) -
priorityOrdering: Определяет, как SFU обрабатывает ограничения пропускной способности.none: Продолжать отправлять предпочтительный слой, заданный через preferredRid, даже при нехватке пропускной способности.asciibetical: Используйте алфавитный порядок (a-z) для определения приоритета: «a» означает наивысший приоритет, а «z» означает наименьший.
-
ridNotAvailable: Определяет, что происходит, когда предпочтительный RID становится недоступен, например когда издатель перестаёт его отправлять.none: Ничего не делать.asciibetical: Переключение на следующий доступный RID согласно порядку приоритета, где 'a' наиболее предпочтителен, а 'z' наименее предпочтителен.
Скорее всего, вам захочется упорядочить RID в алфавитном порядке в соответствии с нужной метрикой, например от наивысшего разрешения к наименьшему или от наибольшей пропускной способности к наименьшей.
Управление пропускной способностью между медиатреками
Cloudflare Realtime обрабатывает все медиатреки одинаково на транспортном уровне. Например, если у вас несколько видеотреков (камеры, демонстрации экрана и т. д.), все они имеют равный приоритет при распределении пропускной способности. Это означает следующее:
- Конфигурация simulcast для каждого трека обрабатывается независимо
- SFU выполняет автоматическую оценку пропускной способности и переключение уровней в зависимости от состояния сети независимо для каждого трека
Поведение при переключении уровней
Когда запрашивается переключение слоя (посредством обновления preferredRid) с /tracks/update API:
- SFU автоматически сформирует запрос Full Intraframe Request (FIR)
- Генерация PLI откладывается (debounce), чтобы избежать чрезмерного количества запросов
Конфигурация издателя
Для издателей (локальных треков) достаточно включить в SDP атрибуты simulcast. SFU автоматически обработает конфигурацию simulcast на основе SDP. Например, SDP должен содержать примерно такой раздел:
a=simulcast:send f;h;q
a=rid:f send
a=rid:h send
a=rid:q sendЕсли эндпойнтом издателя является браузер, вы можете включить их, указав sendEncodings при создании трансивера следующим образом:
const transceiver = peerConnection.addTransceiver(track, {
direction: "sendonly",
sendEncodings: [
{ scaleResolutionDownBy: 1, rid: "f" },
{ scaleResolutionDownBy: 2, rid: "h" },
{ scaleResolutionDownBy: 4, rid: "q" },
],
});Пример
Ниже приведен пример использования simulcast с Cloudflare Realtime:
- Создайте новую локальную дорожку с конфигурацией simulcast. В SDP должен быть раздел с
a=simulcast:send. - Используйте Cloudflare Realtime API чтобы опубликовать этот локальный трек, вызвав эндпойнт /tracks/new.
- Используйте Cloudflare Realtime API чтобы начать получение удаленного трека (с другого браузера или устройства), вызвав эндпойнт /tracks/new и указав
simulcastобъект конфигурации вместе с ID удалённого трека, который вы получили на шаге 2.
Дополнительные примеры см. в Репозиторий GitHub Realtime Examples ↗.