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 檔案就是整個邏輯的排程中心:

  1. 分片播放:將長影片切成若干數秒的小段,播放器按清單順序載入,節省記憶體並允許快速跳轉。
  2. 自適應位元率:用戶端根據當前網路頻寬,動態選擇不同位元率的子播放清單,實現無縫切換,避免卡頓。
  3. 直播與隨選:直播串流即時生成新的分片並更新 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 的原理都會讓你對串流技術有更深入的理解。