DASH — 什么是动态流媒体协议及其工作原理

作者: IT Sectr 发布日期: 2026-05-23 阅读时间: 9 分钟

Dynamic Adaptive Streaming over HTTP(DASH)是MPEG(Moving Picture Experts Group)制定的自适应多媒体流传输国际标准。DASH通过HTTP提供视频和音频传输,使用名为Media Presentation Description(MPD)的XML格式流描述,并将内容分割成不同比特率的片段。根据Bitmovin Video Developer Report(2025)的研究,58%的视频开发者使用DASH,使其成为仅次于HLS的第二大流行协议。

要点

  • DASH — 是一种开放的MPEG国际标准,用于通过HTTP进行自适应流媒体传输。
  • MPD文件(Media Presentation Description)通过XML结构管理流媒体,描述时间段和自适应集。
  • 编解码器不受规范限制 — DASH支持H.264、HEVC、AV1、VP9、AAC等。
  • DRM通过Common Encryption(CENC)实现,在单一流中支持Widevine、PlayReady和FairPlay。
  • 跨平台性通过ExoPlayer(Android)、dash.js(浏览器)和libdash实现。

什么是DASH?

MPEG-DASH(Dynamic Adaptive Streaming over HTTP)— 是ISO/IEC 23009-1国际标准,于2012年发布,旨在应对自适应流媒体专有解决方案的碎片化。与HLS(Apple专有协议)和Smooth Streaming(Microsoft)不同,DASH从一开始就被设计为开放、不绑定特定供应商的标准,这确保了其在行业中的广泛支持。

DASH的主要创新 — 流描述与媒体内容的分离。流描述存储在MPD(Media Presentation Description)XML文件中,包含有关可用变体的所有信息:比特率、分辨率、编解码器、字幕、音轨。媒体内容以单独片段(通常为fMP4)的形式存储,可通过HTTP独立下载。这种架构使服务器基础设施尽可能简单 — 任何HTTP服务器都能分发DASH内容。

DASH的自适应性通过对同一内容的不同变体进行多路复用来实现。服务器准备多个表示 — 具有不同压缩参数的内容副本。客户端分析信道带宽并动态切换表示,选择质量和播放稳定性的最佳比例。根据学术研究(IEEE Access,2024),使用BOLA算法的DASH在不稳定连接下相比HLS减少了22%的比特率切换。

DASH的历史和标准化

MPEG在分析现有解决方案后于2010年开始DASH的工作:Apple HLS、Microsoft Smooth Streaming和Adobe HDS。标准的第一版(ISO/IEC 23009-1:2012)于2012年发布。第二版(2014)增加了事件支持、改进的广告插入和服务器控制的自适应。第三版(2019)增加了对HDR、8K、触觉视频以及用于5G网络的MMT(MPEG Media Transport)的改进集成。

2024年,MPEG宣布了DASH 下一代版本,包括对神经网络编解码器的支持、云渲染以及对扩展现实(XR)场景的优化。关键创新 — Neural Network-Based Video Coding(NNVC),它使用ML模型在客户端进行解码,可在保持质量的同时将比特率降低30-50%。

DASH如何工作?

DASH流播放过程由四个连续阶段组成:获取MPD、解析流描述、选择初始表示以及动态切换表示。每个阶段都有其影响用户体验质量的特性。

获取和解析MPD

播放器从已知URL加载MPD文件。MPD包含描述整个流的XML结构:内容时长、时间刻度、可用时间段(Period)、自适应集(AdaptationSet)和带有具体编码参数的表示(Representation)。播放器解析MPD并创建可用媒体资源的内部模型。

具有两种分辨率的VOD内容的基本MPD文件示例:

xml
<?xml version="1.0" encoding="utf-8"?>
<MPD xmlns="urn:mpeg:dash:schema:mpd:2011"
     profiles="urn:mpeg:dash:profile:isoff-live:2011"
     type="static"
     mediaPresentationDuration="PT1H30M">
    <Period duration="PT1H30M">
        <AdaptationSet mimeType="video/mp4">
            <Representation bandwidth="5000000"
                           width="1920" height="1080"
                           codecs="avc1.640028"/>
            <Representation bandwidth="1000000"
                           width="640" height="360"
                           codecs="avc1.64001E"/>
        </AdaptationSet>
    </Period>
</MPD>

加载片段和自适应

选择初始表示后,播放器开始加载片段。每个片段包含几秒的内容(通常2-10秒)。播放器保持缓冲区预存多个片段,确保对网络速度短期下降的抵抗力。表示选择算法(ABR)持续监控片段加载速度并决定在可用比特率之间切换。

