tutorials

如何下載 M3U8/HLS 串流媒體:完整入門指南

學習如何在瀏覽器中下載 M3U8 與 HLS 串流,找出播放清單網址、選擇 MP4 或 TS、處理跨域與分片問題,並使用 FlowPick 儲存至本機。
FlowPick 團隊
14 分鐘閱讀
# m3u8 # hls # 串流媒體 # 下載 # 教學

你正在觀看一門付費課程,或者一段很想儲存的直播回放。右鍵點擊影片——沒有「儲存」選項。你試了下載工具——結果拿到一個 3KB 的 .ts 檔案,VLC 根本打不開。

這就是 HLS 串流媒體從使用者視角看到的樣子。本指南拆解底層原理,並帶你一步步把影片完整取出來。

HLS 是什麼,為什麼存在?

HLS——HTTP Live Streaming——2009 年由蘋果建立,最初用於 iPhone 串流媒體。核心思路很簡單:不傳一個巨型影片檔案,而是把它切成小塊,透過標準 HTTP 逐一傳輸。

把所有分片串聯起來的播放清單檔案就是 M3U8 檔案——一個副檔名為 .m3u8 的純文字檔案。你在瀏覽器 Network 面板看到的 .m3u8 URL,是影片的目錄,不是影片本身。

典型的 M3U8 長這樣:

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:9.960000,
segment_000.ts
#EXTINF:9.960000,
segment_001.ts
...
#EXT-X-ENDLIST

每行 #EXTINF 定義一個分片時長,後面跟該分片的 URL。一小時影片按 10 秒分片就有 360 個 .ts 檔案。播放器按順序下載,使用者看起來是連續的流。

自適應位元率(ABR)

大多數 HLS 流其實是自適應位元率流。不是只有一個 M3U8,而是有一個主 M3U8 列出多個品質版本:

#EXTM3U
#EXT-X-STREAM-INF:BANDWIDTH=5000000,RESOLUTION=1920x1080
1080p/index.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=2500000,RESOLUTION=1280x720
720p/index.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=800000,RESOLUTION=640x360
360p/index.m3u8

播放器根據你的頻寬選擇合適品質,頻寬變化時無縫切換。這就是 YouTube 在網路差時不卡頓的原因——它不是在等一個 4GB 檔案下載完,只是在拉接下來 10 秒。

為什麼網站偏愛 HLS 而非直連 MP4

分片傳輸讓盜版變得困難得多:

  • 分片 URL 經常過期——2 小時前有效的 URL 現在可能返回 403
  • AES-128 加密可以對每個分片單獨加密,金鑰輪換
  • 沒有單一可下載檔案——沒什麼可以「右鍵另存新檔」
  • CDN 分發——實際的 .ts 檔案可能分佈在全球幾十台伺服器

對於合法用途(歸檔、離線學習、無障礙存取),這確實很令人頭痛。這就是 HLS 下載工具存在的意義。

不用對的工具會發生什麼

假設你在 DevTools 裡找到了 M3U8 URL,嘗試直接下載:

  • wget/curl M3U8:得到播放清單文字檔案,不是影片
  • 瀏覽器「連結另存新檔」:下載幾 KB 的 M3U8 文字,肯定看不了
  • 普通下載工具:要嘛報錯,要嘛只抓第一個分片
  • youtube-dl/yt-dlp:支援的網站能用,但需要命令列、Python,還要隨網站更新不斷維護

真正下載 HLS 需要軟體能做到:

  1. 解析 M3U8 格式
  2. 相對 URL 轉絕對 URL
  3. 下載數百個 .ts 分片(最好並行)
  4. #EXT-X-KEY 裡的金鑰解密 AES-128 加密分片
  5. 拼接或重封裝成可播放的容器格式(MP4 或 TS)

這是一條管線,不只是簡單下載。

用 FlowPick 下載 HLS 流

方式一:瀏覽器擴充功能(推薦)

擴充功能在瀏覽器裡靜默監聽 M3U8 請求,不需要手動找 URL。

第一步:安裝 FlowPick

Chrome 線上應用程式商店Edge 擴充功能Firefox 附加元件 安裝。

第二步:打開頁面並按下播放

M3U8 請求只在播放器初始化時發出。只打開頁面不夠,影片必須開始播放。

第三步:點擊 FlowPick 圖示

工具列圖示上顯示數字角標,表示檢測到的流數量。點擊打開彈窗。

第四步:選擇畫質

對於自適應流,FlowPick 讀取主 M3U8 並展示所有可用畫質,選擇你需要的解析度。

第五步:下載合併

點擊 Pick。FlowPick 按設定的執行緒數(預設 2 個,可在設定裡調高)並行下載分片,本地解密加密分片,合併成 MP4 或 TS 檔案(由設定決定)。全程不經過任何伺服器,檔案直接從 CDN 到你的磁碟。

下載進度

FlowPick 彈窗底部會顯示當前下載任務的即時進度:分片下載數/總分片數、當前速度、預計剩餘時間。對於幾百個分片的長影片,整個過程通常只需幾分鐘。

方式二:線上工具(無需安裝)

已經有 M3U8 URL 的話,直接用 M3U8 線上下載工具 即可,不需要安裝擴充功能。

貼上 URL、選擇畫質、點下載。對公開流效果很好,但有些平台有 CORS 限制(這時擴充功能更有優勢,因為它攜帶頁面自己的憑證執行)。

