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,测量下载吞吐量,选择最优码率分片下载、解码渲染。
示例文件:
<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
<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
ftyp moov ├─ mvhd # 全局媒体头部 ├─ trak # 视频/音频轨道信息 │ ├─ tkhd │ ├─ mdia │ │ ├─ mdhd │ │ ├─ hdlr │ │ └─ minf │ │ └─ stbl │ │ ├─ stsd # 编码参数 SPS/PPS/AAC 配置(核心) │ │ ├─ stts │ │ ├─ stsc │ │ ├─ stsz │ │ └─ stcoInit 仅由 MP4 基础盒子构成,无媒体数据, 具体的属性内容可以参考MP4格式的解析。容器格式之MP4介绍-CSDN博客
Init 分片全局唯一,一套 Representation 只需要下载一次。
2.2.2 media segment
单个 media segment示意图
[ftyp][moof(元数据)][mdat(视频帧+音频帧)]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。