VideoBB
Upload Premium Sign in

HLS vs DASH

Two protocols that solve the same problem in almost the same way. Where they still diverge: device support, DRM, low latency, manifests and the CMAF packaging that lets one set of segments serve both.

HLS and MPEG-DASH both send video as short files over HTTP, and both let the player switch quality. HLS plays natively on Apple devices and is the safe default. DASH is an open ISO standard with a more flexible XML manifest. With CMAF segments, most platforms can serve both from one encode.

Abstract illustration of two parallel paths of light merging into a single shared track of tiles

For most of the 2010s, choosing between HLS and MPEG-DASH was a real fork in the road. Each needed its own segments, packaging and storage. Picking one meant leaving out some devices or doubling costs. That fork has narrowed to a footpath. A shared segment format now lets one encode feed both. The choice is now about manifests, DRM and latency, not about compatibility.

This comparison explains where the two protocols came from and how their manifests differ. It covers which devices play each one natively. It also covers encryption, low latency and what the Common Media Application Format changed. If segmented streaming is new to you, start with the HLS guide. The video streaming hub gives the wider picture, from transcoding to delivery.

Origins

HLS was created by Apple for the iPhone in 2009, documented for years as an IETF Internet-Draft, and published as RFC 8216 in 2017. It began with MPEG-2 transport stream segments because that was a format Apple's hardware already decoded. MPEG-DASH (Dynamic Adaptive Streaming over HTTP) became ISO/IEC 23009-1 in 2012. MPEG wrote it with help from a wide industry group. It was meant as an alternative that works with any codec and any container, and that no single vendor controlled. The DASH Industry Forum publishes the guidelines that make real deployments work together.

The two designs share the same shape. There is a top-level description of the renditions, a list of segments for each rendition, and segments served as plain files. Both switch quality the same way, as the adaptive bitrate guide explains. They differ in the details of that description and in who supports what.

Side by side

AspectHLSMPEG-DASH
SpecificationRFC 8216 and the rfc8216bis draft (Apple)ISO/IEC 23009-1 (MPEG)
Top-level descriptionMultivariant playlist, extended M3U textMedia Presentation Description (MPD), XML
Segment formatsMPEG-2 TS, fragmented MP4, packed audio, WebVTTFragmented MP4 (ISO BMFF) or WebM; codec-agnostic
Segment addressingExplicit list in the media playlistExplicit list, or a SegmentTemplate with numbering or timing
Native browser playbackSafari on macOS and iOSNone; always via Media Source Extensions
Native device playbackApple TV, iOS, most smart TVs and consolesAndroid ExoPlayer, most smart TVs, consoles
Encryption and DRMAES-128, SAMPLE-AES, FairPlayCommon Encryption (CENC) with Widevine, PlayReady and others
Ad and content boundariesEXT-X-DISCONTINUITYMultiple Periods in the MPD
Low latencyLow-Latency HLS: partial segments and blocking playlist reloadLL-DASH: chunked CMAF with chunked transfer encoding
SubtitlesWebVTT segments; IMSC in fMP4WebVTT, TTML and IMSC

Manifests: text playlist versus XML

An HLS media playlist lists every segment by URL with its duration. That makes it simple to read and simple to write. But it gets long for a multi-hour video with short segments. The DASH MPD can do the same. Or it can use a SegmentTemplate, which describes segment URLs as a pattern with a number or timestamp. Then a single line covers thousands of segments. The MPD also carries explicit Periods, which is how DASH marks a change of content such as an inserted advert. HLS uses a discontinuity tag within a single playlist.

For live streams the two behave alike: the player re-fetches the playlist or MPD to learn about new segments. DASH also lets the MPD declare availability times. A player can then work out segment URLs without re-fetching. That is one reason DASH reached low latency slightly earlier than HLS did.

Device support: the deciding factor for years

