WSMedia mux/demux
WSMedia mux позволяет одному WebSocket переносить много RTP/RTCP потоков. Каждый binary frame содержит WSM header с ssrc, port и media_type.
flowchart LR
subgraph Browser[Browser web-client]
Mux[MediaMuxSocket]
Mic[MicSession author_ssrc A]
Cam[CameraSession author_ssrc B]
Audio[Remote audio receiver_ssrc C]
Video[Remote video receiver_ssrc D]
end
subgraph Server[Server]
WSM[WSMServer]
UdpA[UDP socket for SSRC A]
UdpB[UDP socket for SSRC B]
UdpC[UDP socket for SSRC C]
UdpD[UDP socket for SSRC D]
end
Mic -->|WSM frame ssrc A| Mux
Cam -->|WSM frame ssrc B| Mux
Mux -->|WSM frame ssrc C| Audio
Mux -->|WSM frame ssrc D| Video
Mux <-->|one WSMedia WebSocket| WSM
WSM <--> UdpA
WSM <--> UdpB
WSM <--> UdpC
WSM <--> UdpD
Startup
sequenceDiagram
participant Client
participant Mux as MediaMuxSocket
participant Server as Processor
participant WSM as WSMServer
Client->>Mux: getMediaMuxSocket(url, token)
Mux->>Server: WebSocket open + connect_request(channel_type=WSMedia, access_token)
Server-->>Mux: connect_response
Client->>Mux: register(author_ssrc / receiver_ssrc)
Client->>Mux: send RTP init for receiver_ssrc
Mux->>WSM: binary WSM media frame
WSM->>WSM: create/find UDP socket by ssrc
Reconnect
stateDiagram-v2
[*] --> Connected
Connected --> Closed: WebSocket close/error
Closed --> Reconnecting: handlers still registered
Reconnecting --> Connected: connect_response
Reconnecting --> Reconnecting: retry
Connected --> ClosedPermanent: explicit close/logout
ClosedPermanent --> [*]
После reconnect:
- local sessions получают
onOpenи продолжают отправку в новый WebSocket; - remote sessions получают
onOpen, заново отправляют RTP init; - video remote sessions дополнительно отправляют ForceKeyFrame RTCP;
- device lifecycle не перезапускается.
Почему это важно
Массовое создание per-device WSS может упираться в browser limits, TLS/WebSocket handshakes, fd limits, очереди ОС и внутренние ограничения Safari/WebKit. Mux переводит проблему из “N тяжёлых WSS sessions” в “1 transport session + N lightweight SSRC routes”.