DASH :Dynamic Adaptive Streaming over HTTP,基于 HTTP 的动态自适应码流标准,标准号 ISO/IEC 23009-1,由 MPEG 制定,2012 年正式发布。
与 HLS 类似,核心思想是将媒体内容切分为多个小的媒体片段(segment),并在清单文件(MPD,Media Presentation Description)中声明不同比特率/分辨率的表示(Representation),由客户端根据网络状况动态选择。
一、DASH整体结构
三层结构:服务端分片存储层 → MPD 描述层 → 客户端自适应逻辑层
- 媒体分片层 原始音视频编码后切割为小段独立分片(Segment),常见分片时长 2~10s; 分片封装格式:MP4(fMP4 碎片 MP4)、MPEG-TS。
- MPD 元数据层 XML 格式清单文件,描述所有视频 / 音频 / 字幕轨道、分片地址、码率、分辨率、时长、加密信息;客户端播放的唯一入口。
- 客户端自适应控制层 播放器解析 MPD,测量下载吞吐量,选择最优码率分片下载、解码渲染。
示例文件:
XML
<MPD mediaPresentationDuration="PT300S" minBufferTime="PT2S">
<Period duration="PT300S">
<!-- 视频轨道组 -->
<AdaptationSet mimeType="video/mp4" codecs="hev1.1.6.L93.90">
<!-- 1080P 5M码率版本 -->
<Representation bandwidth="5000000" width="1920" height="1080" frameRate="25">
<SegmentTemplate media="video_$Bandwidth$_$Number$.m4s"
initialization="video_$Bandwidth$_init.m4s"
duration="4000" startNumber="1"/>
</Representation>
<!-- 720P 2M码率版本 -->
<Representation bandwidth="2000000" width="1280" height="720" frameRate="25">
<SegmentTemplate media="video_$Bandwidth$_$Number$.m4s"
initialization="video_$Bandwidth$_init.m4s"
duration="4000" startNumber="1"/>
</Representation>
</AdaptationSet>
<!-- 音频轨道组 -->
<AdaptationSet mimeType="audio/mp4" codecs="mp4a.40.2">
<Representation bandwidth="128000">
<SegmentTemplate media="audio_$Number$.m4s" initialization="audio_init.m4s" duration="4000"/>
</Representation>
</AdaptationSet>
</Period>
</MPD>
二、核心介绍
2.1 MPD 文件(最核心)
MPD 是标准 XML,全称 Media Presentation Description,描述整个视频资源的全部信息。2.1.1,MPD 顶层关键节点结构XML
XML
<MPD>
<!-- 全局配置:总时长、更新周期、分片默认时长 -->
<Period>
<!-- 一段连续播放内容,点播1个Period,直播持续新增Period -->
<AdaptationSet>
<!-- 同类型媒体轨道集合:视频/音频/字幕各一套AdaptationSet -->
<Representation>
<!-- 单套码率规格:一种分辨率、码率、帧率 -->
<SegmentTemplate>
<!-- 分片命名规则、分片时长、起始序号、初始化分片 -->
</SegmentTemplate>
</Representation>
</AdaptationSet>
</Period>
</MPD>
- MPD 根节点
mediaPresentationDuration:点播总时长;直播无固定时长minimumUpdatePeriod:直播 MPD 文件刷新间隔,客户端定时重新拉取 MPD 获取新分片
- Period 播放分段单元,广告、正片会拆分为多个 Period;直播持续追加新 Period。
- AdaptationSet(适配集) 同一媒体类型轨道集合:
- 视频 AdaptationSet:所有分辨率视频轨道
- 音频 AdaptationSet:多语言、多声道音频轨道
- Subtitle AdaptationSet:字幕轨道 支持属性:
mimeType、codecs、width、height、音频声道、语言标识。
- Representation(码率版本) 一套独立编码规格,每个代表一个清晰度档位:
bandwidth:码率(bps),自适应核心判断依据width/height:分辨率frameRate:帧率codecs:编码标识(avc1、hev1、aac 等)
- SegmentTemplate(分片模板) 定义分片 URL 生成规则,无需在 MPD 罗列每一个分片地址,大幅减小 MPD 体积:
initialization:初始化分片 URL(包含 SPS/PPS 解码器参数,播放器必须先下载)media:分片路径模板,支持占位符:$Number$:分片序号(最常用)$Bandwidth$:码率$Time$:分片起始时间戳
duration:单个分片时长(单位:毫秒)startNumber:第一个分片序号
2.2 媒体分片 Segment
DASH 主流使用 fMP4(Fragmented MP4,碎片 MP4),也支持 MPEG-TS 分片。
2.2.1 Init segment
XML
ftyp
moov
├─ mvhd # 全局媒体头部
├─ trak # 视频/音频轨道信息
│ ├─ tkhd
│ ├─ mdia
│ │ ├─ mdhd
│ │ ├─ hdlr
│ │ └─ minf
│ │ └─ stbl
│ │ ├─ stsd # 编码参数 SPS/PPS/AAC 配置(核心)
│ │ ├─ stts
│ │ ├─ stsc
│ │ ├─ stsz
│ │ └─ stco
Init 仅由 MP4 基础盒子构成,无媒体数据, 具体的属性内容可以参考MP4格式的解析。容器格式之MP4介绍-CSDN博客
Init 分片全局唯一,一套 Representation 只需要下载一次。
2.2.2 media segment
单个 media segment示意图
[ftyp][moof(元数据)][mdat(视频帧+音频帧)]
XML
ftyp # 文件类型标识(可选,很多分片省略)
moof # Fragment Movie Box 分片元数据(每段分片独立)
├─ mfhd # 分片序号
└─ traf # Track Fragment 轨道分片信息
├─ tfhd # 轨道基础配置
├─ tfdt # 分片起始时间戳 PTS
└─ trun # 本分片所有帧:时长、偏移、关键帧标记
mdat # Media Data Box:原始裸流(H.264/H.265/AAC 二进制帧)
1)ftpy
文件类型标记,识别 fMP4 碎片格式,很多生成工具会省略。
2)moof(分片元数据头,自适应核心)
每一个 media segment 自带独立 moof,不需要依赖前面任何分片,这是 DASH 无缝切换码率的基础。
mfhd:fragment 序号,对应 MPD Numbertraf/trun: trun 记录本分片内每一帧:PTS、帧长度、是否 I 帧。播放器可以精准跳转、快速解码。tfdt:分片起始绝对时间戳,用于音视频同步、直播时间轴对齐。
3)mdat (裸数据区)
二进制原始音视频压缩帧,无封装头,由 moof 内 trun 提供偏移、长度信息分割每一帧。
2.3 两种DASH工作模式
2.3.1 点播模式(On-Demand DASH)
- 完整视频提前分片,全部分片静态存储在 CDN;
- MPD 文件包含完整总时长、全部分片序号范围;
- 客户端可任意拖拽跳转,随机访问任意分片;
- 适合短视频、长视频点播平台。
2.3.2 直播模式(Live DASH / DASH-IF Live)
- 实时流持续切片,服务器不断生成新分片;
- MPD 设置
minimumUpdatePeriod,播放器定时重新请求 MPD 拉取最新分片地址; - 存在播放窗口(timeShiftBufferDepth):仅保留最近 N 秒分片,过期分片自动删除,无法回看久远历史;
- 低延迟扩展:LL-DASH(Low Latency DASH),通过分片分块推送、HTTP/2、Chunked 传输将端到端延迟降至 2~5s。