现代DASH的ABR算法,如BOLA(基于缓冲区占用的Lyapunov算法)和Pensieve(基于强化学习),不仅考虑当前带宽,还考虑缓冲区大小、内容类型(体育、新闻、电影),甚至设备的能耗。BOLA是dash.js和ExoPlayer的一部分,在保持稳定缓冲区的同时最小化比特率切换次数,这已得到ACM研究(Spiteri等人,2020)的证实。

DASH结构:MPD、Period、Adaptation Set

DASH流的层次结构组织在四个级别:MPD → Period → AdaptationSet → Representation。每个级别增加细节层次,允许描述复杂场景 — 从简单的VOD到带有广告插入和多角度视频的直播。

MPD(Media Presentation Description)

MPD — 根元素,描述整个媒体演示。MPD属性确定流类型(static用于VOD,dynamic用于直播)、总时长、时间刻度、配置文件和DRM信息。MPD可以包含一个或多个Period,每个表示内容的独立时间间隔。

Period、AdaptationSet和Representation

Period — 演示的时间段。对于VOD,整个内容使用一个Period。对于带有广告插入的直播,Period可以动态变化 — 播放器加载更新的MPD并检测到对应于广告块的新Period。每个Period包含一个或多个AdaptationSet。

AdaptationSet — 同一媒体类型(视频、音频、字幕)的可互换表示组。在AdaptationSet内,所有表示仅在比特率和/或分辨率上不同,但编码相同的内容。重要特性:播放器可以在同一AdaptationSet内的表示之间在片段边界处切换而不会中断播放。

Representation — 具有特定比特率、分辨率和编解码器的具体编码变体。每个表示在MPD中指定了用于加载片段的URL模板。DASH使用灵活的片段寻址系统 — 通过带有片段编号和时间替换的URL模板($Number$、$Time$),使服务器能够动态生成文件名,而无需在MPD中列出每个片段。

分段和打包

DASH片段可以是两种类型:Segment类型(仅包含媒体数据)和Subsegment类型(片段的一部分,用于更精细的访问)。DASH内容的编码使用FFmpeg或打包编码器等工具。从输入文件创建DASH流的示例:

python
import subprocess

subprocess.run([
    "ffmpeg",
    "-i", "input.mp4",
    "-filter_complex",
    "[0:v]split=2[v1][v2];[v1]scale=1920:1080[v1out];[v2]scale=640:360[v2out]",
    "-map", "[v1out]", "-b:v:0", "5000k",
    "-map", "[v2out]", "-b:v:1", "1000k",
    "-map", "0:a",
    "-f", "dash",
    "-seg_duration", "4",
    "-use_template", "1",
    "-use_timeline", "1",
    "dash/stream.mpd"
])

DASH vs HLS:协议对比

DASH和HLS之间选择是设计视频流系统时的关键决策之一。两个协议解决相同的任务(通过HTTP自适应视频传输),但在架构、编解码器支持和生态系统方面有根本性差异。让我们根据关键参数来比较它们。

参数DASHHLS
标准国际标准(ISO/IEC 23009-1)专有(RFC 8216,Apple)
流描述XML(MPD)M3U8播放列表
编解码器任意(H.264、HEVC、AV1、VP9)受限(H.264、HEVC,AV1自2023起)
片段格式fMP4(主要)、MPEG-2 TSMPEG-2 TS、fMP4
DRMCENC(统一用于所有DRM)FairPlay、Widevine(分开)
iOS支持通过第三方播放器原生(AVPlayer、Safari)
浏览器Chrome、Firefox、Edge(通过MSE)Safari(原生),其余通过MSE

DASH的关键优势 — 独立于编解码器。如果HLS最初将编解码器限制为Apple支持的编解码器(H.264、HEVC,最近还有AV1),那么DASH可以使用播放器支持的任何编解码器:VP9/VP8(对YouTube和Chrome至关重要)、AV1(为提高效率)、H.264/HEVC(为兼容性)。这使得DASH成为需要为所有设备提供统一流的跨平台服务的首选。

DASH在iOS上的缺点 — 在Safari和AVPlayer中缺少原生支持。iOS应用程序开发者需要使用与HLS兼容的第三方播放器或通过VTDecoder集成的libdash等库。实际上,这意味着面向iOS的项目中,HLS仍然是事实上的标准,而对于Android和Web平台,DASH是更灵活、更强大的解决方案。

DASH在移动开发中的应用

DASH在移动应用中的集成取决于平台。在Android上,DASH通过ExoPlayer及扩展模块直接支持。在iOS上,需要使用第三方库,如通过AVFoundation集成的libdash或MPEGDASHPlayer。让我们看看两个平台的实际实现。

通过ExoPlayer在Android上使用DASH

