MPDGrab:免费的 DASH/MPD 流下载器(Windows/macOS/Linux 三端)
给 MPDGrab 一个
.mpd清单地址,它会把整条 DASH 节目——每一个视频码率(Representation)、每一条音轨、每一个分片与初始化文件——完整镜像到一个自洽的本地文件夹,并把清单里的引用全部重写为本地路径。用 ZWServe 起个本地服务,任何支持 DASH 的播放器(如 ZWPlayer)即可脱机播放。
📺 处理的是 HLS(.m3u8) 流?请看姊妹工具 M3U8Grab — 免费 M3U8/HLS 流下载器。
下载(预编译,免安装):
MPDGrab(下载器):
ZWServe(本地播放服务器):
免费 · 开源单文件 · 无广告 · 免登录 · 全程不上传
痛点:DASH 流没法直接另存为
DASH(基于 HTTP 的动态自适应流媒体)是现代流媒体的另一半天下——.mpd(Media Presentation Description)是一份 XML 清单,描述 Period、AdaptationSet 与 Representation 的层级结构,背后指向成百上千个媒体分片(.m4v/.m4s/.mp4 分段,各自带初始化段)。和 HLS 一样:播得好,存不了。
- 你没法"右键 → 保存"一条 DASH 视频;清单只是索引,真正的数据由浏览器逐片拉取。
- 普通下载器只挑一个码率合并成单文件,其余全部丢弃——自适应码率(ABR)切换、多音轨、多 Period 结构荡然无存。
- 源站一旦下线,你的测试素材也就没了。
MPDGrab 镜像完整的 DASH 树——清单本身、每一个 Representation(视频与音频)、每一个分片与初始化文件、以及经 Period@xlink:href 引用的嵌套子清单——然后把所有引用重写为本地相对路径。产物文件夹经 HTTP 服务后,表现与线上流完全一致。
MPDGrab 如何解析清单(把 DASH 寻址做全)
DASH 清单比 m3u8 播放列表复杂得多。MPDGrab 实现了完整的寻址体系:
- SegmentTemplate——支持
$RepresentationID$、$Number$、$Time$、$Bandwidth$占位符与printf宽度格式(如$Number%05d$),完整支持 SegmentTimeline(显式$Time$映射,不限于固定编号)。 - SegmentList——显式的
<SegmentURL>/<Initialization>列表。 - BaseURL 单文件——Representation 的有效 BaseURL 本身就是媒体文件(DASH 包装的渐进式下载)。
- 嵌套清单——递归跟随
Period@xlink:href(带去重集合,循环引用不会死锁)。
BaseURL 解析遵循规范链路——MPD → Period → AdaptationSet → Representation,逐层可覆盖。绝对地址与跨域引用(BaseURL 文本、SegmentURL@media、Initialization@sourceURL、xlink:href)全部重写为本地路径;与清单不同主机的外域资源落到 external/<host>/…,保证单一文件夹自洽。
加密 DASH? MPDGrab 面向清晰流(未加密 DASH)——公开测试流与自发布内容基本都是这类。DRM 保护节目(Widevine/PlayReady
ContentProtection)不在支持范围:其许可证/密钥按设计就无法以普通文件获取。
为什么再造一个 DASH 下载器?
多数 DASH 工具本质是转封装器:挑一个码率、拼接分片、输出 MP4。离线看电影没问题;需要这条流继续"像一条流"时就无能为力了。
MPDGrab 与姊妹工具 M3U8Grab 一样坚持"镜像、不合并":
- 全部 Representation——清单保留所有视频码率,本地即可真实演练 ABR 切换。
- 全部音频 AdaptationSet——多语言、解说音轨各归各位。
- 多 Period 结构——Period 与 xlink 嵌套子清单按原样保留。
- 清单本身被重写——所有引用指向本地文件,不合并成单容器。
这让产物非常适合播放器回归测试(ABR、码率切换、多 Period 边界)、离线复现播放问题、或构建不依赖他人 CDN 的可复现测试素材。
核心特性
| 特性 | 说明 |
|---|---|
| 完整镜像 | 清单 + 全部 Representation + 音轨 + 初始化段 + 嵌套(xlink)子清单。 |
| 全量 DASH 寻址 | SegmentTemplate(含 SegmentTimeline 与 printf 宽度)、SegmentList、BaseURL 单文件。 |
| 脱机可播 | 所有绝对/跨域引用重写为本地相对路径。 |
| 跨域支持 | 不受浏览器 CORS 限制;外域资源映射到 external/<host>/...。 |
| 断点续传 | 重跑同一命令自动跳过已存在的非空文件,只补缺失部分。 |
| 原子写入 | 每个分片先写 .part 临时文件,完成后才改名,绝不产生半截文件。 |
| 退避重试 | 每个文件最多重试 5 次(0.5s/1s/1.5s/2s/2.5s)。 |
| 高并发 | 默认 16 并发;-workers 可调。 |
| 零依赖 | 预编译单文件二进制,下载即用。 |
各平台使用方法
Windows
在保存 .exe 的目录打开 PowerShell 或命令提示符:
# 把一条 DASH 节目镜像到名为 "myvideo" 的文件夹
.\mpdgrab-win.exe -url "https://example.com/vod/manifest.mpd" -out "myvideo"
macOS(Apple Silicon)
chmod +x mpdgrab-macos
./mpdgrab-macos -url "https://example.com/vod/manifest.mpd" -out "myvideo"
首次运行 Gatekeeper 可能拦截未签名二进制:右键 → 打开 → 确认;或执行一次
xattr -d com.apple.quarantine mpdgrab-macos。
Linux
chmod +x mpdgrab-linux
./mpdgrab-linux -url "https://example.com/vod/manifest.mpd" -out "myvideo"
命令行参数
| 参数 | 默认 | 说明 |
|---|---|---|
-url |
(必填) | MPD 清单 URL(http/https,支持跨域引用) |
-out |
(必填) | 本地输出目录(不存在则创建) |
-workers |
16 |
并发下载数 |
-force |
false |
强制重新下载已存在的文件 |
-insecure |
false |
跳过 TLS 证书校验(自签名/内网 CDN 专用) |
-H "K: V" |
— | 自定义请求头(可重复)。设置 Referer/Origin/User-Agent 以匹配服务端防盗链校验。 |
-h |
— | 显示用法与示例 |
常用配方
# 大节目满并发
./mpdgrab-win.exe -url "https://.../manifest.mpd" -out "media/v" -workers 32
# 中断后续传——重跑同一命令即可,已完成的文件自动跳过
./mpdgrab-win.exe -url "https://.../manifest.mpd" -out "media/v"
# 强制全量重下
./mpdgrab-win.exe -url "https://.../manifest.mpd" -out "media/v" -force
# 自签名内网 CDN
./mpdgrab-win.exe -url "https://internal-cdn/manifest.mpd" -out "media/v" -insecure
# 匹配服务端 Referer/Origin 校验(-H 可重复)
./mpdgrab-win.exe -url "https://.../manifest.mpd" -out "media/v" \
-H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36" \
-H "Referer: https://example.com/" \
-H "Origin: https://example.com"
输出结构
一个真实例子——镜像 Akamai 经典的 Big Buck Bunny DASH 测试流:
$ mpdgrab-win.exe -url "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps.mpd" -out bbb_30fps
[3/3] done. summary:
files: 1761
size : 2314.1 MB
entry: bbb_30fps/bbb_30fps.mpd (rewritten, locally playable)
文件夹按节目原样镜像:
bbb_30fps/
├── bbb_30fps.mpd ← 播放入口(已重写),打开这个
├── bbb_30fps_320x180_200k/ ← 视频 180p(init + .m4v 分片)
├── bbb_30fps_480x270_600k/ ← 视频 270p
├── bbb_30fps_640x360_1000k/ ← 视频 360p
├── ... ← 共 11 个视频 Representation
├── bbb_30fps_audio_400k/ ← 音轨
└── external/<host>/... ← 跨域资源(如有)
每个 Representation 独占一个目录,初始化段与媒体分片按清单寻址原样落位——这正是本地服务后 ABR 切换依然可用的原因。
用 ZWPlayer 脱机播放
与 HLS 工作流一样的两步:先用 ZWServe 把文件夹起成 HTTP 服务,再把重写后的 .mpd 交给 ZWPlayer。
为什么需要服务器?DASH 播放器通过
fetch/XHR 拉取清单与分片,file://协议下不可用;而在线播放器跑在 zwplayer.com 上,访问你本机是跨域请求,必须由服务端显式放行。ZWServe 一条命令同时解决:HTTP 服务 + 每个响应都带宽松 CORS 头。
1. 用 ZWServe 起服务
# Windows (PowerShell)——把输出文件夹起在 8000 端口
.\zwserv-win.exe -port 8000 -dir ./bbb_30fps
# macOS / Linux
chmod +x zwserv-macos && ./zwserv-macos -port 8000 -dir ./bbb_30fps
复制以 /bbb_30fps.mpd 结尾的地址——那就是播放链接。
2. 在 ZWPlayer 中播放
打开 ZWPlayer,把 http://localhost:8000/bbb_30fps.mpd 粘贴进地址栏播放。ZWPlayer 原生完整支持 DASH(自适应码率、多 Period、多音轨),镜像文件夹的表现与线上流完全一致——每个码率都还能切换,没有被合并掉。
📺 本工作流的 HLS 孪生版本(m3u8 → ZWServe → ZWPlayer),见 M3U8Grab — 免费 M3U8/HLS 流下载器。
常见问题
使用这个工具合法吗?
只下载你有权访问的内容(自有媒体、已授权内容、或明确公开的测试流)。MPDGrab 只是工具;遵守版权与服务条款是你的责任。
为什么需要 ZWServe?直接打开 .mpd 文件不行吗?
不行。DASH 播放器通过 HTTP(fetch/XHR)加载清单与分片,file:// 下无法工作;且播放器运行在网站上(如 zwplayer.com),访问本机是跨域请求,需要 CORS 头。ZWServe 一条命令全部解决。
能转成 MP4 吗?
不能——它保留原始 DASH 结构(清单 + Representation + 分片),这正是全部码率、音轨与 ABR 行为得以保留的原因。确需单个 MP4,请另行转封装。
下载中断了,要从头来吗?
不用。重跑同一命令即可:已存在且非空的文件自动跳过,只补缺失部分。
输出目录里看到 .part 文件,是分片下载失败了吗?
不是。.part 是下载中的临时名:每个分片先写到 <名称>.part,完成后原子改名为正式文件。默认 16 并发下,任一时刻最多看到 16 个 .part——完全正常。失败的尝试会删除 .part 并重试(5 次、退避间隔)。只有进程被强杀才可能残留 .part,重跑一次即自愈。
被杀毒软件 / Gatekeeper 拦截?
二进制未签名,部分系统会告警。macOS:右键 → 打开 → 确认,或 xattr -d com.apple.quarantine <文件>;Windows:SmartScreen 中点"更多信息"→“仍要运行”。
总结
MPDGrab 把只能在线播放的 DASH 节目变成永久、自洽的本地文件夹——全部码率、音轨与分片原样保留,清单重写为本地可播。ZWServe 一条命令把文件夹变成带 CORS 的本地地址,ZWPlayer 以完整 DASH 行为(ABR、多 Period、多音轨)播放。与 HLS 姊妹工具 M3U8Grab 一起,两款工具覆盖了自适应流媒体的两大半天下——离线播放、归档与播放器测试各取所需。
下载你平台的二进制,去镜像一条你有权保留的流,现在就试试。
MPDGrab(下载器):🪟 Windows · 🍎 macOS · 🐧 Linux · 🐧 Linux ARM64
ZWServe(播放服务器):🪟 Windows · 🍎 macOS · 🐧 Linux
M3U8Grab(HLS 孪生):免费 M3U8/HLS 流下载器
- ▶️ 打开 ZWPlayer 播放已服务的流
- 🔎 不熟悉 DASH 清单?读这篇 DASH/MPD 格式深度解析