.m3u8 playlist or a DASH .mpd manifest) to object storage that any CDN fronts, so audience size stops being something your media plane scales for. This guide shows how to start, detach, and play back HLS and DASH egresses on a scheduled room, including the DVR window that lets late joiners rewind an in-progress stream.
This guide covers pull-or-push HLS/DASH distribution and scaling passive viewership. If you instead push a single composite feed to a third-party platform (YouTube, LinkedIn Live, a custom RTMP ingest), see the RTMP simulcast guide. The two compose: many town halls simulcast to a public platform and simultaneously serve a private CDN audience from this page’s endpoints.
HLS or DASH?
Pick HLS when Apple-native playback matters, or when you want the broadest player reach with the least client code: a plain HLS URL plays in
<video> on iOS and Safari with no player library. Pick DASH when Android-native players (ExoPlayer/Media3, Android TV fleets) dominate your audience, or when your DRM/SSAI stack consumes MPEG-DASH manifests.
When capping WebRTC participants is the right choice
A WebRTC join earns its keep for people who talk, react, or get spotlighted. If a viewer will never unmute, that seat is wasted media-plane capacity. The pattern that scales:- Cap interactive WebRTC joins at speakers, moderators, and Q&A panelists.
- Serve everyone else the HLS or DASH manifest from your CDN edge.
egress/participants endpoint (below) adds isolated per-speaker feeds on top when you need them.
Prerequisites
- A scheduled room id. The egress endpoints hang off
/api/v1/video/rooms-scheduled/{id}, so the room must be a scheduled room (the same object webinars and recurring events use), not an ad-hoc room. - A CDN target. Two options:
- Orbit-managed playback (default): omit
recording_storageand read playback URLs fromGET /livestream(below). - Your own origin: pass
recording_storagewith your S3 or GCS bucket, the same object the bring-your-own recording storage guide uses, and front it with Fastly, CloudFront, or Cloudflare Stream. Segments and playlists upload to your bucket; your CDN serves them.
- Orbit-managed playback (default): omit
- A playback policy. Manifests and segments are ordinary HTTP objects. Enforce signed URLs, token auth, or geo rules at your CDN; the egress endpoints only write the media, they do not police who reads it.
- Consent, where applicable. On tenants with two-party recording consent, a broadcast egress persists replayable media, so the start call requires
recording_consent_receipt_id, the same gate as recording and RTMP egress. - Your limits. Each egress (and each ABR
variantstier, which launches one composite egress per tier) counts against your tenant’s concurrent egress ceiling. Read it from the scheduled-rooms limits endpoint (listVideoRoomsScheduledLimitsin the video API reference) before sizing a ladder.
Start an HLS egress
Worked example: an all-hands for 5,000 passive viewers behind the corporate CDN, with an hour of DVR so people joining from the west coast can catch up.layout: "speaker"foregrounds the active presenter in the composite, the usual choice for a presentation-style room.segment_duration: 4shortens the default 6 s segments, trading a little playlist churn for a shorter time-to-first-frame at the live edge.dvr: truewithdvr_window: 3600keeps one hour of rewindable media behind the live edge. The window accepts 30 s to 4 h and defaults to 30 minutes.
EG_-prefixed id. Store it: DELETE /egress/hls/{egressId} needs it later.
Two optional blocks worth knowing:
- Low latency.
"low_latency": trueswitches the egress to LL-HLS (part-based playback) for sub-second glass-to-glass latency on compatible players;part_duration(0.2–1.0 s, default 0.5) sets the part target. Leave both off for ordinary segment-based HLS. - Adaptive bitrate.
variantstakes a ladder of tiers, each with a uniquename,width,height, andvideo_bitrate_kbps. Orbit launches one composite egress per tier and writes a master playlist, so a viewer on a weak connection steps down instead of re-buffering. Remember each tier counts against your egress limits.
variants bounds (resolution and bitrate ranges match the recording output ranges, and tier names must be unique). A 503 means broadcast media is not yet configured for your tenant.
Start a DASH egress
The DASH start call is the same shape with/egress/dash, and it accepts the same layout, segment_duration, recording_storage, consent receipt, and variants fields. DVR time-shift and LL-HLS are HLS-only; DASH players do their own timeshift buffering against the manifest, and DRM is configured at your packager/CDN, so the DASH body stays lean:
<Representation> inside the manifest’s <AdaptationSet>, so the ladder maps 1:1 to what ExoPlayer or Shaka sees. Omit variants for a single-encode manifest.
Combine WebRTC speakers with a streamed audience
The full pattern for a large interactive session:- Speakers, moderators, and panelists join over WebRTC with ordinary participant tokens (see video room access tokens).
- Start an HLS or DASH egress as above; the passive audience watches the manifest, never touching the RTC media plane.
- If you also need isolated per-speaker media for post-production, a per-speaker compliance archive, or training clips, start a participant egress:
format is mp4 (default), webm, or ogg for audio-only speakers; omit participant_identities to capture every live participant. This endpoint records each speaker as their own isolated feed in addition to the composite; it is not the audience path. The audience path is always the HLS/DASH manifest.
Detach an egress before the room ends
When you want to stop a broadcast early, hand the media off to a VOD pipeline, or tear down a ladder, delete by handle:Playback URLs and embedding
GET /api/v1/video/rooms-scheduled/{id}/livestreamreturns the room’s live-edge playback surface: the advertised HLS/DASH manifest URLs for the running egresses. Hand the manifest URL to any player, or put it behind your CDN’s signed-URL policy first.GET /api/v1/video/rooms-scheduled/{id}/livestream/dvrreturns the DVR playback surface pinned at the live edge. Add?rewind_seconds=300to get acatch_up_urlfive minutes behind the edge, or pass an absolutestart(and optionalend) as ISO 8601 timestamps.rewind_secondsandstartare mutually exclusive, and seeks are clamped to yourdvr_window.
- Passive viewers in your app or web page: any HLS/DASH-capable player pointed at the manifest URL (native
<video>on iOS and Safari, hls.js/ExoPlayer/Shaka elsewhere). Embed patterns are covered in the video embed demo. - Guests who need to be seen and heard: that is a WebRTC join, not a stream; use the WHEP guest player for low-latency guest playback with an uplink.
Limits, costs, and DVR notes
- The scheduled-rooms limits endpoint (
listVideoRoomsScheduledLimitsin the video API reference) reports your tenant’s concurrent egress ceiling. Count one egress per running HLS/DASH start, plus one pervariantstier, plus one per participant in a participant egress. dvr_windowaccepts 30 s to 4 h and defaults to 30 minutes. A deeper window keeps more segments in the playlist and costs proportionally more storage; size it to how long viewers actually arrive late, not to the full event.- DVR and LL-HLS are HLS-side features. A DASH egress gives you the manifest and lets the player and packager handle timeshift and DRM.