Google的ExoPlayer通过`exoplayer-dash`模块提供对DASH的内置支持。连接DASH流与其他格式没有区别 — 只需将MPD文件的URI传递给MediaItem。ExoPlayer自动确定内容格式并启动相应的渲染器,支持所有标准ABR算法。

kotlin
val player = ExoPlayer.Builder(this).build()

val dashMediaItem = MediaItem
    .Builder()
    .setUri("https://example.com/dash/stream.mpd")
    .setMimeType("application/dash+xml")
    .build()

player.setMediaItem(dashMediaItem)
player.prepare()
player.playWhenReady = true

在两个平台上使用DRM的DASH

Common Encryption(CENC)— DASH的关键能力之一,允许一个媒体流与不同DRM系统一起使用。MPD文件包含带有DRM系统标识符(Widevine、PlayReady、FairPlay)的ContentProtection XML元素。客户端根据其平台选择合适的DRM系统,并通过许可证服务器请求许可证。

kotlin
val drmLicenseUri = Uri.parse("https://license.example.com/wv")
val drmSessionManager = DefaultDrmSessionManager
    .Builder()
    .setUuidAndExoMediaDrmProvider(
        C.WIDEVINE_UUID,
        FrameworkMediaDrm.DEFAULT_PROVIDER
    )
    .build(drmLicenseUri, null)

val mediaItem = MediaItem
    .Builder()
    .setUri("https://example.com/encrypted/stream.mpd")
    .setDrmConfiguration(
        MediaItem.DrmConfiguration.Builder(C.WIDEVINE_UUID)
            .setLicenseUri("https://license.example.com/wv")
            .build()
    )
    .build()

DASH对移动设备的优化

移动应用由于带宽和能耗的限制,需要对DASH进行特殊调整。主要建议包括:设置最小2-3个片段的缓冲区以抵抗短期速度下降,使用2-4秒时长的片段以更快响应网络变化,以及在切换质量时预加载下一个片段。

为节省移动网络流量,Bitmovin(2024)建议使用Content Steering — 一种类似于HLS类似功能的机制,允许动态将客户端引导到最佳CDN节点。DASH Content Steering在ISO/IEC 23009-1:2022规范中有描述,并在dash.js 4.5+和ExoPlayer 2.18+中得到支持。

常见问题

DASH与HLS有何不同?

DASH — 开放的国际MPEG标准,不依赖供应商。与HLS(Apple专有协议)不同,DASH支持任意编解码器,使用XML流描述(MPD)代替M3U8,并通过CENC提供统一的DRM系统。HLS在iOS上有原生支持,DASH对于跨平台解决方案更灵活。

哪些播放器在移动设备上支持DASH?

Android上,DASH的主要播放器是Google的ExoPlayer及exoplayer-dash模块。在iOS上,使用第三方解决方案,如通过AVFoundation集成的libdash或商业播放器(THEOplayer、Bitmovin)。在Web浏览器中,DASH通过dash.js使用MediaSource Extensions播放。

在DASH上下文中什么是MPD?

MPD(Media Presentation Description)— 是描述DASH流结构的XML文件:内容时长、可用比特率、分辨率、编解码器、片段格式及其位置。MPD用作播放器的入口点,取代HLS中的主播放列表。没有MPD文件,无法播放DASH内容。

DASH支持直播吗?

是的,DASH既支持VOD也支持直播。直播使用具有自动更新的dynamic类型MPD。服务器定期更新MPD,添加新片段并删除过时的。Low-Latency DASH(LL-DASH)通过分块编码可以实现3-8秒的延迟,与LL-HLS相当。

DRM在DASH中如何工作?

DASH使用Common Encryption(CENC,ISO/IEC 23001-7),它可以加密媒体内容一次,并由任何DRM系统解密。MPD包含带有支持的DRM(Widevine、PlayReady、FairPlay)指示的ContentProtection XML元素。播放器根据平台选择合适的DRM,并通过指定的URL请求许可证。

总结

  • MPEG-DASH — 开放的国际自适应HTTP流媒体标准,使用MPD格式的XML流描述。
  • 编解码器独立性 — DASH支持H.264、HEVC、AV1、VP9以及播放器可用的任何其他编解码器。
  • CENC为所有DRM系统提供统一的内容加密,简化许可。
  • ABR算法(BOLA、Pensieve)最小化比特率切换并确保稳定播放。
  • Android — DASH在ExoPlayer中原生支持;iOS需要第三方库。
  • LL-DASH将直播延迟降低到3-8秒。
  • 建议在编解码器和DRM灵活性重要的跨平台项目中使用DASH。

我们将开发一款交钥匙移动应用程序

IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。

讨论项目

另请阅读