手動找 M3U8 URL 的方法:打開開發者工具(F12)→ Network 標籤 → 篩選框輸入 m3u8 → 播放影片 → 找 Content-Type 為 application/x-mpegurl 的請求。

輸出格式:MP4 還是 TS?

FlowPick 支援兩種輸出格式,在設定裡切換:

MP4TS
相容性最好,幾乎所有播放器都支援部分老播放器不支援
處理速度需要 FFmpeg WASM 重封裝,略慢直接二進位拼接,極快
檔案大小比 TS 小 5-15%(容器開銷更少)略大
適合場景長期儲存、上傳平台、影片編輯追求速度、後續用 FFmpeg 處理

日常用 MP4 就行。 只有你打算後續用 FFmpeg 命令列做進一步處理,或者網速慢想跳過重封裝步驟,才考慮 TS。

加密流:AES-128

很多付費內容使用加密 HLS,M3U8 裡有這樣一行:

#EXT-X-KEY:METHOD=AES-128,URI="https://api.example.com/key?token=abc123"

意思是:每個 .ts 分片用 128 位元 AES 金鑰加密,金鑰從那個 URI 取得。沒有金鑰,原始分片位元組毫無意義。

FlowPick 自動處理這一切:

  1. 從 URI 取得金鑰(使用瀏覽器的 Cookie 和工作階段——所以登入狀態下可用)
  2. 用瀏覽器內建 Web Crypto API 在客戶端解密每個分片
  3. 金鑰和分片資料從不傳送到任何外部伺服器

FlowPick 無法處理的: Widevine、PlayReady 或 FairPlay DRM。這些是硬體級內容保護,解密金鑰綁定到裝置,JavaScript 無法存取。Netflix 和 Disney+ 屬於這一類。

實際使用場景

線上課程平台(Udemy、Coursera 等)

大多數課程平台用加密 HLS,防止學員下載後退款。FlowPick 能處理 AES-128 加密——前提是你已經登入且有存取權限。

操作節奏:打開課程影片 → 播放 5 秒 → 打開 FlowPick → 選 720P(課程內容清晰度足夠,檔案更小)→ Pick。下載完立刻播放驗證一遍,確保音訊同步。

直播回放錄製

直播結束後通常有一段短暫的回放視窗(24-72 小時),之後平台刪掉或只對付費會員開放。這段時間內下載是最乾淨的——流是靜態的,URL 不像即時直播那樣快速過期。

判斷方法:如果是即時直播,M3U8 裡不會有 #EXT-X-ENDLIST 標籤。有這個標籤說明直播已結束,是可以完整下載的靜態流。

自動字幕內嵌內容

部分平台的 HLS 流包含多語言音軌,M3U8 裡用 #EXT-X-MEDIA:TYPE=AUDIO 列出。FlowPick 會檢測並展示可用音軌供你選擇。

常見問題排查

"檢測到 0 個流"

最常見原因:影片還沒開始播放。M3U8 請求只在播放器初始化時發出。按下播放,等緩衝一兩秒再看。

如果網站把播放器放在 iframe 裡(嵌入式播放器、課程平台),需要右鍵影片 →「在新分頁中開啟框架」,在那個分頁用 FlowPick。

"下載到 X% 就停了"

流 URL 過期了。大多數平台的分片 URL 有 4-6 小時有效期,直播內容可能只有 30 分鐘。

解決:重新整理頁面,重新播放影片取得新 URL,再用 FlowPick 重新檢測。

"下載的檔案播不了"

幾種可能:

  • 分片損壞:單個損壞的 .ts 會破壞合併。試試低畫質版本。
  • 非標準 TS 格式:FlowPick 用 FFmpeg WASM 處理重封裝,但邊緣情況存在。
  • 音視訊不同步:用 VLC 打開,選擇「始終修復」(媒體 → 轉換/儲存 → 設定檔 → 影片編解碼器 → 勾選「修復/忽略損壞或缺失的 AV 同步」)。

"只下到單個 .ts 檔案"

在 Firefox 上或合併步驟靜默失敗時會這樣。切換到 Chrome 或 Edge,合併支援更好——Chrome 的 File System Access API 允許直接寫大檔案到磁碟。

下載速度很慢

預設並行執行緒是 2 個,比較保守。在 FlowPick 設定裡把執行緒數調到 4-6,速度通常能有明顯提升。注意別調太高——太多並行連線反而可能觸發伺服器端限速。

大檔案下載說明

FlowPick 透過瀏覽器的 File System Access API 做流式寫入,理論上沒有檔案大小限制。4K 影片、幾 GB 的長內容都不在話下,不會因為檔案大導致瀏覽器當機或記憶體爆掉。

Chrome 和 Edge 對大檔案支援最好(完整的 FSA 流式寫入)。Firefox 也支援,但走的是不同的寫入策略,超大檔案場景穩定性略低於 Chrome。

快速參考:HLS 與另一種格式

如果你遇到的是 .mpd 檔案而非 .m3u8,你面對的是 DASH——另一種相關的串流媒體協定。詳細解析見 什麼是 DASH 串流媒體?MPD 檔案解析

兩者都能用 FlowPick 處理,操作流程基本一致,主要區別是 DASH 有獨立的音視訊軌道需要合併,處理時間略長。


推薦閱讀