Skip to content

MPEG-DASH完全指南:与HLS对比、MPD结构原理与浏览器播放方案

直播卡顿想换协议;YouTube技术选型研究;要做流媒体平台,纠结HLS还是DASH;Safari播不了DASH流想找方案——DASH这格式吧,技术先进但国内资料少。今天把MPEG-DASH从头到尾讲清楚,跟HLS对比着看,你就知道什么时候该用哪个。

什么是MPEG-DASH

MPEG-DASH(Dynamic Adaptive Streaming over HTTP)是MPEG联盟在2012年发布的 基于HTTP的动态自适应流媒体协议。名字虽然长,核心就一句话:把视频切成小片段,让播放器根据网络情况自动切换清晰度

DASH和HLS、Smooth Streaming(微软)、HDS(Adobe)属于同一类技术——自适应码率流媒体(ABR,Adaptive Bitrate Streaming)。DASH是国际标准(ISO/IEC 23009-1),厂商中立,不像HLS是Apple主导。

主流用户:YouTube、Netflix、Amazon Prime Video 等大型平台都在用DASH,Bilibili的WebM播放也部分基于DASH思路。

DASH的工作原理

理解DASH的工作流程,能帮你快速定位播放问题:

  1. 客户端请求MPD文件(如 stream.mpd)。
  2. 解析MPD:获取所有可用质量层级(Representation)、码率、分辨率、切片URL模板。
  3. 根据带宽选择初始质量:播放器估算当前网速,选一个合适的Representation。
  4. 请求第一个切片:通常是初始化段(Initialization Segment),包含解码器配置。
  5. 请求视频切片:按MPD中的URL模板,依次请求 chunk-1.m4schunk-2.m4s 等。
  6. 边下边播:通过Media Source Extensions(MSE)将切片喂给 <video> 元素。
  7. 网络变化时切换质量:网速变慢就降到低码率Representation,网速变好就升到高码率,无缝切换不卡顿。
  8. 直播场景:定期重新请求MPD,获取新增的切片URL。

整个过程的关键是 切片 + MPD索引 + MSE播放,和HLS的思路几乎一样,只是实现细节不同。

MPD文件结构详解

MPD(Media Presentation Description)是DASH的核心,使用XML格式。一个典型的MPD文件长这样:

xml
<?xml version="1.0" encoding="UTF-8"?>
<MPD xmlns="urn:mpeg:dash:schema:mpd:2011" 
     type="static"
     mediaPresentationDuration="PT1H30M00S"
     minBufferTime="PT2.0S"
     profiles="urn:mpeg:dash:profile:isoff-live:2011">

  <Period>
    <AdaptationSet mimeType="video/mp4" segmentAlignment="true">
      
      <Representation id="v0" bandwidth="800000" width="640" height="360" codecs="avc1.42c01e">
        <SegmentTemplate media="video-$Number$.m4s" 
                         initialization="video-init.m4s"
                         startNumber="1"
                         duration="2000"
                         timescale="1000"/>
      </Representation>
      
      <Representation id="v1" bandwidth="2000000" width="1280" height="720" codecs="avc1.4d401f">
        <SegmentTemplate media="video-$Number$.m4s"
                         initialization="video-init.m4s"
                         startNumber="1"
                         duration="2000"
                         timescale="1000"/>
      </Representation>
      
      <Representation id="v2" bandwidth="5000000" width="1920" height="1080" codecs="avc1.640028">
        <SegmentTemplate media="video-$Number$.m4s"
                         initialization="video-init.m4s"
                         startNumber="1"
                         duration="2000"
                         timescale="1000"/>
      </Representation>
      
    </AdaptationSet>
  </Period>
</MPD>

关键标签解读:

标签含义
MPD根元素,包含全局配置
typestatic(点播)或 dynamic(直播)
mediaPresentationDuration视频总时长
Period一个播放周期,可包含广告插入点
AdaptationSet一组可互换的Representation(如所有视频质量)
Representation单个质量层级,含码率、分辨率、编码信息
SegmentTemplate切片URL模板,$Number$是切片序号
bandwidth该Representation所需带宽(bps)
codecs编码信息,如 avc1.42c01e 表示H.264 Baseline 3.0

URL模板示例: media="video-$Number$.m4s" 加上 startNumber="1",播放器会依次请求 video-1.m4svideo-2.m4svideo-3.m4s...

DASH vs HLS:详细对比

特性MPEG-DASHHLS
标准化ISO/IEC 23009-1RFC 8216
主导方MPEG联盟Apple
发布年份20122009
播放列表格式XML(.mpd)文本(.m3u8)
切片格式fMP4、WebM.ts、fMP4
编码支持任意(H.264、H.265、AV1、VP9等)任意
标准延迟3-8秒10-30秒
低延迟版本LL-DASH(<1秒)LL-HLS(<2秒)
加密方式CENC(Widevine、PlayReady)AES-128、FairPlay
Safari支持❌ 原生不支持✅ 原生支持
Chrome支持✅ 原生支持(需dash.js)❌ 原生不支持(需hls.js)
市场占有YouTube、Netflix主导(更广)

