协议之DASH介绍

DASH :Dynamic Adaptive Streaming over HTTP,基于 HTTP 的动态自适应码流标准,标准号 ISO/IEC 23009-1,由 MPEG 制定,2012 年正式发布。

与 HLS 类似,核心思想是将媒体内容切分为多个小的媒体片段(segment),并在清单文件(MPD,Media Presentation Description)中声明不同比特率/分辨率的表示(Representation),由客户端根据网络状况动态选择。

一、DASH整体结构

三层结构:服务端分片存储层 → MPD 描述层 → 客户端自适应逻辑层

  1. 媒体分片层 原始音视频编码后切割为小段独立分片(Segment),常见分片时长 2~10s; 分片封装格式:MP4(fMP4 碎片 MP4)、MPEG-TS。
  2. MPD 元数据层 XML 格式清单文件,描述所有视频 / 音频 / 字幕轨道、分片地址、码率、分辨率、时长、加密信息;客户端播放的唯一入口。
  3. 客户端自适应控制层 播放器解析 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:字幕轨道 支持属性:mimeTypecodecswidthheight、音频声道、语言标识。
  • 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 Number
  • traf/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。
相关推荐
龙腾AI白云1 天前
标注数据短缺对通用AI产业化的影响与对策
人工智能·pygame·dash
芝麻别开门24 天前
GStreamer DASH Demux 知识文档
ffmpeg·dash
开开心心_Every1 个月前
多连接方式的屏幕共享工具推荐
运维·服务器·pdf·电脑·excel·tornado·dash
费弗里1 个月前
里程碑式更新!Dash 4.2新版本新增websocket型回调
python·dash
龙腾AI白云2 个月前
AI前沿技术
plotly·scikit-learn·dash
费弗里3 个月前
新版本Dash完美支持原生FastAPI后端
python·fastapi·dash
历程里程碑3 个月前
二叉树---翻转二叉树
开发语言·c++·elasticsearch·链表·搜索引擎·tornado·dash
龙腾AI白云3 个月前
多模态AI模型融合难?核心问题与解决思路
机器学习·自然语言处理·virtualenv·tornado·dash
zhaoshuzhaoshu3 个月前
Bash 与 Dash 的区别与联系
开发语言·bash·dash