FFmpeg M3U8 完整指令集
FFmpeg 是處理 HLS 串流最強大的工具,但它的參數對新手極不友善。這頁把所有實務上會用到的指令整理成可直接複製的範例,並說明每個參數的作用與常見錯誤的解法。如果你只是想快速下載一個檔案,可先用線上工具;若要批次處理或精細控制,這頁就是你的參考書。
操作步驟
-
安裝 FFmpeg
Windows:從 ffmpeg.org 下載壓縮檔,解壓後把
bin目錄加入系統 PATH。macOS:brew install ffmpeg。Ubuntu / Debian:sudo apt install ffmpeg。安裝後在終端機執行ffmpeg -version確認。 -
執行最基本的轉檔
一行指令就能完成:
ffmpeg -i "網址.m3u8" -c copy output.mp4。這個指令會下載所有片段並合併成 MP4,不重新編碼,速度最快。 -
視需要加上參數
若遇到 403 錯誤,加
-headers;若要裁剪片段,加-ss與-t;若時間軸有問題,加-fflags +genpts。詳見下方的指令速查表。
基礎指令:一行完成下載與轉檔
這是最常用的指令,可以解決 90% 的需求:
ffmpeg -i "https://example.com/stream/index.m3u8" -c copy output.mp4各參數的意義:
| 參數 | 作用 |
|---|---|
-i | 輸入來源,這裡是 m3u8 網址。 |
-c copy | 不重新編碼,直接複製串流。這是速度與畫質兼顧的關鍵。 |
output.mp4 | 輸出檔名。副檔名決定封裝格式,也可用 .ts 或 .mkv。 |
為什麼快?因為片段本身已是壓縮好的影片,FFmpeg 只是在做「換容器」的動作,不需要解碼再編碼,所以幾乎不太佔 CPU。
進階:處理 403 與防盜連
若出現 HTTP error 403 Forbidden,通常是來源網站檢查了請求標頭。可加入以下參數偽裝成瀏覽器:
ffmpeg -headers "Referer: https://example.com/\r\n" '
-user_agent "Mozilla/5.0 (Windows NT 10.0; Win64; x64)" \
-i "https://example.com/stream/index.m3u8" \
-c copy output.mp4重點說明:
-headers可設定多個標頭,每行結尾必須是\r\n(這是常見的踩雷點)。-user_agent設定 UA,有些網站會擋非瀏覽器的請求。Referer要填該網站自己的網域,不是你的網址。
重要:這些技巧僅適用於你有權存取的內容。刻意規避存取控制可能違反服務條款或法律,請自行斟酌。
指令速查表
實務上最常用的指令,可直接複製修改:
| 用途 | 指令 |
|---|---|
| 基本下載轉 MP4 | ffmpeg -i "URL" -c copy out.mp4 |
| 存成 TS 格式 | ffmpeg -i "URL" -c copy out.ts |
| 只下載前 60 秒 | ffmpeg -i "URL" -t 60 -c copy out.mp4 |
| 從第 5 分鐘開始 | ffmpeg -ss 00:05:00 -i "URL" -c copy out.mp4 |
| 只抽音訊成 MP3 | ffmpeg -i "URL" -vn -c:a libmp3lame out.mp3 |
| 指定最高畫質 | ffmpeg -i "URL" -map 0:v:0 -map 0:a:0 -c copy out.mp4 |
| 修正時間軸 | ffmpeg -fflags +genpts -i "URL" -c copy out.mp4 |
| 合併本機 TS 檔 | ffmpeg -i "concat:a.ts|b.ts" -c copy out.mp4 |
| 轉成 H.264(相容性高) | ffmpeg -i "URL" -c:v libx264 -crf 23 out.mp4 |
提示:把 URL 換成你的 m3u8 網址,out.mp4 換成你要的檔名即可。Windows 的 cmd 建議把網址用雙引號包起來,避免特殊字元被誤判。
常見錯誤與排除
| 錯誤訊息 | 解法 |
|---|---|
HTTP error 403 | 加入 -headers 與 -user_agent 偽裝瀏覽器;或確認網址是否已過期。 |
HTTP error 404 | 網址失效。串流網址常帶時效性 Token,回到原頁面重新取得。 |
Invalid data found | 輸入的不是有效的 m3u8。確認網址結尾是 .m3u8 而非網頁網址。 |
Conversion failed | 檢查是否為加密串流(#EXT-X-KEY)。加密串流需要金鑰,FFmpeg 無法自動解開。 |
| 輸出檔案時間軸錯亂 | 加上 -fflags +genpts,或先存 TS 再重新封裝為 MP4。 |
| 速度快但檔案很小 | 可能只下載到第一個片段。檢查是否為 Master Playlist,可加上 -map 0:v:0 指定。 |
若以上都無法解決,可先用串流檢測工具分析播放清單結構,確認片段數量、畫質與加密狀態,再對症下藥。