Skip to content

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”.