如何下載 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 需要軟體能做到:
- 解析 M3U8 格式
- 相對 URL 轉絕對 URL
- 下載數百個
.ts分片(最好並行) - 用
#EXT-X-KEY裡的金鑰解密 AES-128 加密分片 - 拼接或重封裝成可播放的容器格式(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 → 播放影片 → 找 Content-Type 為 application/x-mpegurl 的請求。輸出格式:MP4 還是 TS?
FlowPick 支援兩種輸出格式,在設定裡切換:
| MP4 | TS | |
|---|---|---|
| 相容性 | 最好,幾乎所有播放器都支援 | 部分老播放器不支援 |
| 處理速度 | 需要 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 自動處理這一切:
- 從 URI 取得金鑰(使用瀏覽器的 Cookie 和工作階段——所以登入狀態下可用)
- 用瀏覽器內建 Web Crypto API 在客戶端解密每個分片
- 金鑰和分片資料從不傳送到任何外部伺服器
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 有獨立的音視訊軌道需要合併,處理時間略長。
推薦閱讀
- FlowPick 是怎麼在瀏覽器裡把切片合成 MP4 的 — 下載按鈕背後發生了什麼,這篇拆解整條技術管線
- 什麼是 DASH 串流媒體?MPD 檔案解析 — 另一種主流串流媒體協定,和 HLS 的核心區別
- 如何下載 Bilibili 影片到本地 — B 站大多數內容用 DASH,直播用 HLS
- 嗅探並下載網頁音訊:Podcast、BGM、有聲書一網打盡 — HLS 音訊流也能用同一套流程搞定
- 如何批次下載網頁上的所有圖片 — 同一個擴充功能,圖片也能批次抓
- FlowPick 與 Video DownloadHelper 對比 — 和這個領域最老牌擴充功能的橫向對比