M3U8 和 HLS 有什麼關係?一篇看懂串流媒體協定

老實說,我一開始接觸到 m3u8 這玩意兒的時候,整個人是懵的。

事情是這樣的,有次我想下載某個網站的影片,抓封包看了半天,發現影片網址不是常見的 .mp4,而是一個以 .m3u8 結尾的連結。我當下心想,這什麼東西?點開一看,裡面全是密密麻麻的文字,不是程式碼勝似程式碼,找半天也沒找到一個完整的影片檔。

後來才搞懂,這是 HLS 協定搞的鬼。

HLS,全名 HTTP Live Streaming,翻成中文就是「HTTP 直播串流」。這玩意兒是蘋果公司推出來的一套串流媒體傳輸協定,原本是為了給 iPhone 和 iPad 播影片用的,後來因為太好用,Android、網頁端全都跟上了,慢慢就成了影片直播和隨選視訊的主流方案。

那 M3U8 又是啥?它和 HLS 到底是什麼關係?

這麼說吧,HLS 是規則,是整套的影片傳輸方案。而 M3U8 只是這套方案裡的一個「清單檔案」,你可以把它理解成一張菜單。

HLS 有個核心概念,就是不把整支影片一次性地傳給你,而是先把影片切成一堆幾秒鐘的小片段,比如一支 10 分鐘的影片,會被切成 100 來個硬幣大小的小分片檔案,這些分片通常以 .ts 結尾。傳輸的時候,你的播放器一邊下載小碎片,一邊播放,播完一塊接著下一塊,無縫銜接。

那問題來了,播放器怎麼知道先去下載哪一塊、後下載哪一塊?這就輪到 M3U8 出場了。M3U8 的內容就是一串串連結和位址,清清楚楚地寫著:這段影片總共有多少片、每一片對應哪個 URL、該按什麼順序播放。

說白了,M3U8 就是 HLS 的導航圖。沒有這張圖,你的播放器面對一堆亂序的 .ts 檔案,根本無從下手。

M3U8 這個名字本身也有點來頭。M3U 是早期就有的音訊播放清單格式,在 MP3 播放器爆紅的年代,大家用它來管理歌單。後來 HLS 沿用了這個格式,但因為要支援 UTF-8 編碼,所以在 M3U 後面加了一個「8」,成了 M3U8。所以說穿了,M3U8 就是一個更進階的播放清單檔案。

平時你在網路上看直播,或者看某些影音平台的非會員內容,背後的技術大概就是 HLS。哪怕你看著網址列裡全是 .mp4,實際上播放器內部轉換之後,走的很可能是 HLS + M3U8 這一套。

我記得有一段時間我特別迷各種 IPTV 源,折騰過不少電視直播的播放器。那些論壇裡分享的直播源,經常就是一串 m3u8 的連結,丟進播放器裡就能直接看。有些源不穩定,看一會兒就卡,弄來弄去,最後我索性找了個網頁版播放器 M3U8Player(https://m3u8player.link/)就圖個省事。它們還支援直播串流和本地檔案的解析,上次幫我媽找某個地方電視台的源,就是靠它搞定的——直接貼上連結就能播,省得下載一堆軟體。

老實說,HLS 這個協定為什麼能玩得轉,聰明就聰明在它把複雜的東西拆小了。一個巨大的影片檔,如果直接傳,網路一抖動就可能整個卡死。但切成一小片一小片的,哪怕某一小片沒下載好,大不了重新請求一次,對整體播放影響不大。而且它還支援位元速率自適應,網路差的時候自動切換低畫質的片段,保證你能看,不至於全程轉圈圈。

當然了,這也不代表 HLS 沒缺點。它天生有延遲,直播的時候通常比傳統 RTMP 慢個幾秒甚至十幾秒。但對於大多數情境,比如看影片、追劇、回放、非即時性的直播,這個延遲完全能接受。

所以,以後再看到某個影片網址是 .m3u8 結尾的,你就知道,這裡面的影片其實是被拆成了無數小碎片,藏在伺服器上,M3U8 就是那張「藏寶圖」。你只要把這張圖交給一個支援 HLS 的播放器,它就會自動按圖索驥,把一串碎片拼起來,最終呈現出完整流暢的畫面。