ABR (Adaptive Bitrate) (ABR)

Protocol

A streaming technique that dynamically switches between video quality levels based on the viewer's network conditions and device capabilities. Used by HLS and DASH to deliver smooth playback.

Updated Mar 17, 2026

Full Explanation

Adaptive Bitrate streaming solves a fundamental problem: not everyone has the same bandwidth. Instead of picking one quality level and hoping for the best, ABR encodes the video at multiple bitrates and resolutions, then lets the player switch between them in real time based on network conditions.

Here's how it works. The encoder produces multiple renditions of the same content, for example 360p at 500 Kbps, 720p at 2 Mbps, and 1080p at 5 Mbps. Each rendition is chopped into small segments (typically 2 to 6 seconds). A manifest file (M3U8 for HLS, MPD for DASH) lists all available quality levels and their segment URLs.

The player downloads a segment, measures how long it took, and estimates available bandwidth. If bandwidth is high, it requests the next segment at a higher quality. If the buffer is running low or bandwidth drops, it switches down. This happens seamlessly because each segment is independently decodable.

Two main ABR algorithm approaches exist. Throughput-based algorithms measure download speed of recent segments and pick the highest quality that fits. Buffer-based algorithms (like BBA from Netflix's research) focus on the playback buffer level: when the buffer is full, move up in quality; when it's draining, move down. Most modern players use hybrid approaches combining both signals.

CDNs play a critical role in ABR delivery. Each quality level's segments are cached independently on the edge. Popular renditions (720p, 1080p) typically have high cache hit rates, while rarely requested ones (like 4K) might have lower hit rates. Smart CDN configurations pre-warm popular renditions and use origin shields to consolidate requests for less popular ones.

Segment size affects both latency and ABR responsiveness. Shorter segments (2 seconds) allow faster quality switching and lower latency but create more HTTP requests and slightly less compression efficiency. Longer segments (6 seconds) compress better but delay quality adaptation. Low-latency HLS and LL-DASH use partial segments (CMAF chunks) to get latency down to 2 to 3 seconds while keeping ABR working.

Examples

# HLS master playlist (M3U8) showing ABR variants
#EXTM3U
#EXT-X-STREAM-INF:BANDWIDTH=500000,RESOLUTION=640x360
360p/playlist.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=2000000,RESOLUTION=1280x720
720p/playlist.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=5000000,RESOLUTION=1920x1080
1080p/playlist.m3u8

# FFmpeg command to create HLS ABR variants
ffmpeg -i input.mp4 \
  -map 0:v -map 0:a -map 0:v -map 0:a \
  -b:v:0 500k -s:v:0 640x360 \
  -b:v:1 2000k -s:v:1 1280x720 \
  -f hls -hls_time 4 \
  -master_pl_name master.m3u8 \
  -var_stream_map "v:0,a:0 v:1,a:1" \
  stream_%v/playlist.m3u8

# Cache-Control for HLS segments (cache aggressively)
# Segments are immutable once created
Cache-Control: public, max-age=31536000, immutable

# Cache-Control for live manifest (short TTL)
Cache-Control: public, max-age=1

Frequently Asked Questions

A streaming technique that dynamically switches between video quality levels based on the viewer's network conditions and device capabilities. Used by HLS and DASH to deliver smooth playback.

# HLS master playlist (M3U8) showing ABR variants
#EXTM3U
#EXT-X-STREAM-INF:BANDWIDTH=500000,RESOLUTION=640x360
360p/playlist.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=2000000,RESOLUTION=1280x720
720p/playlist.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=5000000,RESOLUTION=1920x1080
1080p/playlist.m3u8

# FFmpeg command to create HLS ABR variants
ffmpeg -i input.mp4 \
  -map 0:v -map 0:a -map 0:v -map 0:a \
  -b:v:0 500k -s:v:0 640x360 \
  -b:v:1 2000k -s:v:1 1280x720 \
  -f hls -hls_time 4 \
  -master_pl_name master.m3u8 \
  -var_stream_map "v:0,a:0 v:1,a:1" \
  stream_%v/playlist.m3u8

# Cache-Control for HLS segments (cache aggressively)
# Segments are immutable once created
Cache-Control: public, max-age=31536000, immutable

# Cache-Control for live manifest (short TTL)
Cache-Control: public, max-age=1

Related CDN concepts include: