← Cloudflare Realtime / realtime / sfu / media-transport-adapters
WebSocket adaptér
Streamujte zvuk a video mezi stopami WebRTC a koncovými body WebSocket. Podporuje příjem zvuku ze zdrojů WebSocket a odesílání zvuku a videa WebRTC ke spotřebitelům WebSocket. Výstup videa (egress) je podporován ve formátu JPEG přibližně při 1 FPS.
Co můžete vytvořit
- Služby AI s WebSocket API pro zpracování zvuku
- Vlastní pipeline pro zpracování zvuku
- Přemostění starších systémů
- Generování a příjem zvuku na straně serveru
- Pořizování snímků z videa a miniatury
- Příjem dat pro počítačové vidění (nízké FPS)
Jak to funguje
Vytváření WebRTC stop z externího zvuku
Přijímejte zvuk z externích zdrojů přes WebSocket a vytvářejte z něj WebRTC tracky pro distribuci.
graph LR
A[External System] -->|Audio Data| B[WebSocket Endpoint]
B -->|Adapter| C[Realtime SFU]
C -->|New Session| D[WebRTC Track]
D -->|WebRTC| E[WebRTC Clients]
Případy použití:
- Streamování generování řeči z textu pomocí AI do WebRTC
- Zvuk z backendových služeb nebo databází
- Živé zvukové vstupy z externích systémů
Klíčové vlastnosti:
- Automaticky vytvoří nové ID relace
- Používá
bufferrežim pro přenos zvuku po částech - Maximálně 32 KB na zprávu WebSocket
Streamujte zvuk a video WebRTC do externích systémů
Streamujte zvuk a video z existujících stop WebRTC do externích systémů prostřednictvím WebSocket za účelem zpracování nebo uložení.
graph LR
A[WebRTC Source] -->|WebRTC| B[Realtime SFU Session]
B -->|Adapter| C[WebSocket Endpoint]
C -->|Media Data| D[External System]
Případy použití:
- Přepis řeči na text v reálném čase
- Nahrávání a archivace zvuku
- Kanály pro živé zpracování zvuku
- Pořizování snímků z videa a miniatury
- Příjem dat pro počítačové vidění (nízké FPS)
Klíčové vlastnosti:
- Vyžaduje ID existující relace s trackem
- Zvuk: Odesílá jednotlivé snímky PCM tak, jak vznikají, každý obsahuje časové razítko a pořadové číslo
- Video: odesílá jednotlivé snímky JPEG přibližně s frekvencí 1 FPS; každý obsahuje časové razítko (pořadové číslo nemusí být nastaveno)
- Po krátkých výpadcích spojení nebo restartu koncového bodu automaticky opakuje pokusy o připojení ke stejnému koncovému bodu WebSocket až po dobu 5 sekund. Více informací najdete v Automatické opětovné připojení pro streamování.
Referenční dokumentace API
Vytvoření adaptéru
POST /v1/apps/{appId}/adapters/websocket/newTělo požadavku
{
"tracks": [
{
"location": "local",
"trackName": "string",
"endpoint": "wss://...",
"inputCodec": "pcm",
"mode": "buffer"
}
]
}Parametry
| Parametr | Typ | Popis |
|---|---|---|
location |
string | Povinné. Musí být "local" pro příjem zvuku |
trackName |
string | Povinné. Název nového WebRTC tracku, který chcete vytvořit |
endpoint |
string | Povinné. URL WebSocket, ze které přijímat zvuk |
inputCodec |
string | Povinné. Kodek příchozího zvuku. Aktuálně pouze "pcm" |
mode |
string | Povinné. Musí být "buffer" pro lokální režim |
Odpověď
{
"tracks": [
{
"trackName": "string",
"adapterId": "string",
"sessionId": "string", // New session ID generated
"endpoint": "string" // Echo of the requested endpoint
}
]
}Tělo požadavku
{
"tracks": [
{
"location": "remote",
"sessionId": "string",
"trackName": "string",
"endpoint": "wss://...",
"outputCodec": "pcm"
}
]
}Parametry
| Parametr | Typ | Popis |
|---|---|---|
location |
string | Povinné. Musí být "remote" pro odchozí streamování médií |
sessionId |
string | Povinné. Stávající ID relace obsahující stopu |
trackName |
string | Povinné. Název existujícího tracku, který chcete streamovat |
endpoint |
string | Povinné. URL WebSocket, na kterou odesílat média |
outputCodec |
string | Povinné. Kodek pro odchozí média. Použijte "pcm" pro zvuk, "jpeg" pro video (pouze odchozí přenos) |
Odpověď
{
"tracks": [
{
"trackName": "string",
"adapterId": "string",
"sessionId": "string", // Same as request sessionId
"endpoint": "string" // Echo of the requested endpoint
}
]
}Zavření adaptéru
POST /v1/apps/{appId}/adapters/websocket/closeTělo požadavku
{
"tracks": [
{
"adapterId": "string"
}
]
}Formáty médií
WebRTC tracky
- Kodek: Opus
- Vzorkovací frekvence: 48 kHz
- Kanály: Stereo
Binární formát WebSocket
Média využívají Protocol Buffers. Audio používá PCM payloady, video používá JPEG payloady:
- 16-bit signed little-endian PCM
- vzorkovací frekvence 48 kHz
- Stereo (prokládaný levý/pravý kanál)
- Video: payload s obrázkem JPEG (jeden snímek na zprávu)
message Packet {
uint32 sequenceNumber = 1; // Used in Stream mode only
uint32 timestamp = 2; // Used in Stream mode only
bytes payload = 5; // Media data
}Režim příjmu (buffer): Pouze payload pole se používá a obsahuje části zvukových dat.
Režim streamování (egress):
- Pro zvukové snímky:
sequenceNumber: Přírůstkový čítač paketůtimestamp: Časové razítko pro synchronizacipayload: Data jednotlivých snímků zvuku PCM
- Pro obrazové snímky (JPEG):
timestamp: Časové razítko pro synchronizacipayload: Obrazová data JPEG (jeden snímek na zprávu)- Poznámka:
sequenceNumbernemusí být u videosnímků nastaveno
Video (JPEG)
- Podporované vstupní kodeky WebRTC: H264, H265, VP8, VP9
- Výstup přes WebSocket: obrázky JPEG přibližně 1 FPS
Protokol připojení
Připojuje se k vašemu koncovému bodu WebSocket:
- Handshake při upgradu WebSocket
- Zabezpečené připojení pro
wss://URL adresy - Streamování médií začíná
Formát zprávy
Režim bufferu (ingest)
- Binární zprávy: Zvuková data PCM v částech
- Maximální velikost zprávy: 32 KB na zprávu WebSocket
- Důležité: Při rozdělování zvukových bufferů na části počítejte s režií serializace
- Odesílejte zvuk v malých a častých částech místo velkých dávek
Režim streamování (egress)
- Binární zprávy: Jednotlivé snímky s metadaty (audio nebo video)
- Zvukové snímky obsahují:
- Informace o časovém razítku
- Pořadové číslo
- Data zvukového rámce PCM
- Snímky videa obsahují:
- Informace o časovém razítku
- Obrazová data JPEG
- Poznámka: pořadové číslo nemusí být u video snímků nastaveno
- Snímky se odesílají jednotlivě tak, jak přicházejí z WebRTC tracku
- Snímky videa se odesílají přibližně s frekvencí 1 FPS
Životní cyklus připojení
- Připojuje se ke koncovému bodu WebSocket
- Streamování zvuku začíná
- Streamování videa začíná (pokud je nakonfigurováno)
- Při streamování z WebRTC do WebSocket krátce opakuje pokusy o připojení ke stejnému koncovému bodu po odpojení
- Připojení se uzavře po ukončení, při chybě nebo po vyčerpání okna pro automatické opětovné připojení
Automatické opětovné připojení pro streamování
Když použijete WebSocket adaptér v Režim streamování (egress) a odeslat tak živé audio nebo video z SFU do vlastního WebSocket endpointu (WebRTC → WebSocket), SFU se automaticky znovu připojí po krátkém odpojení nebo restartu koncového bodu.
SFU opakuje pokusy o připojení ke stejnému koncovému bodu WebSocket až po dobu 5 sekund. Žádné změny API nejsou nutné. Pokud koncový bod zůstane po uplynutí okna pro opětovné připojení nedostupný, adaptér se uzavře a vaše aplikace musí pro obnovení streamování vytvořit nový adaptér.
Ukládání médií do vyrovnávací paměti při opětovném připojení
Automatické opětovné připojení používá vyrovnávací paměť s prioritou živého přenosu po dobu, kdy je koncový bod WebSocket dočasně nedostupný:
- Vyrovnávací paměť zvuku: SFU udržuje krátkou, omezenou frontu zvukových snímků. Pokud výpadek trvá déle, než tato fronta pokryje, starší zvuk může být zahozen, aby obnovení připojení zůstalo časově omezené.
- Vyrovnávání videa: SFU si ponechává jen poslední dostupný snímek JPEG. Při opětovném připojování novější snímky nahrazují starší, takže video pokračuje téměř v reálném čase místo přehrávání zastaralých snímků.
- Způsob doručování: Ukládání do bufferu snižuje ztrátu médií při krátkých výpadcích, ale nejde o mechanismus přehrávání záznamu a nezaručuje doručení bez výpadků ani přesně jednou.
Automatické opětovné připojení se použije pouze při použití Režim streamování (egress). Opakuje pokus pouze na stejném koncovém bodu a neposkytuje přepnutí na jiné koncové body.
Ceny
Aktuálně je ve fázi beta a používání je zdarma.
Po dosažení obecné dostupnosti se bude fakturace řídit standardním ceníkem Cloudflare Realtime ve výši $0.05 za GB odchozích dat. Poplatky se účtují pouze za provoz směřující z Cloudflare k WebSocket koncovým bodům. Provoz přijímaný z WebSocket koncových bodů do Cloudflare se neúčtuje.
Využití se počítá do vaší bezplatné úrovně Cloudflare Realtime v objemu 1,000 GB.
Osvědčené postupy
Správa připojení
- Zavření již zavřené instance vrátí úspěch
- Zavřít při ukončení relace
- Při použití Režim streamování (egress), ošetřete uzavření adaptéru po 5sekundovém okno automatického opětovného připojení je vyčerpán.
- Při příjmu dat z WebSocket do WebRTC implementujte ve svém WebSocket klientovi logiku pro opětovné připojení pro případ výpadku spojení.
- Nastavte koncový bod WebSocket tak, aby byl odolný vůči restartu a dokázal přijímat opětovná připojení na stejnou adresu URL i během krátkých restartů.
Výkon
- Nasazení WebSocket endpointů blízko Cloudflare edge
- Použijte vhodné velikosti bufferu
- Sledování kvality připojení
Security
- Zabezpečení koncových bodů WebSocket ověřováním
- Použijte
wss://pro produkční prostředí - Implementujte rate limiting
Omezení
- Payloady WebSocket: PCM (zvuk) pro příjem a stream; JPEG (video) pro stream
- Stav beta verze: API se může v budoucích verzích změnit
- Podpora videa: Pouze egress (JPEG)
- Snímková frekvence videa: Přibližně 1 FPS (beta, nelze konfigurovat)
- Opětovná připojení při streamování: Při použití Režim streamování (egress), SFU automaticky opakuje pokus na stejném koncovém bodu WebSocket pouze u krátkých výpadků. Na alternativní koncové body nepřepíná.
- Obnovení s nejlepším možným úsilím: Krátká opětovná připojení snižují ztrátu médií, ale nezaručují doručení bez výpadků ani přesně jednou.
- Chování při opětovném připojení videa: Video pokračuje od posledního dostupného snímku JPEG, nikoli přehráváním starších snímků.
- Jednosměrný tok: Každá instance obsluhuje jeden směr
Zpracování chyb
| Kód chyby | Popis |
|---|---|
400 |
Neplatné parametry požadavku |
404 |
Relace nebo stopa nebyla nalezena |
503 |
Adaptér nebyl nalezen (pro operace zavření) |
Referenční implementace
- Zvuk (PCM přes WebSocket): Cloudflare Realtime Examples, ai-tts-stt ↗
- Video (JPEG egress): Cloudflare Realtime Examples, video-to-jpeg ↗
Migrace z vlastních bridgí
- Nahraďte vlastní signalizaci voláními adaptérového API
- Aktualizace endpointů WebSocket pro zpracování formátu PCM
- Implementujte správu životního cyklu adaptéru
- Odebrání vlastní konfigurace STUN/TURN
Časté dotazy
Otázka: Lze stejný adaptér použít pro obousměrný zvuk? Odpověď: Ne, každá instance je jednosměrná. Pro odesílání a příjem vytvořte samostatné adaptéry.
Otázka: Co se stane, když spojení WebSocket vypadne?
Odpověď: Při použití Režim streamování (egress), SFU automaticky opakuje pokus na stejném koncovém bodu WebSocket až po dobu 5 sekund. Pokud se koncový bod v tomto intervalu obnoví, streamování automaticky pokračuje.
Zvuk využívá krátkou omezenou frontu, která snižuje slyšitelné výpadky při krátkých přerušeních. Video pokračuje od posledního dostupného snímku JPEG, místo aby přehrávalo starší snímky.
Pokud koncový bod zůstane nedostupný i po 5sekundovém okno automatického opětovného připojení, adaptér se uzavře a je nutné jej znovu vytvořit.
Při příjmu dat z WebSocket do WebRTC by se měl váš WebSocket klient podle potřeby znovu připojit a znovu vytvořit adaptér.
Otázka: Existuje limit na počet současně běžících adaptérů? Odpověď: Limity odpovídají standardním kvótám Cloudflare Realtime. V případě specifických požadavků kontaktujte podporu.
Otázka: Lze po vytvoření adaptéru změnit formát zvuku? Odpověď: Ne, formát zvuku je pevně daný v okamžiku vytvoření. Pro jiné formáty vytvořte nový adaptér.