What is Adaptive Bitrate Streaming?
Adaptive bitrate streaming offers several encoded renditions of the same content. The player switches among them according to bandwidth, buffer health, and device capability during playback.
How Adaptive Bitrate Streaming works
Adaptive streaming divides time-aligned renditions into addressable media segments and describes them in a manifest: a playlist in HLS, an XML document called the MPD in MPEG-DASH. The player chooses a rendition for upcoming segment requests from signals such as measured throughput and buffered media, so switching is a client-side delivery decision rather than a midstream server transcode. Both protocols can carry fragmented MP4 segments, which is what lets CMAF packaging serve one set of media files under both manifests.
Key facts
- Clean switching is decided at encode and packaging time. RFC 8216 requires matching content in every HLS variant to carry matching timestamps, and Apple’s authoring specification requires each video segment to start with an IDR frame and recommends segment boundaries at the same points in time across variants. The DASH-IF interoperability profile likewise starts each segment with an IDR-like access point and aligns segment boundaries within an Adaptation Set.
- The switching algorithm belongs to the player, not the protocol: RFC 8216 puts it out of scope, so one stream can behave differently across players. In hls.js, for example, the default settings demand a larger bandwidth margin for switching up (
abrBandWidthUpFactor) than for holding or dropping a level (abrBandWidthFactor), and limiting quality to the video element’s size or reacting to dropped frames happens only whencapLevelToPlayerSizeorcapLevelOnFPSDropis enabled; both default to off. - Startup quality depends on playlist order and player settings. Apple’s specification treats the first variant listed in the multivariant playlist within each group of variants with compatible audio as that group’s default. In hls.js, leaving
startLevelunset does not pin playback to the first listed level, although parts of its API documentation say it does: the v1.6.13 source picks the starting level from a bandwidth estimate, which the first listed variant’s bitrate can raise, so playlist order influences the start without fixing it. WithstartLevelat-1, hls.js by default downloads a fragment of the lowest level to estimate bandwidth before choosing. - Ladder spacing is a content decision, and declared rates must be accurate. Apple presents its bitrate tables as starting targets to evaluate against your own content, and Netflix’s per-title work found that one fixed ladder spends more bits than simple titles need while leaving artifacts in complex ones; its stated goal is adjacent rungs about one just-noticeable difference apart, so switches stay smooth with the fewest renditions. In HLS, RFC 8216 warns that an inaccurate
BANDWIDTHcan cause stalls or stop a variant from playing.
When Adaptive Bitrate Streaming matters
Provide a bitrate ladder when changing network conditions would otherwise cause stalls. Poorly spaced renditions can waste storage or force visible quality drops without meaningfully improving continuity.
How Transloadit helps with Adaptive Bitrate Streaming
Transloadit’s /video/adaptive Robot packages encoded renditions into HLS, MPEG-DASH, or CMAF output and generates the playlist and manifest files; with technique set to cmaf, the DASH and HLS manifests reference the same fMP4 segments. The renditions normally come from /video/encode Steps that use the hls/ or dash/ presets and are bundled into one /video/adaptive Step.
Transloadit prepares the files; choosing a rendition during playback is done by the player you use. The Robot documentation also describes how to force matching keyframes in every /video/encode Step so segments align across renditions, the CORS headers to configure on your file server (needed when the player loads the files from another origin), and the relative_path metadata to use when storing segments so the playlists resolve.
Sources
- RFC 8216: HTTP Live Streaming (sections 4.3.4.2 BANDWIDTH, 6.2.4 variant streams, 6.3.1 client switching)
- Apple: HLS Authoring Specification for Apple Devices (items 1.25, 1.32, 7.4, and 8.22; the page needs JavaScript to render)
- DASH-IF Interoperability Points for MPEG-DASH, version 4.3 (section 3.1: segment alignment and seamless switching)
- DASH-IF implementation guidelines: the MPD and the DASH timing model
- hls.js API documentation: ABR, start level, and level capping settings
- hls.js v1.6.13 source: level-controller.ts (start level and initial bandwidth estimate)
- hls.js v1.6.13 source: abr-controller.ts (firstAutoLevel selection)
- Spiteri, Urgaonkar, Sitaraman: BOLA, Near-Optimal Bitrate Adaptation for Online Videos
- Netflix Technology Blog: Per-Title Encode Optimization (archived copy)