讓Chrome看不了WWDC直播的HLS技術詳解

又拍雲發表於2017-06-07

 

Requirements: Live streaming uses Apple’s HTTP Live Streaming (HLS) technology. HLS requires an iPhone, iPad, or iPod touch with Safari on iOS 7.0 or later, a Mac with Safari 6.0.5 or later on OS X v10.8.5 or later, or a PC with Microsoft Edge on Windows 10. Streaming via Apple TV requires an Apple TV (2nd or 3rd generation) with software 6.2 or later or an Apple TV (4th generation).

HLS (HTTP Live Streaming), 是由 Apple 公司實現的基於 HTTP 的媒體流傳輸協議。Apple 的全系列產品支援,由於 HLS 是蘋果提出的, 所以在 Apple 的全系列產品包括 iphone、 ipad、safari 都不需要安裝任何外掛就可以原生支援播放 HLS, 現在Android 也加入了對 HLS 的支援。但PC端目前除了Microsoft Edge外,Chrome、Firefox等瀏覽器均不支援該協議的播放。

HLS跟 DASH 協議的原理非常類似,通過將整條流切割成一個小的可以通過 HTTP 下載的媒體檔案,然後提供一個配套的媒體列表檔案給客戶端,讓客戶端順序地拉取這些媒體檔案播放, 來實現看上去是在播放一條流的效果。HLS 目前廣泛地應用於點播和直播領域。
<video src="example.m3u8" controls></video>

在HTML5頁面上使用HLS

<video controls>
<source src=“example.m3u8”></source>
</video>

HLS 的優勢

  • 客戶端支援簡單,只需要支援 HTTP 請求即可,HTTP 協議無狀態,只需要按順序下載媒體片段即可。
  • 使用 HTTP 協議網路相容性好, HTTP 資料包也可以方便地通過防火牆或者代理伺服器,CDN 支援良好。
  • 自帶多位元速率自適應,Apple 在提出 HLS 時,就已經考慮了碼流自適應的問題。

HLS 的劣勢

  • 相比 RTMP 這類長連線協議,延時較高,難以用到互動直播場景。
  • 對於點播服務來說,由於 TS 切片通常較小,海量碎片在檔案分發、一致性快取、儲存等方面都有較大挑戰。
  • 雖然HLS存在明顯劣勢,又拍雲對此也有相應的解決方案。

HLS 協議詳解

 

上圖可以看出,HLS總共有三個部分: Serve、CDN、Client。HLS 協議的主要內容是關於 M3U8 這個文字協議,其實生成與解析都非常簡單,示例如下:

 


△簡單的 Media Playlist

 


△包含多種位元率的 Master Playlist

HLS優化技術

由於客戶端每次請求 TS 或 M3U8 有可能都是一個新的連線請求,所以,我們無法有效的標識客戶端,一旦出現問題,基本無法有效的定位問題,因此一般工業級的伺服器都會對傳統的 HLS 做一些改進。本文主要介紹又拍雲的 HLS+。
HLS+ ,又稱為流式 HLS 技術,是將標準的 HLS 進行流式處理,大幅度降低標準 HLS 延遲,H5 端直播相容性更好,且具有回源量小、系統簡單、排錯容易、防盜鏈、避免 HLS 404 等優勢。
1、Variant HLS
首先,下載一條又拍雲的 M3U8 檔案:
wget http://uplive.bo.upaiyun.com/live/loading.m3u8
然後,開啟下載得到的 playlist 檔案:

 

可以看出又拍雲的 HLS+ 也支援這種 Variant HLS 方式來標識一條 HLS 連線,可以看出,又拍雲使用 uuid 來表示一條 HLS 連線。

2、HTTP 302
首先,以 HTTP 302 方式來請求播放地址。

 

開啟 playlist 內容:

 

在跳轉之後的地址存放真正的 playlist,同時也能夠將 uuid 加入到了連線上。
總地來說,不管通過哪種方式,最終我們都能通過一個唯一的 id 來標識一條流,這樣在排查問題時就可以根據這個 id 來定位播放過程中的問題。

HLS 延時分析

 

為了追求低延時效果,可以將切片切的更小,取片間隔做的更小,播放器未取到 3 個片就啟動播放。但是這些優化方式都會增加 HLS 不穩定和出現錯誤的風險。

如何讓HLS能在Chrome等裝置上播放

目前直播大多采用HTTP(HLS、HTTP-FLV)和RTMP協議進行推流。我們可以通過CDN服務進行轉協議播放,無論採用HTTP還是RTMP協議推流,最終達到均支援 RTMP、HTTP-FLV 和 HLS 播放的效果。

Demo:

M3U8 golang library

https://godoc.org/github.com/osrtss/rtss/m3u8

HLS downloader: 讀取一個 m3u8 URL,下載為 TS 檔案。

https://github.com/osrtss/rtss/tree/master/m3u8/example/hlsdownloader

 

推薦閱讀:

WebSocket+MSE——HTML5 直播技術解析

IPv6啟動五年後,距離我們究竟還有多遠?

相關文章