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的第二大流行协议。
要点
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%的比特率切换。
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流播放过程由四个连续阶段组成:获取MPD、解析流描述、选择初始表示以及动态切换表示。每个阶段都有其影响用户体验质量的特性。
播放器从已知URL加载MPD文件。MPD包含描述整个流的XML结构:内容时长、时间刻度、可用时间段(Period)、自适应集(AdaptationSet)和带有具体编码参数的表示(Representation)。播放器解析MPD并创建可用媒体资源的内部模型。
具有两种分辨率的VOD内容的基本MPD文件示例:
<?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 → AdaptationSet → Representation。每个级别增加细节层次,允许描述复杂场景 — 从简单的VOD到带有广告插入和多角度视频的直播。
MPD — 根元素,描述整个媒体演示。MPD属性确定流类型(static用于VOD,dynamic用于直播)、总时长、时间刻度、配置文件和DRM信息。MPD可以包含一个或多个Period,每个表示内容的独立时间间隔。
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流的示例:
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和HLS之间选择是设计视频流系统时的关键决策之一。两个协议解决相同的任务(通过HTTP自适应视频传输),但在架构、编解码器支持和生态系统方面有根本性差异。让我们根据关键参数来比较它们。
| 参数 | DASH | HLS |
|---|---|---|
| 标准 | 国际标准(ISO/IEC 23009-1) | 专有(RFC 8216,Apple) |
| 流描述 | XML(MPD) | M3U8播放列表 |
| 编解码器 | 任意(H.264、HEVC、AV1、VP9) | 受限(H.264、HEVC,AV1自2023起) |
| 片段格式 | fMP4(主要)、MPEG-2 TS | MPEG-2 TS、fMP4 |
| DRM | CENC(统一用于所有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在移动应用中的集成取决于平台。在Android上,DASH通过ExoPlayer及扩展模块直接支持。在iOS上,需要使用第三方库,如通过AVFoundation集成的libdash或MPEGDASHPlayer。让我们看看两个平台的实际实现。
Google的ExoPlayer通过`exoplayer-dash`模块提供对DASH的内置支持。连接DASH流与其他格式没有区别 — 只需将MPD文件的URI传递给MediaItem。ExoPlayer自动确定内容格式并启动相应的渲染器,支持所有标准ABR算法。
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
Common Encryption(CENC)— DASH的关键能力之一,允许一个媒体流与不同DRM系统一起使用。MPD文件包含带有DRM系统标识符(Widevine、PlayReady、FairPlay)的ContentProtection XML元素。客户端根据其平台选择合适的DRM系统,并通过许可证服务器请求许可证。
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进行特殊调整。主要建议包括:设置最小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 — 开放的国际MPEG标准,不依赖供应商。与HLS(Apple专有协议)不同,DASH支持任意编解码器,使用XML流描述(MPD)代替M3U8,并通过CENC提供统一的DRM系统。HLS在iOS上有原生支持,DASH对于跨平台解决方案更灵活。
在Android上,DASH的主要播放器是Google的ExoPlayer及exoplayer-dash模块。在iOS上,使用第三方解决方案,如通过AVFoundation集成的libdash或商业播放器(THEOplayer、Bitmovin)。在Web浏览器中,DASH通过dash.js使用MediaSource Extensions播放。
MPD(Media Presentation Description)— 是描述DASH流结构的XML文件:内容时长、可用比特率、分辨率、编解码器、片段格式及其位置。MPD用作播放器的入口点,取代HLS中的主播放列表。没有MPD文件,无法播放DASH内容。
是的,DASH既支持VOD也支持直播。直播使用具有自动更新的dynamic类型MPD。服务器定期更新MPD,添加新片段并删除过时的。Low-Latency DASH(LL-DASH)通过分块编码可以实现3-8秒的延迟,与LL-HLS相当。
DASH使用Common Encryption(CENC,ISO/IEC 23001-7),它可以加密媒体内容一次,并由任何DRM系统解密。MPD包含带有支持的DRM(Widevine、PlayReady、FairPlay)指示的ContentProtection XML元素。播放器根据平台选择合适的DRM,并通过指定的URL请求许可证。
总结
我们将开发一款交钥匙移动应用程序
IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。