← Cloudflare Realtime / realtime / sfu
Simulcast
Simulcast je funkce WebRTC, která umožňuje vydavateli odesílat více video streamů stejného média v různých kvalitách. To se hodí například v případech, kdy chcete uživatelům počítačů posílat stream ve vysoké kvalitě a uživatelům mobilních zařízení stream v nižší kvalitě.
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"}
Jak to funguje
Simulcast ve WebRTC umožňuje kódovat jeden zdroj videa, například kameru nebo sdílení obrazovky, ve více úrovních kvality a odesílat je současně, což je výhodné pro odběratele s různými síťovými podmínkami a možnostmi zařízení. Zdroj videa se rozdělí do několika streamů, z nichž každý je označen identifikátorem RID (RTP Stream Identifier) pro danou úroveň kvality, například nízkou, střední a vysokou. Tyto simulcastové streamy jsou popsány v SDP, které odesíláte do Cloudflare Realtime SFU. Zajistit, aby se každému odběrateli doručil odpovídající kvalitní stream podle jeho síťových podmínek a možností zařízení, je úkolem Cloudflare Realtime SFU.
Cloudflare Realtime SFU automaticky zpracuje konfiguraci simulcastu na základě SDP, které mu odešlete z publikující strany. SFU pak automaticky přepíná mezi jednotlivými úrovněmi kvality podle síťových podmínek odběratele, nebo lze úroveň kvality řídit ručně přes API. Chování přepínání kvality můžete ovládat pomocí simulcast konfigurační objekt při odeslání API volání pro zahájení stahování vzdáleného tracku.
Kontrola kvality
simulcast konfigurační objekt v API volání při zahájení stahování vzdáleného tracku umožňuje zadat:
-
preferredRid: Preferovaná úroveň kvality pro video stream (RID pro simulcast stream. RID může specifikovat publikující strana. ↗) -
priorityOrdering: Určuje, jak SFU zachází s omezením šířky pásma.none: Nadále odesílat preferovanou vrstvu nastavenou přes preferredRid, i když není dostatek šířky pásma.asciibetical: Pro určení priority použijte abecední řazení (a-z), kde 'a' znamená nejvyšší prioritu a 'z' nejnižší.
-
ridNotAvailable: Určuje, co se stane, když preferované RID přestane být dostupné, například když ho publikující přestane odesílat.none: Neprovádějte žádnou akci.asciibetical: Přepne na další dostupné RID podle pořadí priority, kde 'a' je nejžádanější a 'z' nejméně žádané.
RID budete pravděpodobně chtít seřadit podle abecedy tak, aby odpovídalo požadované metrice, například od nejvyššího rozlišení po nejnižší nebo od nejvyšší šířky pásma po nejnižší.
Správa šířky pásma napříč mediálními stopami
Cloudflare Realtime zachází se všemi mediálními stopami na úrovni přenosu stejně. Pokud máte například více video stop (kamery, sdílení obrazovky atd.), mají všechny stejnou prioritu při přidělování šířky pásma. To znamená:
- Konfigurace simulcastu každé stopy se zpracovává nezávisle
- SFU provádí automatický odhad šířky pásma a přepínání vrstev na základě podmínek sítě nezávisle pro každou stopu
Chování při přepínání vrstev
Když je vyžádáno přepnutí vrstvy (prostřednictvím aktualizace preferredRid) s /tracks/update API:
- SFU automaticky vygeneruje Full Intraframe Request (FIR)
- Generování PLI je zpožďováno (debounce), aby se předešlo nadměrnému počtu požadavků.
Konfigurace publikující strany
Pro vydavatele (místní tracky) stačí do SDP zahrnout atributy simulcastu. SFU podle SDP automaticky zajistí konfiguraci simulcastu. SDP by například mělo obsahovat sekci podobnou této:
a=simulcast:send f;h;q
a=rid:f send
a=rid:h send
a=rid:q sendPokud je koncový bod publikujícího prohlížečem, můžete tyto položky zahrnout zadáním sendEncodings při vytváření transceiveru takto:
const transceiver = peerConnection.addTransceiver(track, {
direction: "sendonly",
sendEncodings: [
{ scaleResolutionDownBy: 1, rid: "f" },
{ scaleResolutionDownBy: 2, rid: "h" },
{ scaleResolutionDownBy: 4, rid: "q" },
],
});Příklad
Zde je příklad použití simulcastu s Cloudflare Realtime:
- Vytvořte novou lokální stopu s konfigurací simulcast. V SDP by měla existovat sekce s
a=simulcast:send. - Použijte Cloudflare Realtime API a odeslat tak tento místní track voláním endpointu /tracks/new.
- Použijte Cloudflare Realtime API a zahájit tak stahování vzdáleného tracku (z jiného prohlížeče nebo zařízení) voláním endpointu /tracks/new a zadáním
simulcastkonfigurační objekt spolu s ID vzdáleného tracku, které jste získali v kroku 2.
Další příklady najdete v GitHub repozitář Realtime Examples ↗.