如何下載 m3u8 / HLS 串流:完整指南 2026
m3u8 是什麼、HLS 串流為什麼需要合併,以及三種實用下載方法。
你找到一部想要保存的影片。你打開 Chrome 開發者工具的網路標籤,按下播放,然後看到一個指向 .m3u8 URL 的請求。現在該怎麼辦?你可以從那個 URL 下載的檔案是一個 204 位元的文字檔,不是影片。真正的影片是數百個小的 .ts 檔案,它們被列在這個檔案中。歡迎認識 HLS — 這個串流協議在 2026 年為網路上大部分的實況和隨選視頻提供動力。
本指南解釋了 HLS 實際上是什麼、為什麼「下載 m3u8」比複製一個 URL 更複雜,並且逐步介紹了三種實用的方法,從初學者到進階使用者都適用。
什麼是 HLS,什麼是 m3u8
HLS 代表 HTTP Live Streaming。蘋果在 2009 年創造它,作為一種在標準 HTTP 連線上串流影片的方式,無需特殊的串流伺服器。如今它已成為網路上影片的主流協議 — 廣播網路、隨選視頻平台、實況串流、嵌入式講座,以及大多數有廣告的影片都使用它。
訣竅是 HLS「影片」不是單一檔案。它是:
- 一個播放清單檔案,副檔名為
.m3u8(本質上是 UTF-8 文字) - 媒體片段列表 — 通常是
.ts檔案(MPEG 傳輸串流)或.m4s片段(分段 MP4)— 通常每個長 2-10 秒 - 有時是帶有自己音訊片段的獨立音訊播放清單
- 有時是字幕播放清單
你的瀏覽器影片播放器載入播放清單,按順序下載片段,並在你觀看時即時串聯它們。當你「下載 m3u8」時,你只下載了目錄。
m3u8 檔案實際上包含什麼
一個典型的媒體播放清單看起來像這樣:
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:10.0,
segment000.ts
#EXTINF:10.0,
segment001.ts
#EXTINF:9.5,
segment002.ts
#EXT-X-ENDLIST
每一行 #EXTINF 聲明下一個片段的時長。末尾的 #EXT-X-ENDLIST 標記這是 VOD(隨選視頻);對於實況串流,該行不存在,而且清單每幾秒會附加新的片段。
一個主播放清單在上一層,並指向多個不同品質的媒體播放清單:
#EXTM3U
#EXT-X-STREAM-INF:BANDWIDTH=1280000,RESOLUTION=720x480
480p/playlist.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=2560000,RESOLUTION=1280x720
720p/playlist.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=5000000,RESOLUTION=1920x1080
1080p/playlist.m3u8
現代主播放清單也會參考獨立的音訊清單、獨立的字幕清單,有時還有替代影片串流(HDR、不同編解碼器)。若要深入瞭解音訊/影片分離的細節,請參閱 HLS Download Audio and Video Are Separate? Here’s How to Fix It。
為什麼「只下載 m3u8 並改名為 mp4」不起作用
這是最常見的錯誤。.m3u8 檔案是文字;改名不會改變它的內容。你有一個 204 位元的文字檔。即使你不知何故讓播放器進來,它也會嘗試獲取片段 URL,這正是原始播放器已經在做的工作。
若要將 HLS 串流轉變為可播放的 MP4,你需要:
- 解析主播放清單 → 選擇你想要的品質 → 獲取相應的媒體播放清單
- 獲取媒體播放清單中列出的每個片段(可能有數百個檔案)
- 如果串流使用加密片段(AES-128 或 SAMPLE-AES),獲取解密金鑰並在片段進入時解密
- 按順序串聯片段
- 如果音訊和影片在不同的清單中,並行執行上述所有操作兩次,然後合併結果
- 修復串聯引入的任何時間戳記問題
- 將結果包裝在 MP4 容器中(或保留為
.ts用於某些用途)
這是足夠的工作,你幾乎永遠都不想手動完成。以下是三種方式來委託。
方法 1:Chrome 擴充功能(無需命令列)
在影片播放器所在標籤中執行的瀏覽器擴充功能可以:
- 在播放器載入時看到主播放清單
- 繼承播放器的身份驗證(cookie、標頭、簽署的 URL)
- 當音訊和影片清單分離時自動配對它們
- 透明地處理 AES-128 解密
- 透過 FFmpeg.wasm 在瀏覽器中將結果復用為單一 MP4
Video Downloader One-for-All 是我們為此目的維護的擴充功能。工作流程:
- 從 Chrome Web Store 安裝,釘選到工具列
- 訪問包含 HLS 內容的頁面;擴充功能在播放器載入時自動檢測清單
- 點擊擴充功能圖示 — 檢測到內容時工具列徽章轉為藍色
- 從下拉列表中選擇品質
- 點擊下載
HLS 的完整功能介面在 HLS 下載器頁面。有關擴充功能在後臺做什麼的技術背景,本指南是長篇伴讀。
方法 2:yt-dlp(命令列、適合批量)
yt-dlp 是一個 Python CLI,會獲取媒體 URL 並自動解析底層串流。它非常適合批量操作、指令碼編寫和管道。安裝:
# macOS
brew install yt-dlp
# pip
pip install yt-dlp
然後下載 HLS 串流:
yt-dlp "https://example.com/path/to/master.m3u8"
獲取最高品質且音訊和影片已合併:
yt-dlp -f "bv*+ba/b" --merge-output-format mp4 "https://example.com/master.m3u8"
-f "bv*+ba/b" 選擇器表示「最佳影片串流 + 最佳音訊串流,退回到最佳單一組合串流」。這會自動處理分離的音訊/影片清單。
yt-dlp 運作良好的時機:
- 沒有驗證牆的公開 VOD
- yt-dlp 的提取器庫特別支援的網站(列出數千個)
- 從 URL 列表批量下載
yt-dlp 掙扎的時機:
- 需要身份驗證的瀏覽器工作階段的串流
- Cloudflare 或權杖輪換牆攻擊性強的網站
- 實況串流(yt-dlp 可以錄製實況 HLS 但可靠性不同)
- 具有 TLS 指紋檢測的網站
對於所有這些,瀏覽器擴充功能更可靠,因為它繼承了瀏覽器的工作階段。
方法 3:FFmpeg(單行指令、最低級別)
FFmpeg 可以直接處理 m3u8 URL:
ffmpeg -i "https://example.com/master.m3u8" -c copy output.mp4
這在以下情況下起作用:
- 主播放清單無需驗證即可到達
- 音訊混入影片片段(較舊的 HLS 串流)
- CDN 不需要特殊標頭
對於具有分離音訊和影片的現代串流,你需要指定兩個清單:
ffmpeg \
-i "https://example.com/video/1080p/playlist.m3u8" \
-i "https://example.com/audio/eng/playlist.m3u8" \
-c copy \
-bsf:a aac_adtstoasc \
output.mp4
如果 CDN 需要 Referer 標頭(對於 Bilibili、某些日本廣播公司和許多嵌入式播放器很常見):
ffmpeg \
-headers "Referer: https://example.com/video-page" \
-i "https://cdn.example.com/master.m3u8" \
-c copy \
output.mp4
FFmpeg 是最靈活的工具,但也是最繁瑣的。你經常必須在 DevTools 中找到 URL、設定正確的標頭、處理過期的權杖,以及在串流輪換時重新執行。適合進行一次性的取證,但對於日常使用來說很痛苦。
如何找到 m3u8 URL
如果頁面不公開直接下載連結(幾乎沒有),請在 DevTools 中找到 m3u8 URL:
- 在 Chrome 中打開影片頁面
- 按 F12 或 Cmd+Option+I 開啟 DevTools
- 點擊網路標籤
- 在篩選框中,輸入
m3u8 - 點擊影片上的播放
- 網路日誌將顯示對一個或多個
.m3u8URL 的請求 - 第一個(通常稱為
master.m3u8或playlist.m3u8)是主播放清單 - 右鍵點擊 → 複製 → 複製 URL
如果你看到多個 m3u8 請求,第一個通常是主播放清單,後續的是每個品質的媒體播放清單。主播放清單是 FFmpeg/yt-dlp 想要的;擴充功能會自動執行此解析。
HLS 常見陷阱
m3u8 URL 在 60 秒後過期
許多 CDN 用短期滿期簽署 URL(典型:60-300 秒)。如果你複製 URL 並在 5 分鐘後嘗試,你會得到 403。解決方案:在瀏覽器中刷新頁面以獲得新 URL,或使用在瀏覽器環境中執行的工具。
片段使用 AES-128 加密
你會看到 #EXT-X-KEY:METHOD=AES-128,URI="key.bin" 在清單中。片段被加密並需要金鑰來解密。yt-dlp 和 FFmpeg 會自動處理此問題。較舊的瀏覽器擴充功能不會 — 它們下載加密的位元組並產生無法播放的檔案。
串流使用 SAMPLE-AES(DRM 相鄰)
如果你看到 #EXT-X-KEY:METHOD=SAMPLE-AES,加密是部分的 — 只有每個片段內的某些樣本被加密,而不是整個片段。這需要更複雜的處理。yt-dlp 涵蓋大多數情況。某些網站(FairPlay、Widevine HLS)需要只能透過 DRM 系統獲得的金鑰 — 這些在法律上無法下載,我們不支援它們。
實況串流在幾分鐘後中斷
即時 HLS 清單是一個滑動視窗 — 它只包含最近的 ~30-60 秒片段。如果你指向它一次然後走開,清單會旋轉,你的下載會停止。對於實況錄製,你需要一個工具,當新片段出現時持續重新獲取清單。我們擴充功能的實況錄製器做到了;FFmpeg 可以用 -live_start_index 旗標進行,但設定很複雜。
我下載的檔案可以播放但沒有音訊
你遇到了音訊/影片清單分離問題,在 音訊/影片分割伴讀文章中有涵蓋。你需要合併兩個清單,而不只是下載影片清單。
比較:何時使用哪種方法
| 情況 | 最佳工具 |
|---|---|
| 好奇地從公開網站進行一次性下載 | 線上 m3u8 轉 mp4 工具 |
| 從瀏覽器中的網站重複下載 | Chrome 擴充功能 |
| 許多你已經有的 URL 的批量指令碼 | yt-dlp |
| 串流需要你的登入工作階段 | Chrome 擴充功能 |
| 實況串流錄製 | Chrome 擴充功能或帶有實況旗標的 FFmpeg |
| 異國驗證後的串流(自訂 JWT、mTLS) | 帶有自訂標頭的 FFmpeg |
| 教育 / 調試協議本身 | FFmpeg + DevTools |
為什麼 Stream Recorder 不再是答案
如果你正在讀這個,因為 Stream Recorder(Chrome Web Store 最受歡迎安裝的 HLS 擴充功能)不再產生可播放檔案 — 那是另一個故事。Stream Recorder 自 2025-08-01 以來就沒有更新過,而且現代音訊/影片清單分離破壞了它。我們在 Stream Recorder 在 2026 年不起作用?最佳 HLS/m3u8 替代方案中詳細介紹了這一點。
總結
m3u8 只是一個指向影片片段的文字檔。下載「m3u8」只能獲得目錄,不是影片。若要獲得可播放的檔案,你必須獲取片段、解密(如果加密)、合併音訊和影片(如果分離),以及復用為 MP4。
對於大多數人來說,Chrome 擴充功能會自動執行所有這些操作,無需離開瀏覽器。如果符合你的使用情況,請安裝 Video Downloader One-for-All。對於批量 CLI 工作,yt-dlp 非常好。對於精確控制,FFmpeg。
三者都各有用處。要避免的錯誤是把 m3u8 檔案當成影片本身。