← 返回部落格

如何下載 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「影片」不是單一檔案。它是:

  1. 一個播放清單檔案,副檔名為 .m3u8(本質上是 UTF-8 文字)
  2. 媒體片段列表 — 通常是 .ts 檔案(MPEG 傳輸串流)或 .m4s 片段(分段 MP4)— 通常每個長 2-10 秒
  3. 有時是帶有自己音訊片段的獨立音訊播放清單
  4. 有時是字幕播放清單

你的瀏覽器影片播放器載入播放清單,按順序下載片段,並在你觀看時即時串聯它們。當你「下載 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,你需要:

  1. 解析主播放清單 → 選擇你想要的品質 → 獲取相應的媒體播放清單
  2. 獲取媒體播放清單中列出的每個片段(可能有數百個檔案)
  3. 如果串流使用加密片段(AES-128 或 SAMPLE-AES),獲取解密金鑰並在片段進入時解密
  4. 按順序串聯片段
  5. 如果音訊和影片在不同的清單中,並行執行上述所有操作兩次,然後合併結果
  6. 修復串聯引入的任何時間戳記問題
  7. 將結果包裝在 MP4 容器中(或保留為 .ts 用於某些用途)

這是足夠的工作,你幾乎永遠都不想手動完成。以下是三種方式來委託。

方法 1:Chrome 擴充功能(無需命令列)

在影片播放器所在標籤中執行的瀏覽器擴充功能可以:

  • 在播放器載入時看到主播放清單
  • 繼承播放器的身份驗證(cookie、標頭、簽署的 URL)
  • 當音訊和影片清單分離時自動配對它們
  • 透明地處理 AES-128 解密
  • 透過 FFmpeg.wasm 在瀏覽器中將結果復用為單一 MP4

Video Downloader One-for-All 是我們為此目的維護的擴充功能。工作流程:

  1. 從 Chrome Web Store 安裝,釘選到工具列
  2. 訪問包含 HLS 內容的頁面;擴充功能在播放器載入時自動檢測清單
  3. 點擊擴充功能圖示 — 檢測到內容時工具列徽章轉為藍色
  4. 從下拉列表中選擇品質
  5. 點擊下載

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:

  1. 在 Chrome 中打開影片頁面
  2. 按 F12 或 Cmd+Option+I 開啟 DevTools
  3. 點擊網路標籤
  4. 在篩選框中,輸入 m3u8
  5. 點擊影片上的播放
  6. 網路日誌將顯示對一個或多個 .m3u8 URL 的請求
  7. 第一個(通常稱為 master.m3u8playlist.m3u8)是主播放清單
  8. 右鍵點擊 → 複製 → 複製 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 檔案當成影片本身。