1. 程式人生 > >如何生成HLS協議的M3U8文件

如何生成HLS協議的M3U8文件

開始 ive script ont 但是 例子 play 不同版本 init

什麽是HLS協議:

HLSHttp Live Streaming是由Apple公司定義的用於實時流傳輸的協議,HLS基於HTTP協議實現,傳輸內容包括兩部分,一是M3U8描述文件,二是TS媒體文件。

HLS協議應用:

由於傳輸層協議只需要標準的 HTTP 協議, HLS 可以方便的透過防火墻或者代理服務器, 而且可以很方便的利CDN進行分發加速, 這樣就可以很方便的解決大規模應用的瓶頸。並且客戶端實現起來也容易。

HLS 目前廣泛地應用於點播和直播領域,HLS協議是將音視頻流通過HTTP協議傳輸出去,實現視頻直播,HLS協議實現是關鍵。尤其目前直播領域的手機移動端的直播協議,基本上都是采用了蘋果公司的

HLS協議。可以說這個協議的出現解決了移動端的直播播放問題。

HLS協議架構圖:

技術分享

M3U8文件的生成和解析:

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

Media Playlist (媒體播放列表)

技術分享

  • 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的網頁技術結合通過移動端的瀏覽器網頁觀看直播視頻。

技術分享

示例播放代碼如下:

嵌入網頁的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"><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

如何生成HLS協議的M3U8文件