Hakari

What is MPEG-DASH?

MPEG-DASH (Dynamic Adaptive Streaming over HTTP) is an international standard (ISO/IEC 23009-1) for adaptive video streaming. Like HLS, DASH fragments video into short segments and lists them in a manifest — the client picks renditions and pulls segments over plain HTTP.

DASH and HLS solve the same problem in very similar ways. The two meaningful differences are the manifest format and native platform support.

How DASH differs from HLS

| | HLS | DASH | | --- | --- | --- | | Origin | Apple | ISO/MPEG working group | | Manifest | .m3u8 (text) | .mpd (XML) | | Manifest verbosity | Small, readable | Large, template-driven | | Native Safari / iOS | Yes | No (needs a library — Shaka, dash.js) | | DRM | FairPlay + Widevine + PlayReady via CMAF | Same | | Codec flexibility | Good | Slightly richer in theory | | Standard behavior | Apple-defined | Open committee-defined |

Both are HTTP-cacheable, both use fMP4 segments (via CMAF), both do adaptive bitrate. Pick one based on which platforms you need to hit natively.

The MPD

An MPD (Media Presentation Description) is XML. It describes:

  • Periods — time ranges within the presentation.
  • AdaptationSets — one per media type (video, audio, subtitles).
  • Representations — the concrete renditions inside each AdaptationSet (720p @ 3 Mbps, 480p @ 1.5 Mbps, etc.).
  • SegmentTemplate — a URL template players interpolate to find segments.

A tiny example:

<MPD xmlns="urn:mpeg:dash:schema:mpd:2011" type="static" mediaPresentationDuration="PT1M0S" minBufferTime="PT2S">
  <Period>
    <AdaptationSet mimeType="video/mp4" codecs="avc1.42c01f">
      <Representation id="720p" bandwidth="3000000" width="1280" height="720">
        <SegmentTemplate media="seg_$RepresentationID$_$Number$.m4s" initialization="init_$RepresentationID$.m4s" startNumber="1" duration="6"/>
      </Representation>
      <Representation id="480p" bandwidth="1500000" width="854" height="480">
        <SegmentTemplate media="seg_$RepresentationID$_$Number$.m4s" initialization="init_$RepresentationID$.m4s" startNumber="1" duration="6"/>
      </Representation>
    </AdaptationSet>
  </Period>
</MPD>

The $RepresentationID$ and $Number$ placeholders get substituted by the client — seg_720p_1.m4s, seg_720p_2.m4s, etc.

Low-latency DASH

DASH has a low-latency profile (LL-DASH) that mirrors LLHLS:

  • CMAF chunks — subdivide segments into smaller chunks flushed as they're encoded.
  • Chunked transfer encoding — HTTP delivers the segment in pieces as it's being written.
  • <Latency> element — the MPD declares the target end-to-end latency.

LL-DASH is less widely deployed than LLHLS in the browser world — you generally need dash.js with specific flags. In the broadcast ecosystem it's more common.

DASH on Hakari

Choose dash as the output format when creating a VOD:

{
  "outputFormat": "dash",
  "videoCodec": "h264",
  "ladder": [...]
}

The resulting playback URL ends in .mpd:

https://stream.hakari.cloud/vod/<vodId>/manifest.mpd

Feed it into dash.js, Shaka Player, or any DASH-capable player. All edge-level features — long-lived per-object cache, CORS, signed playback — work identically to the HLS pipeline.

For live streams, HLS/LLHLS is the default output. DASH live is available on enterprise plans — reach out if you need it.

When to pick DASH over HLS

  • Your existing toolchain (player, packager, DRM vendor) is DASH-native.
  • You're distributing to platforms that specifically want MPD (smart TVs, certain set-top stacks).
  • You need fine-grained control over manifest structure that M3U8 can't express easily (long multi-period presentations, complex audio configs).

For a typical "embed a video in a website" use case, HLS is the safer default — native Safari + iOS support matters, and dash.js adds a player dependency HLS doesn't require.

  • HLS — the more common alternative.
  • LLHLS — low-latency HLS.
  • CMAF / fMP4 — the container format both HLS and DASH use.
  • VOD library — choose hls or dash at upload time.