The practical reason HLS became the default was iPhone. Safari on iOS did not support Media Source Extensions, so no JavaScript player could feed DASH segments to the decoder. Native HLS was the only way to stream to the most valuable mobile audience. Everywhere else, DASH and HLS were equally reachable through MSE-based players such as dash.js, Shaka Player and hls.js. Apple later added a Managed Media Source API to iOS Safari, which narrows the gap, but HLS remains the path that needs no library on Apple hardware.

Android and most smart TV platforms play both. Games consoles and set-top boxes vary. The safe rule of thumb: a platform that offers only one protocol offers HLS. That is why VideoBB delivers its renditions as HLS with automatic quality switching. It is also why the embeddable player works in any browser without a plugin.

When each protocol is the natural choice

HLS fits when

  • Apple devices are a significant share of the audience and you want native playback.
  • You want one protocol that reaches every screen without a JavaScript player on some of them.
  • DRM, if needed, is FairPlay on Apple platforms.
  • The operations team is more comfortable with text playlists than XML manifests.

DASH fits when

  • You need Widevine or PlayReady DRM on Android, Chrome or Edge with Common Encryption.
  • Multi-period presentations, such as stitched programmes with distinct ad breaks, are central.
  • You want a vendor-neutral ISO standard and codec-agnostic packaging.
  • Your player is already dash.js, Shaka or ExoPlayer and the audience is not Apple-heavy.

CMAF: one set of segments for both

The Common Media Application Format, ISO/IEC 23000-19, was published in 2018. It defines a strict form of fragmented MP4 segment that both HLS and DASH can point to. A packager writes the segments once. Then it writes an m3u8 playlist and an MPD that point at the same files. If the words container and codec blur together here, the container vs codec explainer separates them. The last obstacle was encryption. FairPlay required the cbcs encryption mode, while Widevine and PlayReady used cenc, so encrypted segments had to be stored twice. Both now support cbcs on current devices, which lets a single encrypted set serve every DRM. Unencrypted content never had a duplication problem. CMAF simply made the shared packaging official.

Low latency, briefly

Both protocols reduce live latency by letting the player fetch a segment before it is complete.

  • LL-DASH relies on chunked CMAF segments and HTTP chunked transfer encoding. The packager streams each segment's chunks as they are encoded, and the player starts decoding before the segment closes.
  • Low-Latency HLS came from Apple in 2019 and is now part of the rfc8216bis draft. It adds partial segments listed in the playlist and blocking playlist requests that wait for the next part. It also adds rendition reports for fast switching.
  • Both usually reach a few seconds of latency, against tens of seconds for classic segmented delivery. Both need packager, CDN and player support end to end.
  • For on-demand video, none of this applies. The CDN guide covers what matters for cached playback instead.

Frequently asked questions

Which is better for a small site embedding video?

Neither, in the sense that a hosting platform makes the choice for you. If you self-host, HLS is the practical answer. It plays natively on iPhones and through hls.js everywhere else, so one package covers every viewer. DASH only becomes necessary when you need Widevine or PlayReady DRM or complex multi-period stitching. Small sites rarely do.

Can the same segments really serve HLS and DASH?

Yes, when they are CMAF-conformant fragmented MP4. The packager writes the segments once and produces both an m3u8 playlist and an MPD pointing at them. MPEG-2 transport stream segments cannot be shared, since DASH does not use them. Encrypted content needs the cbcs mode for the shared set to work with FairPlay as well as Widevine and PlayReady on current devices.

Is DASH faster or lower latency than HLS?

Not inherently. Classic HLS and classic DASH have similar latency, dominated by segment length and the number of segments a player buffers before starting. Their low-latency extensions use different methods: chunked transfer for DASH and partial segments for HLS. Both reach a few seconds of latency in practice when the packager, CDN and player all support them.

Does VideoBB use HLS or DASH?

HLS. Every upload is transcoded into HLS renditions from 144p to 1080p. When the source is large enough, 1440p and 2160p are made too, for Premium members to watch. The embeddable player switches between them automatically. HLS was chosen because it plays natively on Apple devices and through Media Source Extensions in every other browser. So one package reaches every viewer with no extra setup.

Sources

hlsdashmpeg-dashcmafstreaming protocolsdrm

Related guides