天天看點

如何生成HLS協定的M3U8檔案

什麼是HLS協定:

HLS(Http Live Streaming)是由Apple公司定義的用于實時流傳輸的協定,HLS基于HTTP協定實作,傳輸内容包括兩部分,一是M3U8描述檔案,二是TS媒體檔案。

HLS協定應用:

由于傳輸層協定隻需要标準的 HTTP 協定, HLS 可以友善的透過防火牆或者代理伺服器, 而且可以很友善的利用CDN進行分發加速, 這樣就可以很友善的解決大規模應用的瓶頸。并且用戶端實作起來也容易。

HLS 目前廣泛地應用于點播和直播領域,HLS協定是将音視訊流通過HTTP協定傳輸出去,實作視訊直播,HLS協定實作是關鍵。尤其目前直播領域的手機移動端的直播協定,基本上都是采用了蘋果公司的HLS協定。可以說這個協定的出現解決了移動端的直播播放問題。

HLS協定架構圖:

如何生成HLS協定的M3U8檔案

M3U8檔案的生成和解析:

HLS 協定的主要内容是關于 M3U8 這個文本協定的, 其實生成與解析都非常簡單。下面是給出實際應用的例子:

Media Playlist (媒體播放清單)

如何生成HLS協定的M3U8檔案

·         HLS 通過 URI(RFC3986) 指向的一個 Playlist 來表示一個媒體流。

·         一個 Playlist 可以是一個 Media Playlist 或者 Master Playlist, 使用 UTF-8 編碼的文本檔案, 包含一些 URI 跟描述性的 tags。

·         一個 Media Playlist 包含一個 Media Segments 清單,當順序播放時, 能播放整個完整的流。

·         要想播放這個 Playlist, 用戶端需要首先下載下傳他, 然後播放裡面的每一個 Media Segment。

·         更加複雜的情況是, Playlist 是一個 Master Playlist, 包含一個 Variant Stream 集合, 通常每個 Variant Stream 裡面是同一個流的多個不同版本(如: 分辨率, 碼率不同)。

HLS Media Segments

·         每一個 Media Segment 通過一個 URI 指定, 可能包含一個 byte range。

·         每一個 Media Segment 的 duration 通過 EXTINF tag 指定。

·         每一個 Media Segment 有一個唯一的整數 Media Segment Number。

·         有些媒體格式需要一個 format-specific sequence 來初始化一個 parser, 在 Media Segment 被 parse 之前. 這個字段叫做 Media Initialization Section, 通過 EXT-X-MAP tag 來指定。

HLS 的優勢

用戶端支援簡單, 隻需要支援 HTTP 請求即可, HTTP 協定無狀态, 隻需要按順序下載下傳媒體片段即可。

使用 HTTP 協定網絡相容性好, HTTP 資料包也可以友善地通過防火牆或者代理伺服器, CDN 支援良好。

Apple 的全系列産品支援, 由于 HLS 是蘋果提出的, 是以在 Apple 的全系列産品包括 iphone, ipad, safari 都不需要安裝任何插件就可以原生支援播放 HLS, 現在, Android 也加入了對 HLS 的支援。

自帶多碼率自适應, Apple 在提出 HLS 時, 就已經考慮了碼流自适應的問題。

HLS 的劣勢

相比 RTMP 這類長連接配接協定, 延時較高, 難以用到互動直播場景。

對于點播服務來說, 由于 TS 切片通常較小, 海量碎片在檔案分發, 一緻性緩存, 存儲等方面都有較大挑戰。

HLS 延時問題

HLS 理論延時 = 1 個切片的時長 + 0-1個 td (td 是 EXT-X-TARGETDURATION, 可簡單了解為播放器取片的間隔時間) + 0-n 個啟動切片(蘋果官方建議是請求到 3 個片之後才開始播放) + 播放器最開始請求的片的網絡延時(網絡連接配接耗時)。為了追求低延時效果, 可以将切片切的更小, 取片間隔做的更小, 播放器未取到 3 個片就啟動播放. 但是, 這些優化方式都會增加 HLS 不穩定和出現錯誤的風險。

如今很多流媒體直播系統廠商都使用了HLS協定來解決安卓手機和蘋果手機端的播放問題。自動生成有效的直播視訊的M3U8播放連結位址,也就是HLS協定的M3U8的檔案以便在第三方支援M3U8的播放器上流暢播放如VLC播放器或者和HTML5的網頁技術結合通過移動端的浏覽器網頁觀看直播視訊。

如何生成HLS協定的M3U8檔案

示例播放代碼如下:

嵌入網頁的HTML代碼

<script type="text/javascript" src="http://192.168.1.44:8083/assets/player.js"></script><script type="text/javascript">p2ps_embed("hls", "live", "http://192.168.1.44:8083/videos/live/22/39/tUabV17nAPCev", "p2ps_video", "640", "480", "10.1.0", "http://192.168.1.44:8083/assets/expressInstall.swf",{}, {allowFullScreen:true, allowScriptAccess: "always"});</script><div id="p2ps_video"><h1>我們需要Flash player 10.1 或以上版本來播放。</h1><p><a href="http://www.adobe.com/go/getflashplayer" target="_blank" rel="external nofollow" ><img src="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif" alt="安裝最新的Flash player" /></a></p></div>      

移動端M3U8連結

http://192.168.1.44:8083/videos/live/22/39/tUabV17nAPCev/tUabV17nAPCev.M3U8      

繼續閱讀