什麼是 DASH 串流媒體?面向非開發者的 MPD 檔案解析
你嘗試下載一段影片,結果不是 MP4,而是一個 12KB 的 .mpd 檔案。用文字編輯器打開——滿屏 XML,幾百個 <SegmentURL> 標籤,指向的檔案根本不在你磁碟上。
這就是 MPEG-DASH。下面解釋它是什麼、平台為什麼用它,以及如何真正把影片取出來。
DASH 解決了什麼問題
回到 2008 年。YouTube 在傳輸固定位元率的 FLV 檔案。網速慢的時候,有人上傳了 720p 影片,你只能看著轉圈圈。唯一的辦法是手動切到 360p。
這對平台來說很尷尬。業界找到的解決方案:不傳固定檔案,而是傳一個描述所有可用畫質的清單,讓播放器根據即時頻寬測量自己決定請求哪個。
蘋果的 HLS 和 ISO 標準的 DASH(2012 年)都解決了這個問題。DASH——動態自適應 HTTP 串流媒體——成為了國際標準:YouTube、Vimeo、Dailymotion 和大多數企業影片平台都在用。
主流平台使用 DASH 的情況
了解哪些平台在用 DASH,有助於你判斷下載時會遇到什麼情況:
| 平台 | 串流媒體協定 | 備註 |
|---|---|---|
| YouTube | DASH | 主要使用 DASH,部分內容也走 HLS |
| Bilibili | DASH(普通內容)+ HLS(直播) | 音視訊分離,需要合併 |
| Vimeo | DASH | 企業版內容也走 DASH |
| Twitch | HLS | 直播走 HLS,VOD 有時走 DASH |
| Coursera / edX | DASH | 課程影片普遍使用 |
| 騰訊影片 / 優酷 / 愛奇藝 | DASH + DRM | 高價值內容疊加 Widevine |
YouTube 是個有意思的案例——它 2011 年就開始部署 DASH,是最早大規模使用的平台之一,現在每天服務數十億次串流媒體請求全靠這套機制。B 站也是 DASH 重度使用者,普通影片走 DASH、直播走 HLS,如何下載 Bilibili 影片到本地 裡完整走了一遍 B 站的下載流程,是理解 DASH 實戰的好案例。
MPD 檔案:不是影片,是配方
每個 DASH 流都從一個 MPD 檔案開始——媒體展示描述(Media Presentation Description)。它是一個 XML 文件,描述整個流:時長、可用畫質、編解碼資訊,以及找到每個影片和音訊分片的路徑。
一個真實的簡化 MPD:
<?xml version="1.0" encoding="UTF-8"?>
<MPD type="static" mediaPresentationDuration="PT1H23M47S">
<Period>
<AdaptationSet contentType="video" mimeType="video/mp4">
<Representation id="v1080" bandwidth="4500000" width="1920" height="1080">
<SegmentTemplate
initialization="video/1080p/init.mp4"
media="video/1080p/seg-$Number$.m4s"
startNumber="1" />
</Representation>
<Representation id="v720" bandwidth="2000000" width="1280" height="720">
<SegmentTemplate
initialization="video/720p/init.mp4"
media="video/720p/seg-$Number$.m4s"
startNumber="1" />
</Representation>
</AdaptationSet>
<AdaptationSet contentType="audio" mimeType="audio/mp4">
<Representation id="a128" bandwidth="128000">
<SegmentTemplate
initialization="audio/init.mp4"
media="audio/seg-$Number$.m4s"
startNumber="1" />
</Representation>
</AdaptationSet>
</Period>
</MPD>
結構說明:
<AdaptationSet>:等效軌道的組合——所有影片選項,或所有音訊選項<Representation>:該組內的一個具體畫質/編解碼組合<SegmentTemplate>:分片檔案的 URL 模板
模板 video/1080p/seg-$Number$.m4s 展開為 seg-1.m4s、seg-2.m4s……可能有幾千個檔案。
音視訊分離:DASH 的核心設計
DASH 最讓下載者頭痛的地方在於音訊和影片是兩條獨立的流。這不是故意刁難,而是設計使然:
想像你要給一個影片配 5 種語言的音軌。如果音視訊合在一起,你需要存 5 份完整影片檔案,伺服器儲存成本翻 5 倍。DASH 的做法是:一份影片軌,5 份音訊軌,播放器根據語言設定組合。儲存成本大幅降低。
對下載者來說,這意味著:
- 必須同時下載影片軌和音訊軌
- 下載完成後必須合併成一個檔案
- 只下影片——沒聲音;只下音訊——看不了
FlowPick 會自動檢測 MPD 裡的所有 AdaptationSet,幫你同時下載並合併。合併這一步聽起來簡單,實際在瀏覽器裡跑 FFmpeg WASM 有不少坑,詳細的拆解看 FlowPick 是怎麼在瀏覽器裡把切片合成 MP4 的。

