HLS vs DASH
Both are HTTP-based adaptive streaming protocols. They solve the same problem (segment-based delivery with bitrate adaptation) with slightly different designs.
HLS (HTTP Live Streaming)
Developed by Apple in 2009. Standardized as RFC 8216.
- Manifest:
.m3u8plaintext playlist - Segments: historically
.ts(MPEG-TS), now.m4s(fragmented MP4) - Native browser support: Safari, all iOS, all macOS
- Library support: HLS.js for Chrome/Firefox/Edge
- Encryption: AES-128 segment-level (most common), SAMPLE-AES for FairPlay
- Codec flexibility: H.264 + HEVC + AV1 with fragmented MP4
DASH (Dynamic Adaptive Streaming over HTTP)
Standardized by MPEG in 2012.
- Manifest:
.mpdXML - Segments:
.m4s(fragmented MP4) - Native browser support: None (requires Media Source Extensions + JS library)
- Library support: Shaka Player, dash.js
- Encryption: Common Encryption (CENC) supporting Widevine + PlayReady simultaneously
- Codec flexibility: Any codec MP4 can carry
Why HLS won the market
Native Safari support without a JS library is the practical winner. Most platforms ship HLS first, DASH as a secondary option.
When DASH still matters
- Studio DRM distributing the same content with Widevine + PlayReady simultaneously — DASH+CENC is the standard pattern.
- Mature OTT platforms that already shipped DASH years ago and have toolchains around it.
For most modern projects, HLS is the simpler default. AVCaption ships HLS only.