INTEGRITY Документация

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 при запуске получения удалённого трека позволяет указать:

Управление пропускной способностью между медиатреками

Cloudflare Realtime обрабатывает все медиатреки одинаково на транспортном уровне. Например, если у вас несколько видеотреков (камеры, демонстрации экрана и т. д.), все они имеют равный приоритет при распределении пропускной способности. Это означает следующее:

  1. Конфигурация simulcast для каждого трека обрабатывается независимо
  2. SFU выполняет автоматическую оценку пропускной способности и переключение уровней в зависимости от состояния сети независимо для каждого трека

Поведение при переключении уровней

Когда запрашивается переключение слоя (посредством обновления preferredRid) с /tracks/update API:

  1. SFU автоматически сформирует запрос Full Intraframe Request (FIR)
  2. Генерация 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:

  1. Создайте новую локальную дорожку с конфигурацией simulcast. В SDP должен быть раздел с a=simulcast:send.
  2. Используйте Cloudflare Realtime API чтобы опубликовать этот локальный трек, вызвав эндпойнт /tracks/new.
  3. Используйте Cloudflare Realtime API чтобы начать получение удаленного трека (с другого браузера или устройства), вызвав эндпойнт /tracks/new и указав simulcast объект конфигурации вместе с ID удалённого трека, который вы получили на шаге 2.

Дополнительные примеры см. в Репозиторий GitHub Realtime Examples.