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).git
HLS (HTTP Live Streaming), 是由 Apple 公司實現的基於 HTTP 的媒體流傳輸協議。Apple 的全系列產品支持,因爲 HLS 是蘋果提出的, 因此在 Apple 的全系列產品包括 iphone、 ipad、safari 都不須要安裝任何插件就能夠原生支持播放 HLS, 如今Android 也加入了對 HLS 的支持。但PC端目前除了Microsoft Edge外,Chrome、Firefox等瀏覽器均不支持該協議的播放。github
HLS跟 DASH 協議的原理很是相似,經過將整條流切割成一個小的能夠經過 HTTP 下載的媒體文件,而後提供一個配套的媒體列表文件給客戶端,讓客戶端順序地拉取這些媒體文件播放, 來實現看上去是在播放一條流的效果。HLS 目前普遍地應用於點播和直播領域。<video src="example.m3u8" controls></video>
golang
在HTML5頁面上使用HLS瀏覽器
<video controls> <source src=「example.m3u8」></source> </video>
上圖能夠看出,HLS總共有三個部分: Serve、CDN、Client。HLS 協議的主要內容是關於 M3U8 這個文本協議,其實生成與解析都很是簡單,示例以下:緩存
△簡單的 Media Playlist服務器
△包含多種比特率的 Master Playlist網絡
因爲客戶端每次請求 TS 或 M3U8 有可能都是一個新的鏈接請求,因此,咱們沒法有效的標識客戶端,一旦出現問題,基本沒法有效的定位問題,所以通常工業級的服務器都會對傳統的 HLS 作一些改進。本文主要介紹又拍雲的 HLS+。
HLS+ ,又稱爲流式 HLS 技術,是將標準的 HLS 進行流式處理,大幅度下降標準 HLS 延遲,H5 端直播兼容性更好,且具備回源量小、系統簡單、排錯容易、防盜鏈、避免 HLS 404 等優點。
一、Variant HLS
首先,下載一條又拍雲的 M3U8 文件:
wget http://uplive.bo.upaiyun.com/live/loading.m3u8
而後,打開下載獲得的 playlist 文件:iphone
能夠看出又拍雲的 HLS+ 也支持這種 Variant HLS 方式來標識一條 HLS 鏈接,能夠看出,又拍雲使用 uuid 來表示一條 HLS 鏈接。ide
二、HTTP 302
首先,以 HTTP 302 方式來請求播放地址。優化
打開 playlist 內容:
在跳轉以後的地址存放真正的 playlist,同時也可以將 uuid 加入到了鏈接上。
總地來講,無論經過哪一種方式,最終咱們都能經過一個惟一的 id 來標識一條流,這樣在排查問題時就能夠根據這個 id 來定位播放過程當中的問題。
爲了追求低延時效果,能夠將切片切的更小,取片間隔作的更小,播放器未取到 3 個片就啓動播放。可是這些優化方式都會增長 HLS 不穩定和出現錯誤的風險。
目前直播大多采用HTTP(HLS、HTTP-FLV)和RTMP協議進行推流。咱們能夠經過CDN服務進行轉協議播放,不管採用HTTP仍是RTMP協議推流,最終達到均支持 RTMP、HTTP-FLV 和 HLS 播放的效果。
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)