這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
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 資料包也可以方便地通過防火牆或者Proxy 伺服器,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)