TECHNICAL

HLS vs DASH in 2026: Which Streaming Protocol Should Your OTT App Use?

April 28, 2026 11 min read OTTEngine Team

HLS or DASH? In 2026 most OTT publishers ship both, but the decision still matters for engineering complexity, ad insertion, low-latency support, and DRM. Here is a clear comparison and a recommendation for each device target.

The 30-second summary

  • HLS (HTTP Live Streaming) - Apple's protocol. Universal device support, .m3u8 manifest, MPEG-TS or fragmented MP4 segments. Required for FairPlay DRM.
  • MPEG-DASH (Dynamic Adaptive Streaming over HTTP) - Open ISO standard. .mpd manifest, fMP4 segments. Required for PlayReady on some devices and widely used outside Apple's ecosystem.
  • CMAF (Common Media Application Format) - Not a protocol, a container format. Lets one set of fMP4 segments be referenced by both HLS and DASH manifests. This is what you should generate by default in 2026.

HLS vs DASH vs CMAF at a glance

The table below compares the two protocols - and the CMAF container that increasingly underpins both - across the dimensions that matter when you choose a packaging strategy.

DimensionHLSMPEG-DASHCMAF
What it isStreaming protocolStreaming protocolContainer / packaging format
Created byApple (RFC 8216)MPEG / ISO (23009-1)MPEG / ISO (23000-19)
Manifest.m3u8 playlist.mpd XMLNone - reused by both manifests
Segment containerMPEG-TS or fMP4fMP4fMP4 (.m4s / CMAF chunks)
Device reachUniversal; mandatory on AppleEverything except Apple Safari / iOSBoth, via either manifest
DRMFairPlay, WidevineWidevine, PlayReadyAll three via CENC (cbcs)
Standard latency6–30 s2–10 sInherits the host protocol
Low-latency modeLL-HLS (2–5 s)LL-DASH (2–5 s)CMAF chunks enable both
SSAI / ad insertionExcellentGoodDepends on the manifest used
Best forApple, ad-supported, clear streamsAndroid, Smart TVs, Roku, browsersPackage-once, multi-DRM stacks

A closer look at each format

HLS - HTTP Live Streaming

HLS uses a two-tier playlist. A multivariant (master) playlist lists the available renditions; the player picks one and loads its media playlist, which lists the actual segments. Segments are MPEG-TS (.ts) on legacy streams or fragmented MP4 (.m4s) on modern CMAF-based HLS.

A master playlist (master.m3u8) advertising two renditions:

#EXTM3U
#EXT-X-VERSION:7
#EXT-X-STREAM-INF:BANDWIDTH=2000000,RESOLUTION=1280x720,CODECS="avc1.64001f,mp4a.40.2"
720p/playlist.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=5000000,RESOLUTION=1920x1080,CODECS="avc1.640028,mp4a.40.2"
1080p/playlist.m3u8

The media playlist it points to (1080p/playlist.m3u8) lists the segments. #EXT-X-MAP names the shared init segment; each #EXTINF line is one media segment:

#EXTM3U
#EXT-X-VERSION:7
#EXT-X-TARGETDURATION:6
#EXT-X-MAP:URI="init.mp4"
#EXTINF:6.000,
segment-00001.m4s
#EXTINF:6.000,
segment-00002.m4s
#EXT-X-ENDLIST

MPEG-DASH - Dynamic Adaptive Streaming over HTTP

DASH describes the whole stream in a single XML manifest, the .mpd. Its hierarchy is MPD → Period → AdaptationSet → Representation → SegmentTemplate: a period is a time span, an adaptation set groups one media type (video, audio, captions), each representation is one bitrate, and the segment template is the URL pattern for the init and media segments.

A trimmed, video-only .mpd with two representations:

<?xml version="1.0" encoding="UTF-8"?>
<MPD xmlns="urn:mpeg:dash:schema:mpd:2011" type="static"
     minBufferTime="PT2S" mediaPresentationDuration="PT10M0S"
     profiles="urn:mpeg:dash:profile:isoff-live:2011">
  <Period>
    <AdaptationSet mimeType="video/mp4" segmentAlignment="true">
      <Representation id="720p" bandwidth="2000000" width="1280" height="720" codecs="avc1.64001f">
        <SegmentTemplate timescale="1000" duration="6000" startNumber="1"
          initialization="720p/init.mp4" media="720p/segment-$Number$.m4s" />
      </Representation>
      <Representation id="1080p" bandwidth="5000000" width="1920" height="1080" codecs="avc1.640028">
        <SegmentTemplate timescale="1000" duration="6000" startNumber="1"
          initialization="1080p/init.mp4" media="1080p/segment-$Number$.m4s" />
      </Representation>
    </AdaptationSet>
  </Period>
</MPD>

CMAF - Common Media Application Format

CMAF is not a manifest or a protocol - it standardizes the media itself: one fragmented-MP4 structure (an init.mp4 plus a run of .m4s segments, optionally split into smaller CMAF chunks for low latency). Because the structure is identical, the HLS media playlist and the DASH MPD above can point at the same physical files:

