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/"