实际选择建议:

  • 目标用户主要用Safari/iOS → HLS(必选)
  • 目标用户主要用Chrome/Android → DASH或HLS都行
  • 要支持所有平台 → 同时提供HLS和DASH(YouTube、Netflix就是这么做的)
  • 追求低延迟直播 → LL-DASH(<1秒)或WebRTC(<500ms)
  • 国内市场 → HLS为主,DASH为辅

如果你对HLS还不熟,可以看看本站 M3U8文件完整指南

自适应码率(ABR)机制

DASH的核心价值是ABR——根据用户网络情况自动切换清晰度。工作机制:

1. 带宽估算

播放器维护一个滑动窗口,统计最近下载的几个切片的吞吐量,估算当前可用带宽。常见算法:

  • Throughput-based:基于历史下载速度外推
  • Buffer-based:基于当前缓冲区大小决策
  • Hybrid:两者结合(dash.js默认)

2. 质量切换决策

播放器综合考虑:

  • 估算带宽 vs 各Representation的 bandwidth 需求
  • 当前缓冲区时长(缓冲多就敢升质量,缓冲少就保命降质量)
  • 屏幕尺寸(4K屏没必要播144p)
  • 用户偏好(部分播放器允许手动锁定质量)

3. 无缝切换

切换时关键技巧:

  • 下一切片用新质量的URL:从MPD中找到对应Representation的SegmentTemplate。
  • 不中断当前播放:MSE允许动态切换SourceBuffer中的轨道。
  • 避免画面卡顿:切换发生在切片边界,每片2-4秒,用户基本无感。

浏览器播放DASH的方案

方案一:使用本站DASH在线播放器(最简单)

MPEG-DASH在线播放器 基于dash.js构建,粘贴MPD链接即可播放,无需安装。

方案二:dash.js代码集成

dash.js是DASH-IF维护的官方参考实现:

html
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>DASH Player</title>
  <script src="https://cdn.jsdelivr.net/npm/dashjs@latest/dist/dash.all.min.js"></script>
</head>
<body>
  <video id="video" controls style="width: 100%; max-width: 1280px;"></video>
  <script>
    const url = "https://example.com/stream.mpd";
    const player = dashjs.MediaPlayer().create();
    player.initialize(document.querySelector("#video"), url, true);
    
    // 监听码率切换事件
    player.on(dashjs.MediaPlayer.events.QUALITY_CHANGE_RENDERED, function(e) {
      console.log("切换到质量:", e.newQuality);
    });
    
    // 监听缓冲区状态
    player.on(dashjs.MediaPlayer.events.BUFFER_EMPTY, function() {
      console.log("缓冲区空,可能卡顿");
    });
  </script>
</body>
</html>

方案三:Shaka Player(Google出品)

Shaka Player 是Google开源的DASH/HLS播放器,支持DRM、离线播放、低延迟直播:

javascript
shaka.polyfill.installAll();
const video = document.querySelector('video');
const player = new shaka.Player(video);
await player.load('https://example.com/stream.mpd');

DASH的低延迟方案:LL-DASH

标准DASH延迟3-8秒,对大多数场景够用,但电竞直播、新闻现场、互动直播需要更低延迟。LL-DASH(Low Latency DASH)通过几个技术把延迟压到1秒以内:

  • 更短切片:从2-4秒降到0.5-1秒
  • Chunked Encoding:边编码边传输,不等整片完成
  • Resync元素:允许播放器从切片中间开始播放

但低延迟也有代价:编码效率下降(短切片压缩率低)、CDN缓存效率下降、对网络抖动更敏感。如果不是必须,标准DASH延迟就够用。

DRM加密

DASH用CENC(Common Encryption)标准,支持多种DRM系统:

  • Widevine:Google,Chrome、Android
  • PlayReady:Microsoft,Edge、Xbox
  • FairPlay:Apple,Safari、iOS(但Safari不原生支持DASH,所以这个组合少见)

CENC的优势是同一份加密内容可以同时支持多个DRM系统,不需要为每个DRM单独加密一份。

常见问题速查

问题原因解决
Safari无法播放DASH不原生支持用dash.js或备一份HLS流
切换质量时卡顿缓冲区太小增大 minBufferTime
直播延迟太高切片太长用LL-DASH,缩短切片
CORS错误CDN没配跨域配置 Access-Control-Allow-Origin
跨域切片加载失败CENC密钥跨域问题配置CORS允许凭证
播放黑屏编解码不支持检查 codecs 字段
MPD解析失败XML格式错误用XML验证器检查

总结

MPEG-DASH是HLS之外另一个主流自适应流媒体协议,技术先进但生态不如HLS广。YouTube、Netflix等大厂在用,国内相对少见。

如果你做的是面向全球的Web视频平台,DASH+HLS双协议覆盖最完整;只做国内或移动端,HLS为主即可;做超低延迟直播,考虑LL-DASH或WebRTC。

播放DASH流用本站 DASH在线播放器 最省事,开发集成用dash.js或Shaka Player。

快速回顾:

  • DASH核心:MPD索引 + fMP4切片 + MSE播放
  • vs HLS:DASH在Chrome强、HLS在Safari强,平台差异是关键
  • 首选播放器DASH在线播放器 或dash.js
  • 低延迟:LL-DASH能到1秒以内

参考资料

Last updated: