M3U8 檔案是什麼?全面解析 HLS 串流播放清單格式
在觀看線上影片時,你是否注意過網址列中出現過的 .m3u8 後綴?這類檔案並非真正的影片檔案,而是 HLS(HTTP Live Streaming) 串流協定中的 播放清單檔案,它像一張「地圖」,指揮播放器按順序下載並播放對應的影片片段。本文將帶你全面了解 M3U8 檔案的本質、結構以及常見的應用場景。
從 M3U 到 M3U8
M3U 原本是音訊播放清單格式,儲存在一個文字檔案中,記錄音樂檔案的路徑。M3U8 是 M3U 的 UTF-8 編碼版本,蘋果公司在制定 HLS 協定時選用了這種格式來定義影片片段的索引。因此,M3U8 檔案是 HLS 串流的「入口」,本身不含畫面,而是告訴播放器去哪裡找、如何組織影片分片(通常為 .ts 或 .fmp4 檔案)。
M3U8 檔案的結構
一個典型的隨選 M3U8 檔案內容如下:
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:10
#EXTINF:9.920,
segment1.ts
#EXTINF:9.920,
segment2.ts
#EXTINF:9.920,
segment3.ts
#EXT-X-ENDLIST
常用標籤說明:
- #EXTM3U:檔案開頭,標識為 M3U 播放清單。
- #EXT-X-VERSION:協定版本號,最新的 HLS 規範使用版本 7 以上。
- #EXT-X-TARGETDURATION:每個分片的最大持續時間(秒)。
- #EXTINF:分片時長(秒)及可選的描述資訊,後跟分片檔案名稱或 URL。
- #EXT-X-ENDLIST:隨選檔案結束標誌;直播串流則沒有該標籤。
對於多位元率自適應的直播串流,頂層 M3U8 會包含 #EXT-X-STREAM-INF,指向不同解析度的子播放清單:
#EXTM3U
#EXT-X-STREAM-INF:BANDWIDTH=1280000,RESOLUTION=720x480
low/index.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=2560000,RESOLUTION=1280x720
mid/index.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=5120000,RESOLUTION=1920x1080
high/index.m3u8
M3U8 在 HLS 中的核心作用
HLS 透過分片和索引實現流暢播放與自適應位元率。M3U8 檔案就是整個邏輯的排程中心:
- 分片播放:將長影片切成若干數秒的小段,播放器按清單順序載入,節省記憶體並允許快速跳轉。
- 自適應位元率:用戶端根據當前網路頻寬,動態選擇不同位元率的子播放清單,實現無縫切換,避免卡頓。
- 直播與隨選:直播串流即時生成新的分片並更新 M3U8(刪除舊分片),缺少 #EXT-X-ENDLIST 表示內容仍在持續播放。
因此,M3U8 是 HLS 生態的基石,幾乎所有主流瀏覽器(透過原生 HLS 或 MSE 擴充)、行動裝置和智慧電視都原生支援這種格式。
如何播放 M3U8?
雖然瀏覽器預設不支援直接播放 .m3u8 連結(iOS/macOS 上的 Safari 除外),但我們可以藉助專用的播放器。如果你拿到一個 M3U8 位址想要快速驗證是否有效,推薦直接使用線上工具 M3U8Player,貼上連結即可開始播放,不需下載任何軟體,對開發除錯和一般使用者都很方便。
對於開發人員,也可以使用 HLS.js 等 JavaScript 函式庫在 Web 頁面中實現播放。但最簡單的測試方式仍是拖曳連結到 M3U8Player 中查看效果,省去建立環境的麻煩。
建立自己的 M3U8
產生 M3U8 的主要工具是 FFmpeg。一條典型指令:
ffmpeg -i input.mp4 -codec copy -hls_time 10 -hls_list_size 0 -hls_segment_filename "segment%d.ts" playlist.m3u8
這會產生 M3U8 檔案及對應的 TS 分片。更多進階選項(如加密、多碼率)可透過 FFmpeg 的 -hls_key_info_file 等參數實現。
總結
M3U8 是 HLS 串流協定的核心清單檔案,它以簡潔文字定義了影片分片的組織方式,實現了自適應位元率、直播與隨選的無縫銜接。了解 M3U8 的結構有助於我們排查播放問題、最佳化串流體驗。
當你遇到需要除錯或快速檢視 M3U8 影片的情況,記住 M3U8Player 這類線上工具可以讓你繞過環境設定,直接獲得播放結果。無論是初學者還是資深開發者,掌握 M3U8 的原理都會讓你對串流技術有更深入的理解。