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.

One source video
Player requests one rendition per segment
The ladder is encoded and packaged before its segments are requested. During playback the player picks a rendition for each segment request from its own measurements, so the server does not transcode per viewer.

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

  1. 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.
  2. 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 when capLevelToPlayerSize or capLevelOnFPSDrop is enabled; both default to off.
  3. 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 startLevel unset 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. With startLevel at -1, hls.js by default downloads a fragment of the lowest level to estimate bandwidth before choosing.
  4. 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 BANDWIDTH can 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.

Explore Transloadit’s streaming capabilities

Sources

Turn media knowledge into a working pipeline

Connect uploads, processing, AI, storage, and delivery through one declarative API — with the encoding stack, scaling, and format churn handled for you.

Try Transloadit for free