DASH — Dynamic Adaptive Streaming over HTTP, formally MPEG-DASH, formally ISO/IEC 23009-1 — is the open standardized streaming protocol that the streaming industry built to compete with Apple's HLS. The standardization process ran from 2009 to 2012; major adopters (Netflix, BBC, YouTube) shipped DASH at scale by 2014. By 2018, DASH was the dominant protocol everywhere except the Apple ecosystem. By 2020, the practical answer became "ship both DASH and HLS from CMAF segments." That's where it remains.
This page is the engineering reference: what DASH is, how it differs from HLS, why it lost the install-base battle to HLS despite winning the spec battle, and what running DASH in production looks like.
What DASH is
DASH is a manifest-and-segment protocol — same fundamental shape as HLS. The differences are in the manifest format, the spec rigor, and the feature set.
The key files:
- MPD (Media Presentation Description) — the XML manifest. Describes the available content, segment URLs, encryption, time alignment, and adaptive variants.
- Initialization segment — fMP4 init segment containing codec configuration. Loaded once per variant.
- Media segments — fMP4 segments containing the actual media data.
A simple MPD looks like:
<?xml version="1.0"?>
<MPD xmlns="urn:mpeg:dash:schema:mpd:2011"
type="static"
mediaPresentationDuration="PT600S"
minBufferTime="PT2S"
profiles="urn:mpeg:dash:profile:isoff-live:2011">
<Period>
<AdaptationSet mimeType="video/mp4" codecs="avc1.4d401f">
<Representation id="1" bandwidth="2000000" width="1280" height="720">
<SegmentTemplate timescale="90000"
media="$RepresentationID$/seg-$Number$.m4s"
initialization="$RepresentationID$/init.m4s"
duration="540000"
startNumber="1"/>
</Representation>
<Representation id="2" bandwidth="4000000" width="1920" height="1080">
...
</Representation>
</AdaptationSet>
</Period>
</MPD>
The structure: Period → AdaptationSet (one per content type — video/audio/subtitles) → Representation (one per ABR variant). Periods are the top-level content boundaries; you can have multiple periods in one MPD for sequential content (e.g., pre-roll ad → main content).
The segment URLs are typically templated rather than enumerated. The MPD's SegmentTemplate defines a pattern with placeholders ($RepresentationID$, $Number$, $Time$); the player computes URLs on demand. This is operationally cleaner than HLS's explicit-list manifest because the manifest size doesn't grow linearly with content length.
DASH-IF profiles
The DASH spec is permissive — it allows many shapes of content, manifest, and packaging. To make DASH practically interoperable, the DASH Industry Forum (DASH-IF) publishes guidelines and profiles that constrain the spec to a working subset.
The relevant profiles in 2026:
- DASH-IF IOP (Interoperability Points) — the broadest interop profile. Constrains MPD shape, segment format, codec usage. Most production DASH conforms.
- DVB DASH — broadcast-aligned profile used by European broadcasters.
- HbbTV — TV-platform-aligned profile for Hybrid Broadcast Broadband TV.
- DASH-IF Low-Latency — guidelines for chunked-CMAF DASH for sub-3s latency.
For consumer streaming, "DASH-IF IOP" with CMAF segments is the practical answer. Other profiles matter only if you're targeting specific broadcast or platform deployments.
CMAF and the segment-sharing story
Here's the operational win that matters in 2026: CMAF segments are interchangeable between HLS and DASH.
CMAF (Common Media Application Format, ISO/IEC 23000-19) standardizes fragmented MP4 segments in a way that both HLS modern and DASH consume. One set of segments on disk (or in object storage) → one HLS manifest + one DASH manifest → both player ecosystems work.
This eliminates the historical "one set of segments per protocol" cost. A 2018-era pipeline encoded twice — once for HLS-TS, once for DASH-fMP4. A 2026 pipeline encodes once, packages CMAF, and serves it through both manifests.
The encryption story compounds: Common Encryption (CENC) lets you encrypt the segments once with AES-CBC, then have the same segments decrypted by FairPlay (Apple, via HLS) and Widevine + PlayReady (everything else, via DASH). One encryption pass, three downstream DRM systems. This is the operational reason CMAF won.
DASH players
The major DASH client implementations:
- dash.js — DASH-IF reference player for browsers. Open source, JavaScript. The most-deployed DASH player on the web. Active development; LL-DASH support since 2020.
- Shaka Player (Google) — DASH-first player that also supports HLS. Polished, well-tested, popular for sites delivering both protocols. Used by YouTube TV among others.
- ExoPlayer (Android) — Google's Android media player. Native DASH support. The Android default for streaming apps.
- Bitmovin Player, THEOplayer, JW Player — commercial DASH (and HLS) players with vendor-specific feature sets.
Notably absent: no native DASH playback in Safari. Safari requires hls.js-equivalent JavaScript shim layer to play DASH, and even then it's awkward for live. This is the biggest reason DASH lost the install-base battle to HLS — Apple chose HLS, and Apple's choice is the streaming-industry constraint.
Multi-period DASH
One feature DASH has that HLS doesn't natively: multiple periods in a single manifest. A Period is a top-level content boundary; you can have many in sequence:
<Period start="PT0S" duration="PT15S">
<!-- pre-roll ad -->
</Period>
<Period start="PT15S" duration="PT600S">
<!-- main content -->
</Period>
<Period start="PT615S" duration="PT15S">
<!-- post-roll ad -->
</Period>
This makes ad insertion cleaner in DASH than in HLS — the player handles boundaries gracefully without timestamp resets visible to user. HLS achieves the equivalent via discontinuity tags but with more friction. For ad-supported video and live-with-ad-breaks, multi-period DASH is operationally cleaner.
Live DASH
Live DASH uses type="dynamic" MPDs. Two delivery modes:
- Number-based templating — segments named by sequence number. MPD is updated as new segments arrive.
- Time-based templating — segments named by start time. Player computes URLs from manifest timeline.
Live DASH latency at standard segment sizes (4-6s) is similar to live HLS — ~15-45s behind real-time. The protocol overhead is similar.
For low-latency, Low-Latency DASH (LL-DASH) uses chunked-CMAF segments. The encoder produces sub-segment chunks; the player fetches chunks as they're ready via chunked HTTP transfer encoding; the server holds chunks open as they're produced.
LL-DASH and LL-HLS achieve similar latency targets (2-3s) with different mechanisms. Both work in production; both require CDN support; both add operational complexity over standard live.
DRM in DASH
DASH supports multi-DRM via Common Encryption (CENC). The MPD declares the encryption protection scheme and the available DRM systems:
<ContentProtection schemeIdUri="urn:mpeg:dash:mp4protection:2011" value="cenc"/>
<ContentProtection schemeIdUri="urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed">
<!-- Widevine -->
</ContentProtection>
<ContentProtection schemeIdUri="urn:uuid:9a04f079-9840-4286-ab92-e65be0885f95">
<!-- PlayReady -->
</ContentProtection>
Same CMAF segments serve both DRMs. Players negotiate based on platform support — Chromium prefers Widevine, Edge/Windows prefers PlayReady, both fall back to the other if necessary.
DASH vs HLS in 2026 — the practical answer
| Dimension | HLS | DASH |
|---|---|---|
| Apple ecosystem | Native | Awkward (JS shim only) |
| Chromium ecosystem | Via hls.js | Native (dash.js) |
| Standardization | Informational RFC + Apple-driven | ISO/IEC standard |
| Manifest format | Text (m3u8) | XML (MPD) |
| Multi-period | Via discontinuity tags | First-class |
| Multi-DRM | FairPlay only natively; CMAF+CENC for multi | Via CENC |
| Low-latency | LL-HLS (2-3s) | LL-DASH (2-3s) |
| Tooling ecosystem | More legacy clients support TS HLS | More flexible spec |
The correct production answer for most streaming services in 2026: CMAF segments + HLS manifest + DASH manifest, served from the same origin. Most clients choose one or the other; serving both adds minimal cost beyond writing two manifests against the same segments.
DASH for the broadcast use case
DASH is also the streaming protocol of choice for several broadcast-adjacent use cases that HLS doesn't serve well:
- DVB-DASH — European broadcasters use DASH-based delivery (over both managed networks and consumer internet). The DVB DASH profile defines specific manifest constraints, codec sets, and CDN-distribution patterns. Broadcasters running converged broadcast/streaming infrastructure use this profile.
- HbbTV — Hybrid Broadcast Broadband TV combines broadcast TV signals with streaming overlays. The HbbTV spec uses DASH as the streaming component, with manifest features (multi-period, content protection, ad insertion) that HLS doesn't expose as cleanly.
- 5G broadcast — 5G Multicast / Broadcast Service (MBS) builds on DASH manifest structures for unicast fallback. The standardization work assumed DASH; HLS isn't part of the spec.
- Premium VOD platforms with sophisticated content models — multi-language, multi-period (with mid-roll ads), multi-DRM, with content variants per region. The DASH manifest format is more capable than m3u8 here, and the players that consume DASH are better tested for these complex content models.
If your roadmap includes any of these, DASH is the lead protocol with HLS as a secondary delivery for Apple devices. Otherwise, HLS lead with DASH secondary is the more common 2026 shape.
What MpegFlow does with DASH
MpegFlow's DAG runtime expresses a DASH ladder as a multi-stage workflow. The partitioner splits the workflow into parallel rendition stages on FfmpegExecutor workers, plus a downstream DASH packaging stage that emits the MPD and the CMAF segments. Each stage is persisted to job_stages with explicit dependency tracking; per-stage retry handles transient failures; sibling cancellation prevents wasted compute on dependents of a fatal failure; rendition-level partial-success reporting surfaces granular per-stage state when a subset fails. By design, the same rendition outputs feed both DASH and HLS packaging branches, so emitting both manifests does not duplicate the encode work.
Today's DASH packaging is FfmpegExecutor-driven (the FFmpeg DASH muxer). Shaka Packager and the multi-tool Docker image that would back richer DASH-specific output (advanced multi-DRM signaling, sophisticated multi-period structures, certain LL-DASH variants) are on the Phase 2D roadmap and not currently shipped runtime executors. CENC/multi-DRM packaging, multi-period MPD assembly with mid-roll structures, and ad-marker–driven manifest manipulation are operator-side work today rather than pipeline-native operations. SCTE-35 is passthrough-only at the muxing layer — the pipeline does not parse or generate SCTE-35 cues.
For LL-DASH specifically, what the pipeline emits today is constrained by the FFmpeg DASH muxer's chunking support; production-grade LL-DASH for tight latency targets is part of the same Phase 2D conversation about dedicated packagers.
The strict-broker security model handles DASH packaging like any pipeline payload — workers carry no ambient credentials; content access flows through short-lived presigned URLs scoped per stage; access is disposed on completion.
DASH manifest correctness is one of the operationally fragile parts of streaming infrastructure. MPDs that pass schema validation but break specific players in subtle ways are common. We exercise the major DASH players (dash.js, Shaka, ExoPlayer) and the DASH-IF conformance corpus against pipeline output during regression validation; the packaging path stays under heavy regression discipline even before Phase 2D ships dedicated-packager support.
If you're choosing between HLS-only, DASH-only, or both, our standing recommendation is both — same renditions, two manifests, marginal cost, broader reach. We discuss DASH-only deployments occasionally for customers with non-Apple-heavy audiences who want to skip the HLS toolchain, but it's a narrow case in 2026.