HLS uses M3U8 (text-based playlist):
#EXTM3U
#EXT-X-VERSION:6
#EXT-X-STREAM-INF:BANDWIDTH=2000000,RESOLUTION=1280x720
720p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=1000000,RESOLUTION=854x480
480p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=400000,RESOLUTION=640x360
360p.m3u8
Each variant has its own M3U8:
#EXTM3U
#EXT-X-TARGETDURATION:6
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:6.000,
segment_001.ts
#EXTINF:6.000,
segment_002.ts
#EXTINF:6.000,
segment_003.ts
DASH uses MPD (Media Presentation Description, XML):
<?xml version="1.0"?>
<MPD xmlns="urn:mpeg:dash:schema:mpd:2011"
type="static"
mediaPresentationDuration="PT5M30S"
minBufferTime="PT3S">
<Period>
<AdaptationSet mimeType="video/mp4">
<Representation id="720p" bandwidth="2000000" width="1280" height="720">
<BaseURL>720p/</BaseURL>
<SegmentTemplate timescale="1000" duration="6000" startNumber="1"
media="segment_$Number$.m4s"
initialization="init.mp4"/>
</Representation>
<Representation id="480p" bandwidth="1000000" width="854" height="480">
<BaseURL>480p/</BaseURL>
<SegmentTemplate timescale="1000" duration="6000" startNumber="1"
media="segment_$Number$.m4s"
initialization="init.mp4"/>
</Representation>
</AdaptationSet>
</Period>
</MPD>
DASH's XML is more flexible (supports advanced features like multi-period content, time-shifted DVR). HLS's M3U8 is simpler to debug.
HLS dominates because of:
- Apple compatibility: iPhone, iPad, Apple TV, AirPlay all natively support HLS only.
- CDN support: every major CDN (Cloudflare, Akamai, Fastly) optimizes for HLS by default.
- Player support: Apple's AVFoundation, native browser support (Safari, mobile Safari), HLS.js for non-Safari browsers.
- DRM integration: FairPlay (Apple's DRM) requires HLS.
For consumer streaming in 2026 (Netflix, Disney+, YouTube, Twitch, Mux, Cloudflare Stream): HLS is the primary format. DASH is sometimes generated alongside.
DASH has its niches:
- Codec flexibility: AV1 and other newer codecs are easier in DASH (HLS started AV1 support later).
- Multi-DRM: Widevine (Google), PlayReady (Microsoft), and FairPlay (Apple) all coexist in one DASH package.
- Live with DVR: time-shifted live (allowing rewind during a live stream) is more straightforward in DASH.
- Content type variety: DASH supports more diverse asset types beyond traditional video.
For broadcast professional workflows, IPTV, and B2B streaming infrastructure: DASH is preferred.
For multi-DRM content delivery, see Cloudflare Stream vs Mux vs Bunny.
| Format | Container | Codec compatibility |
|---|
| HLS (legacy) | MPEG-TS (.ts) | H.264 only |
| HLS (CMAF) | fMP4 (.m4s) | H.264, HEVC, AV1 |
| DASH | fMP4 (.m4s) | H.264, HEVC, AV1, VVC |
Modern HLS (since 2016) uses CMAF (Common Media Application Format) with fMP4 segments. The same fMP4 segments work in both HLS and DASH playlists. This makes "DASH and HLS from the same source" possible without separate encoding.
CMAF is the industry's bet on convergence. One package, multiple manifest types.
For producing HLS+DASH from the same source:
# Using FFmpeg with CMAF
ffmpeg -i source.mp4 \
-map 0:v -c:v libx264 -preset slow -crf 22 \
-map 0:v -c:v libx264 -preset slow -crf 22 \
-map 0:a -c:a aac -b:a 128k \
-filter:v:0 "scale=1280:720" \
-filter:v:1 "scale=854:480" \
-f hls \
-hls_segment_type fmp4 \
-hls_time 6 \
-hls_list_size 0 \
-hls_segment_filename "segment_%v_%03d.m4s" \
-master_pl_name "master.m3u8" \
-var_stream_map "v:0,a:0 v:1,a:0" \
master.m3u8
Then generate DASH manifest from the same fMP4 segments:
# Generate DASH manifest pointing to the same segments
shaka-packager \
--segment-template "segment_$Number$.m4s" \
--hls-master-playlist-output master.m3u8 \
--mpd-output master.mpd \
in=720p.mp4,stream=video,output=720p.mp4 \
in=480p.mp4,stream=video,output=480p.mp4
Modern encoding pipelines (Mux, Cloudflare Stream, AWS MediaConvert) generate both formats automatically from one upload. You don't separately re-encode.
For background on AV1 specifically, see AV1 Encoding.
| Platform | HLS | DASH |
|---|
| Safari (macOS/iOS) | Native | No |
| Chrome | Via HLS.js | Native |
| Firefox | Via HLS.js | Native |
| Edge | Via HLS.js | Native |
| Android (system player) | Yes | Yes |
| iOS apps (AVPlayer) | Native | No |
| Apple TV | Native | No |
| Smart TVs (LG, Samsung) | Native | Native |
| Game consoles | Yes | Yes |
For iOS-specific apps: HLS only (native). For cross-platform web: HLS via HLS.js or DASH via dash.js. For broadest reach: serve both.
For player choice context, see Cloudflare Stream vs Mux vs Bunny.
HLS DRM:
- FairPlay (Apple) is the only DRM that requires HLS
- ClearKey, AES-128 also supported
DASH DRM:
- Widevine (Google, Chrome/Android)
- PlayReady (Microsoft, Edge/Xbox)
- FairPlay (Apple, via DASH-IF format)
- ClearKey
For streaming services with content rights restrictions: multi-DRM is mandatory. CMAF + DASH allows packaging once for all DRM types. HLS-only would require separate FairPlay-encrypted versions.
For live streaming, both formats work but with different tradeoffs:
- Latency: HLS Low Latency (LL-HLS) achieves 2-3 second latency. DASH Low Latency achieves 2-3 seconds. Both are competitive in 2026.
- DVR window: DASH handles time-shifted DVR more elegantly (can mix recorded segments with live segments).
- Live to VOD transition: HLS is simpler for converting a live stream to a VOD library entry.
For live streaming at scale (Twitch, YouTube Live, Streaming sports): both formats are deployed. HLS is the consumer-facing default; DASH may be used for server-side processing.
Buffer wheel during playback: viewer's bandwidth doesn't support the picked variant. Adaptive bitrate should auto-switch; verify the player's adaptive logic isn't disabled.
Wrong audio track plays: manifest doesn't list audio tracks correctly. Verify the M3U8 EXT-X-MEDIA tags or DASH AdaptationSet entries.
Captions don't show: subtitle track not included in manifest. Add EXT-X-MEDIA TYPE=SUBTITLES to HLS or AdaptationSet contentType="text" to DASH.
Player ignores manifest: incorrect MIME type. Ensure the server returns:
application/vnd.apple.mpegurl for HLS
application/dash+xml for DASH
CDN caches stale manifest: live updates aren't propagating. Ensure CDN caches manifest files with appropriate TTL (5-30 seconds for live).
For underlying CDN setup, see Cloudflare Stream vs Mux vs Bunny.
For most consumer streaming: HLS as primary, optional DASH for non-Apple ecosystems. CMAF source allows generating both from one encode.
Apple specifically pushes HLS. Chrome and Firefox added HLS support later (via HLS.js library). Safari refuses to support DASH.
At identical encoding settings: identical efficiency. Both deliver the same segments via HTTP. The manifest format is the only structural difference.
WebRTC delivers video at sub-second latency, far better than HLS or DASH. Use case: video calls, real-time interactive content. For broadcast, HLS LL or DASH LL is sufficient.
No. Use CMAF source segments. Generate HLS and DASH manifests pointing to the same segments. Storage and bandwidth costs scale linearly with segments, not manifest types.
Yes. FairPlay-encrypted HLS is the standard for iOS/macOS native playback with DRM. This is how Apple TV+, iTunes purchases, and similar services deliver protected content.
For streaming in 2026: HLS is primary for consumer delivery (especially iOS); DASH for broadcast and multi-DRM scenarios. Use CMAF source for both formats. Modern CDN platforms handle the dual-manifest generation automatically. Our video compressor handles the source-encoding step before manifest generation.