/video/1080p/
  init.mp4            ← #EXT-X-MAP (HLS)   +  initialization= (DASH)
  segment-00001.m4s   ← #EXTINF (HLS)      +  media=…$Number$ (DASH)
  segment-00002.m4s
  …

Encrypt those segments once with CENC using the cbcs scheme and the same files play under FairPlay, Widevine, and PlayReady - you package and encrypt one time, then emit an .m3u8 or .mpd per device. That "package once, serve both" workflow is exactly why CMAF is the default in 2026.

Want to see this on a real stream? Paste an .m3u8 or .mpd into our free Manifest Inspector to break down its renditions, codecs, and segments.

Device support reality

If you only ship to iOS, tvOS, and Safari, HLS is mandatory and DASH is unsupported. If you ship to Android, Fire TV, Chromecast, Smart TVs, and browsers other than Safari, DASH is supported and often preferred.

Roku supports both HLS and DASH. For clear or AES-128 content, most publishers default to HLS because the SceneGraph video node has the most mature HLS handling. For DRM-protected content, though, Roku now requires DASH with Widevine - its Widevine support does not work over HLS.

Latency: HLS used to lose, now it does not

Standard HLS targets 30+ seconds of end-to-end latency due to its 6–10 second segment durations. DASH historically did better with 2–4 second segments.

Low-Latency HLS (LL-HLS) and Low-Latency DASH (LL-DASH with CMAF chunks) now both achieve 2–5 second glass-to-glass latency. For live news, sports, or interactive content, both are viable; pick based on device support, not latency.

DRM compatibility

  • HLS + FairPlay - Apple devices only, mandatory there.
  • HLS + Widevine - supported on Android via ExoPlayer with hls extension.
  • DASH + Widevine - universal Android/web pairing, and the path Roku now requires as it sunsets PlayReady in North America (Widevine on Roku works only over DASH).
  • DASH + PlayReady - still common on Samsung and LG Smart TVs.

CMAF with CBCS encryption lets a single packaged file work across all five combinations above, with the manifest format chosen per-device. This is why CMAF wins in modern stacks.

Ad insertion compatibility

SSAI vendors generally support HLS far better than DASH. Most stitching is done at the .ts or fMP4 segment level inside an HLS playlist. If your priority is ad-supported delivery, default to HLS unless you have a strong DASH-only target.

Our default recommendation

Package once in CMAF, generate both HLS and DASH manifests, and serve per-device:

  1. iOS / tvOS / Safari → HLS + FairPlay
  2. Android / Fire TV / Chrome → DASH + Widevine
  3. Roku → DASH + Widevine (Roku is retiring PlayReady; its Widevine support works only over DASH)
  4. Smart TVs → DASH + Widevine or PlayReady (Samsung Tizen, LG webOS)

The bottom line

Stop treating HLS and DASH as either/or - package once in CMAF and serve both. OTTEngine generates CMAF packaging with HLS, DASH, and multi-DRM manifests automatically. Book a demo to see your content packaged in minutes.

Frequently Asked Questions

Which is better, HLS or DASH?

Neither is universally better. HLS is mandatory on Apple platforms; DASH is more efficient on Android and Smart TVs. Most modern OTT services package once in CMAF and serve both.

Does YouTube use HLS or DASH?

YouTube primarily uses DASH for adaptive streaming, with HLS as a fallback for older Apple devices.

Can I use one set of files for both HLS and DASH?

Yes - Common Media Application Format (CMAF) lets a single set of fragmented MP4 segments be referenced by both HLS and DASH manifests.

How low can streaming latency get in 2026?

Low-Latency HLS and Low-Latency DASH both achieve 2–5 seconds end-to-end. WebRTC can go below 1 second but is rarely used for traditional OTT.

Do I need DASH for Roku?

For unprotected content, no - Roku's HLS handling is the most mature, so clear channels usually use HLS. But Widevine-protected content does need DASH on Roku: its Widevine support does not work over HLS, and PlayReady is being retired in North America.

What is an .m3u8 file?

It is an HLS playlist. A multivariant (master) .m3u8 lists the available bitrate renditions; each rendition points to a media .m3u8 that lists the individual segments to download in order.

What is an .mpd manifest?

The .mpd (Media Presentation Description) is DASH's single XML manifest. It describes the stream as Periods → AdaptationSets → Representations, with a SegmentTemplate giving the URL pattern for each rendition's init and media segments.

What is CMAF, and is it the same as fMP4?

CMAF is a standardized profile of fragmented MP4. All CMAF segments are fMP4, but CMAF pins down a common structure (and chunking) so the exact same segment files can be listed by both an HLS playlist and a DASH manifest - letting you package once instead of twice.

Does HLS still use MPEG-TS segments?

It can, and legacy streams still do, but modern HLS uses CMAF fMP4 (.m4s) segments. Using fMP4 is what lets the same media work under DASH too; MPEG-TS segments are HLS-only.

✍️
OTTEngine Team
Streaming technology experts helping publishers launch on Roku, Fire TV, and Apple TV.

Ready to launch your streaming channel?

Book a 30-minute demo with our team - we will get your build started the same day.

Book a Demo

Related articles