什麼是 m3u8 協定
如果只說一句话:m3u8 就是一份“播放清單”。它用 UTF‑8 编碼的纯文本,把很多小的音影片分片按顺序列出來,讓播放器知道「下一段影片去哪儿拉」。
你在瀏覽器裡開啟 m3u8,其实看到的就是一堆帶 # 的標簽行,再加上一行一行的分片位址,看上去有点像“配置檔案”。但對播放器來說,這就是完整的播放說明书。
m3u / m3u8 的關係
很多人會把 .m3u 和 .m3u8 搞混,它們的關係大概可以這樣理解:
- .m3u:老牌播放列表格式,早期常配合 Winamp、千千静聽那一代播放器,主要列 MP3 歌曲,编碼不限。
- .m3u8:在 m3u 基础上统一规定為 UTF‑8 编碼,更適合 Web 和跨平台使用,是 HLS 裡默認的播放列表格式。
所以,你可以把 m3u8 看成是“更現代、更互联网友好”的 m3u 版本。
m3u8 在 HLS 裡的角色
在 HLS 協定裡,一路上有三個主角:
- 一個是 m3u8 播放列表——负责“排队”和“說明书”;
- 一個是 TS / fMP4 等媒體分片——真正的影片資料;
- 一個是 播放器或 SDK——按說明书的顺序去挨個拉分片、解碼、播放。
大致流程可以简單画成這樣:
- 1)播放器先发 HTTP 請求拿到 m3u8 檔案;
- 2)解析裡面的標簽和分片 URL,算出應該從哪一片開始播;
- 3)按顺序請求分片,邊下邊解碼,邊解碼邊往屏幕上画;
- 4)如果有多套畫質,就在不同的 m3u8 之間切換,實現自适应碼率。
一個最简單的 m3u8 長什麼樣
下面是一個非常简化的例子,真实环境中會比這复杂一些,但结构是類似的:
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:6
#EXTINF:5.92,
segment001.ts
#EXTINF:5.88,
segment002.ts
#EXTINF:5.90,
segment003.ts
#EXT-X-ENDLIST
可以看到,標簽行都以 # 开標頭,而真正的資源位址就是中間那幾行 segmentxxx.ts。
為什麼我們关心的是“列表”,不是“單個檔案”
很多人第一次用 m3u8 線上播放器,习惯性會去找「一個 mp4 位址」;但在 HLS 的世界裡,更推荐的做法是拿到 m3u8,讓播放器自己去處理各種碼率、分片和重试逻辑。
對你來說,m3u8 帶來的直接好處有:
- 網路不好時,播放器可以主動降畫質而不是直接卡死;
- 長影片可以按分片載入,快進時無需從標頭下載;
- CDN 可以更好地快取热点分片,整體更省帶寬。
理解了這些,再回標頭看我們的線上播放器輸入框,其实你填进去的不是“影片檔案”,而是“一個影片的播放计划书”。