LevelChatDocs
Docs
Live streaming

Live streaming

Publish to one viewer or fifty thousand with the same room.

Live streaming in LevelChat is a room with type: "broadcast". The publisher experience is identical to a meeting; the viewer side scales horizontally via cascade SFU and falls back to LL-HLS / CMAF at the long tail.

When to use broadcast vs. hybrid

  • broadcast — fixed number of publishers (1–10) and a viewer count that can grow into the thousands. Viewers can't promote to publishers without a new token.
  • hybrid — start as a meeting, promote on demand:
TypeScript
await room.promote('broadcast', {
  capacity: 50_000,
  region: 'eu',
  distribution: 'av1-svc', // or "vp9-svc" for broader hardware support
});

Distribution tiers

LevelChat picks the right transport for each viewer based on count and latency target:

Viewer countTransportLatency
1 – 100direct WebRTC SFU80 ms
100 – 5 000cascade SFU mesh250 ms
5 000 – 50 000edge fanout + LL-HLS1.5 s
50 000+LL-HLS / CMAF4 s

You don't choose this — the SFU does. You can pin a minimum transport via the room config:

TypeScript
config: {
  distribution_floor: 'webrtc';
} // never fall back beyond direct WebRTC

WHIP from OBS

OBS Studio 30+ ships native WHIP. Point it at:

text
Server:    https://api.levelchat.io/v1/whip/<roomId>
Bearer:    <a publisher room JWT>

…and you're publishing in seconds, no SDK required.

Recording while streaming

TypeScript
await room.record({
  compose: 'speaker', // tracks | grid | speaker
  codec: 'av1-pro',
  outputs: ['mp4_av1', 'hls'],
  webhook: 'https://your-app.example/lc-rec',
});

The recording runs out-of-band on a recorder-svc worker — it does not add latency to the live distribution.

Quality + cost

  • AV1-SVC publish gives you 30–40% better viewer-side bitrate at the same quality vs. VP9.
  • LevelChat bills viewers as viewer_hours, not participant-minutes — see Pricing for the breakdown.