HLS 与 MPEG-DASH:自适应码率流协议

FreeGuideOnline 最新 2026-07-03

main.m3u8 → 包含: #EXT-X-STREAM-INF:BANDWIDTH=800000,RESOLUTION=640x360 lo_800k.m3u8 #EXT-X-STREAM-INF:BANDWIDTH=2000000,RESOLUTION=1280x720 med_2000k.m3u8 ...

lo_800k.m3u8 → 包含: #EXTINF:6, segment_0_lo.ts #EXTINF:6, segment_1_lo.ts ...


#### 2.4 主要特点与版本演进

-   **编码格式支持**:早期的 HLS 要求必须用 H.264 视频和 AAC 音频。自 **HLS 协议第 7 版** 起开始支持 H.265/HEVC,近期版本还集成了 AV1 编码。
-   **低延迟**:传统 HLS 延迟约 6~30 秒。通过 **Low-Latency HLS(LL-HLS)** 将片段拆分成更小的部分(Partial Segments),延迟可降至 2~3 秒。
-   **内容保护**:广泛支持 AES-128 加密、FairPlay DRM。
-   **多语言与字幕**:可通过主播放列表指向不同的音频/字幕轨道文件。

---

### 三、MPEG-DASH:国际标准的开放协议

#### 3.1 什么是 MPEG-DASH?
DASH 是 MPEG 在 2012 年发布的国际标准(ISO/IEC 23009-1),设计时充分吸收了 HLS 等协议的经验,目标是成为一个完全开放、编码无关、容器无关的流媒体标准。它不像 HLS 那样强制特定的文件格式或编码。

#### 3.2 DASH 的核心组件

-   **MPD(媒体呈现描述)**  
    类似 HLS 的 Master Playlist,是一个 XML 文件,描述了整个视频的周期(Period)、自适应集(AdaptationSet),以及切片片段的模板或列表。
-   **切片(Segment)**  
    DASH 允许使用多种文件格式存放切片,最常用的是 `.mp4`(fMP4 片段格式,ISO BMFF),但也支持基于 MPEG-2 TS 的格式。
-   **模板与时间轴**  
    DASH 使用 `SegmentTemplate` 或 `SegmentTimeline` 来动态生成切片 URL,无需在播放列表中逐个列出所有片段,使 MPD 文件更加紧凑。

#### 3.3 DASH 的工作流程

1. **获取 MPD**  
    播放器首先从 Web 服务器或 CDN 请求视频的 `.mpd` 文件。
2. **解析 MPD**  
    读取视频的各种码率(Representation)信息、分辨率、MIME 类型,以及服务器的切片可用时间范围。
3. **动态切换**  
    根据当前缓冲区大小和实测带宽,选择下一个片段的 Representation(码率),构造出对应的切片 URL 并下载。
4. **播放衔接**  
    不同码率的切片在解码器层面无缝切换(因为都是独立的可解码单元)。

#### 3.4 DASH 的主要优点

-   **真正的编码无关**:支持 H.264、H.265、VP9、AV1 等视频编码,以及 AAC、Opus、Dolby 环绕声等音频编码。
-   **容器灵活**:基于 ISOBMFF 的 `.mp4` 片段更符合现代编解码器对随机访问的支持,效率更高。
-   **丰富的功能定义**:高级广告插入(SCTE-35)、多周期动态更新、自定义扩展等均被标准规范。
-   **DRM 互通**:通过通用加密(CENC)方案,可同时兼容 Widevine、PlayReady 和 FairPlay 等多种数字版权管理。

---

### 四、HLS 与 DASH 的关键对比

| 维度 | HLS | MPEG-DASH |
|------|-----|-----------|
| **标准制定者** | 苹果公司 | MPEG 国际标准组织 |
| **索引文件格式** | `.m3u8` 纯文本播放列表 | `.mpd` XML 结构 |
| **默认切片格式** | `.ts` 片段(最新版本广泛支持 fMP4) | `.m4s` / `.mp4` (fMP4) |
| **编码支持** | 主打 H.264/AAC;新版支持 H.265/HEVC, AV1 | 编码无关,从 H.264 到 AV1 均可 |
| **设备兼容性** | iOS/macOS 原生,所有现代浏览器、安卓、智能电视均广泛支持 | 大部分安卓设备原生支持;浏览器需通过 Media Source Extensions(如 dash.js)实现 |
| **低延迟** | 低延迟 HLS(LL-HLS)需服务端和播放器配合 | DASH-IF 低延迟模式,延迟可低至 1~3 秒 |
| **数字版权管理(DRM)** | 紧密结合 FairPlay | 通用加密(CENC),可兼容 Widevine, PlayReady, FairPlay |
| **多语言字幕** | 通过主播放列表引用独立媒体流 | 在 MPD 中定义 AdaptationSet,支持嵌入或外挂 WebVTT/TTML |

> **重要提示**:现代 HLS 已经完全支持 fMP4 片段(从 iOS 10 开始),这使得两者在切片媒介上的差异越来越小。今天构建一个流媒体服务,经常会 **同时输出 HLS 和 DASH**,以便覆盖所有终端。

---

### 五、如何选择与部署实践

#### 5.1 何时偏向 HLS?
-   你的主要用户大量使用 iPhone、iPad、Apple TV。
-   你需要最广泛的设备原生支持,且不希望强制安装播放器库。
-   你只使用 H.264/H.265 编码,且 FairPlay 是你的首选 DRM。

#### 5.2 何时偏向 DASH?
-   需要精细控制编码参数,或希望使用 AV1、Opus 等新 codec。
-   你依赖多 DRM 策略(例如同时支持 Widevine 和 PlayReady)。
-   你构建的是 Web 端为主的应用,且可以接受集成 dash.js 播放器。

#### 5.3 同时提供两种协议的最佳实践
绝大多数专业流媒体平台(如 Netflix、YouTube)都同时支持。实现方式有两种:

1. **统一转码与打包**  
    使用 `ffmpeg` + `Shaka Packager` 或 `mp4box` 等工具,从同一组编码好的视频/音频轨道生成同时符合 HLS 和 DASH 规范的切片和播放列表。
2. **使用商业/开源流媒体服务器**  
    - **Nginx + nginx-rtmp-module**:适合简单直播,可输出 HLS。
    - **SRS (Simple Realtime Server)**:高性能,支持 HLS 和 DASH 直播录制。
    - **Kaltura / MediaPackage**:开源或云服务,可自动转码并输出双协议。

---

### 六、实战:用 Shaka Packager 生成双协议文件

假设你已有编码完成的视频和音频文件(`video_360p.mp4`, `video_720p.mp4`, `audio_en.mp4`),以下命令将生成 HLS 和 DASH 所需的全部文件。

```bash
shaka-packager \
  in=video_360p.mp4,stream=video,output=360p/video.mp4 \
  in=video_720p.mp4,stream=video,output=720p/video.mp4 \
  in=audio_en.mp4,stream=audio,output=audio/audio.mp4 \
  --mpd_output manifest.mpd \
  --hls_master_playlist_output master.m3u8 \
  --hls_base_url "https://example.com/video/"