DASH 與 HLS:有什麼區別?
如果你已經讀過 如何下載 M3U8/HLS 流,就知道 HLS 用 .m3u8 檔案和 .ts 分片。DASH 用 .mpd 檔案和 .m4s 分片。目標相同——自適應串流媒體——但細節有明顯差異。
| DASH | HLS | |
|---|---|---|
| 來源 | ISO/IEC 23009,2012 | 蘋果,2009 |
| 清單格式 | XML(.mpd) | 純文字(.m3u8) |
| 分片格式 | fMP4(.m4s)或 MP4 | MPEG-TS(.ts) |
| 音訊處理 | 獨立軌道 | 與影片合併 |
| 加密方式 | CENC(Widevine/PlayReady) | AES-128(金鑰可取得) |
| 誰在用 | YouTube、Vimeo、企業平台 | Twitch、蘋果平台 |
關鍵實際區別:DASH 把音訊和影片分開。影片檔案沒有音訊,音訊檔案沒有影片。需要同時下載兩者並合併。
另一個重要區別是加密:HLS 常見的 AES-128 加密中,金鑰可以透過正常的 HTTP 請求取得(登入狀態下);DASH 的 CENC 加密走 Widevine/PlayReady 授權體系,金鑰綁定到裝置,無法透過瀏覽器擴充功能取得。
為什麼 DASH 影片正常情況下根本下不了
綜合來看,這就是為什麼什麼方法都不好使:
1. 根本沒有影片檔案。 MPD 是藍圖。實際內容分散在 CDN 的幾百個 .m4s 分片裡。
2. 音訊和影片是獨立軌道。 即使你能下載所有影片分片,檔案也沒有聲音。音訊分片是完全獨立的下載路徑。
3. 分片 URL 通常包含簽章權杖。 典型分片 URL 長這樣:https://cdn.example.com/video/seg-42.m4s?token=eyJhbGc...&expires=1735689600。這個權杖有時間限制,綁定到你的工作階段。
4. 初始化分片很重要。 影片和音訊軌道都以「初始化分片」(init.mp4)開頭,包含編解碼參數。沒有它,播放器無法解析後續分片。
5. 內容保護(CENC)。 高價值內容在 DASH 上面疊加 Widevine 或 PlayReady DRM,每個分片都被加密,金鑰透過獨立的授權伺服器下發。
FlowPick 如何下載 DASH 流
FlowPick 在瀏覽器分頁內攔截 MPD 請求。當你登入某個平台,你的工作階段 Cookie 隨請求傳遞——FlowPick 看到的清單和你的播放器看到的一樣。
下載管線:
- 解析 MPD XML — 提取所有
AdaptationSet和Representation條目 - 展示畫質選項 — 顯示可用的影片解析度和音訊軌道
- 並行下載 — 影片和音訊分片同時下載,執行緒數由設定決定(預設 2 個,可調整)
- 先取得初始化分片 — 這些檔案小但對合併來說必不可少
- 在記憶體中拼裝 — 按順序拼接初始化 + 所有分片
- 合併影片與音訊 — 用編譯為 WebAssembly 的 FFmpeg,完全在瀏覽器分頁內執行
- 寫入磁碟 — 透過 Chrome/Edge 的 File System Access API,或 Firefox 的直接下載 Blob
整個管線在客戶端執行,沒有上傳,分片從不經過第三方伺服器。
如果你有獨立的 MPD URL,也可以直接貼到 DASH 線上下載工具,無需安裝任何東西。
線上工具 vs 擴充功能:該用哪個
對於 DASH 下載,兩種方式各有場景:
| 場景 | 推薦方式 |
|---|---|
| 有獨立的 MPD URL,公開流 | 線上工具,無需安裝 |
| 需要登入才能存取的內容 | 瀏覽器擴充功能,攜帶工作階段 Cookie |
| 平台用 POST 請求取得清單 | 瀏覽器擴充功能,能在網路層攔截 |
| 平台混淆了 MPD URL | 瀏覽器擴充功能,自動識別 |
| 分片 URL 有時效限制 | 瀏覽器擴充功能,即時取得 |
線上工具受瀏覽器跨域(CORS)策略限制——如果影片託管伺服器沒有配置 CORS 標頭,線上工具直接下載會失敗。這時擴充功能更可靠。
在野外識別 DASH
想知道某個網站是否用 DASH?在影片載入前打開開發者工具:
- F12 → Network 標籤
- 篩選框輸入
.mpd或manifest - 播放影片
- 找
Content-Type: application/dash+xml的請求
找到了——這就是入口。該請求的 URL 就是貼到線上工具的內容,也是 FlowPick 自動攔截的目標。
有些平台混淆 URL 或用 POST 而非 GET 請求清單。這時線上工具不管用,但瀏覽器擴充功能可以,因為它在網路攔截層捕獲請求,不管用什麼方法。
直播流:完全不同的情況
靜態 DASH 流(電影、錄製課程)有 type="static" 屬性和已知的 mediaPresentationDuration。直播流用 type="dynamic":
<MPD type="dynamic"
availabilityStartTime="2026-07-01T09:00:00Z"
minimumUpdatePeriod="PT5S"
timeShiftBufferDepth="PT1H">
MPD 不斷更新(本例每 5 秒),只有一個滾動視窗內的分片可用。一旦分片超出 timeShiftBufferDepth,就從 CDN 消失了。
對於直播流,FlowPick 從你開始錄製的那一刻起捕獲——無法回溯超過當前緩衝區。對於過去的直播內容,找回放/VOD URL,那是一個靜態 DASH 或 HLS 流,可以乾淨下載。
常見問題
下了 MPD 檔案,打不開
MPD 不是影片檔案,是清單檔案。你需要工具解析它並按順序下載所有分片再合併。直接用影片播放器打開 MPD 通常沒用(VLC 是個例外,支援直接播放 DASH URL)。
下載時音訊和影片分開了
你只下了影片軌或音訊軌其中一個。檢查 FlowPick 是否同時下載了兩個 AdaptationSet——看彈窗裡是否有獨立的音訊條目被選中。如果兩條軌道都下了但沒有合併,可能遇到了 FFmpeg WASM 記憶體限制(檔案過大),嘗試選擇低一檔畫質。
分片下載成功但合併失敗
常見於超大檔案(>4GB)場景。FFmpeg WASM 在 32 位元位址空間下有記憶體限制。遇到這種情況,FlowPick 會嘗試切換到其他合併策略。建議用 Chrome 最新版,FSA 流式寫入對大檔案處理最穩定。
推薦閱讀
- 如何下載 M3U8/HLS 流:完整入門指南 — DASH 的兄弟協定,方法略有不同
- FlowPick 是怎麼在瀏覽器裡把切片合成 MP4 的 — FFmpeg WASM 怎麼在瀏覽器裡把音視訊軌合到一起
- 如何下載 Bilibili 影片到本地 — B 站是 DASH 重度平台,實戰案例
- 嗅探並下載網頁音訊:Podcast、BGM、有聲書一網打盡 — DASH 獨立音軌怎麼單獨下載
- FlowPick 與 Video DownloadHelper 對比 — 真實對比,不是廣告