ABR Streaming
Back to blog
Protocols

HLS vs MPEG-DASH: Choosing an Adaptive Streaming Format

A practical comparison of HLS and MPEG-DASH — segment formats, DRM, latency, device reach, and how CMAF lets you stop choosing.

ABR Streaming Team3 min read
HLSMPEG-DASHCMAFDRMProtocols

If you are shipping video to more than a couple of devices, you will eventually have to answer one question: HLS, MPEG-DASH, or both? They solve the same problem — chopping a stream into segments and describing them in a manifest so a player can adapt to changing network conditions — but they make different bets about packaging, encryption, and ecosystem. This post walks through the trade-offs the way an engineer actually hits them in production.

The two manifests

HLS (HTTP Live Streaming), originally from Apple, describes content with .m3u8 playlists. A master playlist lists the available renditions; each media playlist lists the segments for one rendition.

#EXTM3U
#EXT-X-STREAM-INF:BANDWIDTH=2400000,RESOLUTION=1280x720,CODECS="avc1.4d401f,mp4a.40.2"
720p/index.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=800000,RESOLUTION=640x360,CODECS="avc1.4d401e,mp4a.40.2"
360p/index.m3u8

MPEG-DASH (Dynamic Adaptive Streaming over HTTP) uses an XML Media Presentation Description (.mpd). It is more verbose but also more expressive: AdaptationSets group renditions, Representations describe each one, and SegmentTemplate declares how to build segment URLs from a pattern rather than enumerating every file.

You can inspect either format end to end with the HLS/DASH parser.

Segment formats: TS vs fMP4/CMAF

Historically HLS shipped MPEG-2 Transport Stream (.ts) segments, while DASH used fragmented MP4 (.m4s). Maintaining two encodes of the same content is wasteful, which is why CMAF (Common Media Application Format) matters: it is fragmented MP4 that both HLS and DASH can reference.

  • One set of media files. Encode and package once as CMAF, then emit both an .m3u8 and an .mpd that point at the same .m4s segments.
  • Shared init segments and cbcs encryption. With CMAF you can use a single encryption scheme across players.

TS is still common for legacy and some live workflows, but for greenfield projects fMP4/CMAF is the default.

DRM: the real differentiator

This is where the two formats stop being interchangeable, because DRM is tied to the platform, not just the manifest.

  • FairPlay — native on Safari, iOS, tvOS, and macOS; typically paired with HLS.
  • Widevine — native on Chrome, Android, and most smart TVs; pairs with DASH (and HLS).
  • PlayReady — native on Edge, Xbox, Windows, and many TVs; pairs with DASH.

The practical consequence: to cover the full device matrix you generally serve HLS + FairPlay to the Apple world and DASH + Widevine/PlayReady everywhere else. CMAF with cbcs encryption narrows the gap because all three DRMs can decrypt the same cbcs-encrypted CMAF segments — you still serve two manifests, but only one set of encrypted media.

Latency

Standard HLS with 6-second segments and a 3-segment buffer gives you ~18–30s of glass-to-glass latency. Both formats now have low-latency modes:

  • LL-HLS adds partial segments (parts) and blocking playlist reloads, plus EXT-X-PRELOAD-HINT, to push latency under ~3s.
  • LL-DASH uses chunked-transfer CMAF and a availabilityTimeOffset / ServiceDescription latency target to do the same.

Both rely on CMAF chunks (a fragment split into smaller moof/mdat chunks) delivered via HTTP/1.1 chunked transfer or HTTP/2.

Ecosystem and tooling

  • HLS is the only format that plays natively in Safari and on iOS without Media Source Extensions, which still matters for ad-supported and battery-sensitive contexts. hls.js covers everything else.
  • DASH has no native browser support but is well served by dash.js and Shaka Player, and it is the backbone of many OTT and broadcast workflows.

A pragmatic recommendation

  1. Encode once to CMAF. Avoid duplicate media at all costs.
  2. Serve both manifests from the same segments: HLS for Apple, DASH for the rest, with cbcs so a single encryption pass covers FairPlay, Widevine, and PlayReady.
  3. Add LL-HLS / LL-DASH only when latency is a product requirement — it adds real operational complexity (origin and CDN must support chunked delivery).

Choosing a format is less "pick a winner" and more "package once, project twice." CMAF is what makes that affordable.

Try it yourself

Reading about streaming is one thing — pull apart a real manifest, play a stream, and measure its QoE with the toolkit.

Browse all tools