本文博客地址:http://yangchao0033.github.io/blog/2016/01/29/hls-1/
蘋(píng)果官方對(duì)于視頻直播服務(wù)提出了 HLS 解決方案,該方案主要適用范圍在于:
- 使用 iPhone 仓坞、iPod touch背零、 iPad 以及 Apple TV 進(jìn)行流媒體直播功能。(MAC 也能用)
- 不使用特殊的服務(wù)軟件進(jìn)行流媒體直播无埃。
- 需要通過(guò)加密和鑒定(authentication)的視頻點(diǎn)播服務(wù)徙瓶。
首先,需要大家先對(duì) HLS 的概念進(jìn)行預(yù)覽录语。
HLS 的目的在于倍啥,讓用戶(hù)可以在蘋(píng)果設(shè)備(包括MAC OS X)上通過(guò)普通的網(wǎng)絡(luò)服務(wù)完成流媒體的播放。 HLS 同時(shí)支持流媒體的實(shí)時(shí)廣播和點(diǎn)播服務(wù)澎埠。同時(shí)也支持不同 bit 速率的多個(gè)備用流(平時(shí)根據(jù)當(dāng)前網(wǎng)速去自適應(yīng)視頻的清晰度)虽缕,這樣客戶(hù)端也好根據(jù)當(dāng)前網(wǎng)絡(luò)的帶寬去只能調(diào)整當(dāng)前使用的視頻流。安全方面蒲稳,HLS 提供了通過(guò) HTTPS 加密對(duì)媒體文件進(jìn)行加密 并 對(duì)用戶(hù)進(jìn)行驗(yàn)證氮趋,允許視頻發(fā)布者去保護(hù)自己的網(wǎng)絡(luò)。
HLS 是蘋(píng)果公司QuickTime X和iPhone軟件系統(tǒng)的一部分江耀。它的工作原理是把整個(gè)流分成一個(gè)個(gè)小的基于HTTP的文件來(lái)下載剩胁,每次只下載一些。當(dāng)媒體流正在播放時(shí)祥国,客戶(hù)端可以選擇從許多不同的備用源中以不同的速率下載同樣的資源昵观,允許流媒體會(huì)話(huà)適應(yīng)不同的數(shù)據(jù)速率。在開(kāi)始一個(gè)流媒體會(huì)話(huà)時(shí)舌稀,客戶(hù)端會(huì)下載一個(gè)包含元數(shù)據(jù)的extended M3U (m3u8) playlist文件啊犬,用于尋找可用的媒體流。
HLS只請(qǐng)求基本的HTTP報(bào)文壁查,與實(shí)時(shí)傳輸協(xié)議(RTP)不同觉至,HLS可以穿過(guò)任何允許HTTP數(shù)據(jù)通過(guò)的防火墻或者代理服務(wù)器。它也很容易使用內(nèi)容分發(fā)網(wǎng)絡(luò)來(lái)傳輸媒體流睡腿。
蘋(píng)果對(duì)于自家的 HLS 推廣也是采取了強(qiáng)硬措施语御,當(dāng)你的直播內(nèi)容持續(xù)十分鐘
或者每五分鐘內(nèi)超過(guò) 5 MB 大小時(shí)峻贮,你的 APP 直播服務(wù)必須采用 HLS 架構(gòu),否則不允許上架应闯。(詳情)
相關(guān)服務(wù)支持環(huán)境 (重要組成)
-
Adobe Flash Media Server
:從4.5開(kāi)始支持HLS纤控、Protected HLS(PHLS)。5.0改名為Adobe Media Server - Flussonic Media Server:2009年1月21日碉纺,版本3.0開(kāi)始支持VOD嚼黔、HLS、時(shí)移等惜辑。
- RealNetworks的
Helix Universal Server
:2010年4月唬涧,版本15.0開(kāi)始支持iPhone, iPad和iPod的HTTP直播、點(diǎn)播H.264/AAC內(nèi)容盛撑,最新更新在2012年11月碎节。 - 微軟的IIS Media Services:從4.0開(kāi)始支持HLS。
-
Nginx RTMP Module
:支持直播模式的HLS抵卫。 - Nimber Streamer
- Unified Streaming Platform
- VLC Media Player:從2.0開(kāi)始支持直播和點(diǎn)播HLS狮荔。
- Wowza Media Server:2009年12月9日發(fā)布2.0,開(kāi)始全面支持HLS介粘。
- VODOBOX Live Server:始支持HLS殖氏。
- Gstreamill是一個(gè)支持hls輸出的,基于gstreamer的實(shí)時(shí)編碼器姻采。
相關(guān)客戶(hù)端支持環(huán)境
- iOS從3.0開(kāi)始成為標(biāo)準(zhǔn)功能雅采。
- Adobe Flash Player從11.0開(kāi)始支持HLS。
- Google的Android自Honeycomb(3.0)開(kāi)始支持HLS慨亲。
- VODOBOX HLS Player (Android,iOS, Adobe Flash Player)
- JW Player (Adobe Flash player)
- Windows 10 的 EDGE 瀏覽器開(kāi)始支持HLS婚瓜。
其中輸入視頻源是由攝像機(jī)預(yù)先錄制好的。之后這些源會(huì)被編碼 MPEG-4
(H.264 video 和 AAC audio)格式然后用硬件打包到 MPEG-2
的傳輸流中刑棵。MPEG-2
傳輸流會(huì)被分散為小片段然后保存為一個(gè)或多個(gè)系列的 .ts 格式的媒體文件巴刻。這個(gè)過(guò)程需要借助編碼工具來(lái)完成,比如 Apple stream segmenter蛉签。
純音頻會(huì)被編碼為一些音頻小片段胡陪,通常為 ADTS頭的AAC、MP3碍舍、或者 AC-3格式柠座。
同時(shí)上面提到的那個(gè)切片器(segmenter)也會(huì)創(chuàng)建一個(gè)索引文件,通常會(huì)包含這些媒體文件的一個(gè)列表乒验,也能包含元數(shù)據(jù)愚隧。他一般都是一個(gè).M38U 個(gè)hi的列表蒂阱。列表元素會(huì)關(guān)聯(lián)一個(gè) URL 用于客戶(hù)端訪(fǎng)問(wèn)锻全。然后按序去請(qǐng)求這些 URL狂塘。
服務(wù)器端
服務(wù)端可以采用硬件編碼和軟件編碼兩種形式,其功能都是按照上文描述的規(guī)則對(duì)現(xiàn)有的媒體文件進(jìn)行切片并使用索引文件進(jìn)行管理鳄厌。而軟件切片通常會(huì)使用 Apple 公司提供的工具或者第三方的集成工具荞胡。
媒體編碼
媒體編碼器獲取到音視頻設(shè)備的實(shí)時(shí)信號(hào),將其編碼后壓縮用于傳輸了嚎。而編碼格式必須配置為客戶(hù)端所支持的格式泪漂,比如 H.264 視頻和HE-AAC 音頻。當(dāng)前歪泳,支持 用于視頻的 MPEG-2 傳輸流和 純音頻 MPEG 基本流萝勤。編碼器通過(guò)本地網(wǎng)絡(luò)將 MPEG-2 傳輸流分發(fā)出去,送到流切片器那里呐伞。標(biāo)準(zhǔn)傳輸流和壓縮傳輸流無(wú)法混合使用敌卓。傳輸流可以被打包成很多種不同的壓縮格式,這里有兩個(gè)表詳細(xì)列舉了支持的壓縮格式類(lèi)型伶氢。
[重點(diǎn)]在編碼中圖趟径,不要修改視頻編碼器的設(shè)置,比如視頻大小或者編碼解碼器類(lèi)型癣防。如果避免不了蜗巧,那修改動(dòng)作必須發(fā)生在一個(gè)片段邊界。并且需要早之后相連的片段上用 EXT-X-DISCONTINUITY
進(jìn)行標(biāo)記蕾盯。
流切片器
流切片器(通常是一個(gè)軟件)會(huì)通過(guò)本地網(wǎng)絡(luò)從上面的媒體編碼器中讀取數(shù)據(jù)幕屹,然后將著這些數(shù)據(jù)一組相等時(shí)間間隔的 小
媒體文件。雖然沒(méi)一個(gè)片段都是一個(gè)單獨(dú)的文件级遭,但是他們的來(lái)源是一個(gè)連續(xù)的流香嗓,切完照樣可以無(wú)縫重構(gòu)回去。
切片器在切片同時(shí)會(huì)創(chuàng)建一個(gè)索引文件装畅,索引文件會(huì)包含這些切片文件的引用靠娱。每當(dāng)一個(gè)切片文件生成后,索引文件都會(huì)進(jìn)行更新掠兄。索引用于追蹤切片文件的有效性和定位切片文件的位置像云。切片器同時(shí)也可以對(duì)你的媒體片段進(jìn)行加密并且創(chuàng)建一個(gè)密鑰文件作為整個(gè)過(guò)程的一部分。
文件切片器(相對(duì)于上面的流切片器)
如果已近有編碼后的文件(而不是編碼流)蚂夕,你可以使用文件切片器迅诬,通過(guò)它對(duì)編碼后的媒體文件進(jìn)行 MPEG-2 流的封裝并且將它們分割為等長(zhǎng)度的小片段。切片器允許你使用已經(jīng)存在的音視頻庫(kù)用于 HLS 服務(wù)婿牍。它和流切片器的功能相似侈贷,但是處理的源從流替換流為了文件。
媒體片段文件
媒體片段是由切片器生成的等脂,基于編碼后的媒體源俏蛮,并且是由一系列的 .ts
格式的文件組成撑蚌,其中包含了你想通過(guò) MPEG-2 傳送流攜帶的 H.264 視頻 和 AAC
/MP3/AC-3 音頻。對(duì)于純音頻的廣播搏屑,切片器可以生產(chǎn) MPEG 基礎(chǔ)音頻流争涌,其中包含了 ADTS頭的AAC、MP3辣恋、或者AC3等音頻亮垫。
索引文件(PlayLists)
通常由切片器附帶生成,保存為 .M3U8
格式伟骨,.m3u
一般用于 MP3 音頻的索引文件饮潦。
Note如果你的擴(kuò)展名是.m3u,并且系統(tǒng)支持.mp3文件,那客戶(hù)的軟件可能要與典型的 MP3 playList 保持一致來(lái)完成 流網(wǎng)絡(luò)音頻的播放携狭。
下面是一個(gè) .M3U8
的 playlist 文件樣例害晦,其中包含了三個(gè)沒(méi)有加密的十秒鐘的媒體文件:
#EXT-X-VERSION:3
#EXTM3U
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:1
# Old-style integer duration; avoid for newer clients.
#EXTINF:10,
http://media.example.com/segment0.ts
# New-style floating-point duration; use for modern clients.
#EXTINF:10.0,
http://media.example.com/segment1.ts
#EXTINF:9.5,
http://media.example.com/segment2.ts
#EXT-X-ENDLIST
為了更精確,你可以在 version 3 或者之后的協(xié)議版本中使用 float 數(shù)來(lái)標(biāo)記媒體片段的時(shí)長(zhǎng)暑中,并且要明確寫(xiě)明版本號(hào)壹瘟,如果沒(méi)有版本號(hào),則必須與 version 1 協(xié)議保持一致鳄逾。你可以使用官方提供的切片器去生產(chǎn)各種各樣的 playlist 索引文件稻轨,詳見(jiàn) 媒體文件切片器
分布式部分
分布式系統(tǒng)是一個(gè)網(wǎng)絡(luò)服務(wù)或者一個(gè)網(wǎng)絡(luò)緩存系統(tǒng),用于通過(guò) HTTP 向客戶(hù)端發(fā)送媒體文件和索引文件雕凹。不用自定義模塊發(fā)送內(nèi)容殴俱。通常僅僅需要很簡(jiǎn)單的網(wǎng)絡(luò)配置即可使用。而且這種配置一般就是限制指定 .M38U 文件和 .ts 文件的 MIME 類(lèi)型枚抵。詳見(jiàn) 部署 HTTP Live Streaming
客戶(hù)端部分
客戶(hù)端開(kāi)始時(shí)回去抓取 索引文件(.m3u8/.m3u)线欲,其中用URL來(lái)標(biāo)記不同的流。索引文件可以指定可用媒體文件的位置汽摹,解密的密鑰李丰,以及任何可以切換的流。對(duì)于選中的流逼泣,客戶(hù)端會(huì)有序的下載每一個(gè)可獲得的文件趴泌。每一個(gè)文件都包含流中的連環(huán)碎片。一旦下載到足夠量的數(shù)據(jù)拉庶,客戶(hù)端會(huì)開(kāi)始向用戶(hù)展示重新裝配好的媒體資源嗜憔。
客戶(hù)端負(fù)責(zé)抓取任何解密密鑰,認(rèn)證或者展示一個(gè)用于認(rèn)證的界面氏仗,之后再解密需要的文件吉捶。
這個(gè)過(guò)程會(huì)一直持續(xù)知道出現(xiàn) 結(jié)束標(biāo)記 #EXT-X-ENDLIST
。如果結(jié)束標(biāo)記不出現(xiàn),該索引就是用于持續(xù)廣播的呐舔”依客戶(hù)端會(huì)定期的加載一些新的索引文件∽淘纾客戶(hù)端會(huì)從新更新的索引文件中去查找加密密鑰并且將關(guān)聯(lián)的URL加入到請(qǐng)求隊(duì)列中去。
HLS 的使用
使用 HLS 需要使用一些工具砌们,當(dāng)然大部分工具都是服務(wù)器端使用的杆麸,這里簡(jiǎn)單了解一下就行,包括 media stream segmenter, a media file segmenter, a stream validator, an id3 tag generator, a variant playlist generator.這些工具用英文注明是為了當(dāng)你在蘋(píng)果開(kāi)發(fā)中心中尋找時(shí)方便一些浪感。
會(huì)話(huà)模式
通常包含 Live 和 VOD (點(diǎn)播)兩種
點(diǎn)播VOD的特點(diǎn)就是可以獲取到一個(gè)靜態(tài)的索引文件昔头,其中那個(gè)包含一套完整的資源文件地址。這種模式允許客戶(hù)端訪(fǎng)問(wèn)全部節(jié)目影兽。VOD點(diǎn)播擁有先進(jìn)的下載技術(shù)揭斧,包括加密認(rèn)證技術(shù)和動(dòng)態(tài)切換文件傳輸速率的功能(通常用于不同分辨率視頻之間的切換)。
Live 會(huì)話(huà)就是實(shí)時(shí)事件的錄制展示峻堰。它的索引文件一直處于動(dòng)態(tài)變化的讹开,你需要不斷的更新索引文件 playlist 然后移除舊的索引文件。這種類(lèi)型通過(guò)向索引文件添加媒體地址可以很容易的轉(zhuǎn)化為VOD類(lèi)型捐名。在轉(zhuǎn)化時(shí)不要移除原來(lái)舊的源旦万,而是通過(guò)添加一個(gè) #ET-X-ENDLIST
標(biāo)記來(lái)終止實(shí)時(shí)事件。轉(zhuǎn)化時(shí)如果你的索引文件中包含 EXT-X-PLAYLIST-TYPE
標(biāo)簽镶蹋,你需要將值從 EVENT
改為 VOD
成艘。
ps:自己抓了一個(gè)直播的源,從索引中看到的結(jié)果是第一次回抓到代表不同帶寬的playList(抓取地址:http://dlhls.cdn.zhanqi.tv/zqlive/34338_PVMT5.m3u8
)
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-STREAM-INF:PROGRAM-ID=1,PUBLISHEDTIME=1453914627,CURRENTTIME=1454056509,BANDWIDTH=700000,RESOLUTION=1280x720
34338_PVMT5_700/index.m3u8?Dnion_vsnae=34338_PVMT5
#EXT-X-STREAM-INF:PROGRAM-ID=1,PUBLISHEDTIME=1453914627,CURRENTTIME=1454056535,BANDWIDTH=400000
34338_PVMT5_400/index.m3u8?Dnion_vsnae=34338_PVMT5
#EXT-X-STREAM-INF:PROGRAM-ID=1,PUBLISHEDTIME=1453914627,CURRENTTIME=1454056535,BANDWIDTH=1024000
34338_PVMT5_1024/index.m3u8?Dnion_vsnae=34338_PVMT5
這里面的鏈接不是視頻源URL贺归,而是一個(gè)用于流切換的主索(下面會(huì)有介紹)引我猜想是需要對(duì)上一次的抓包地址做一個(gè)拼接
組合的結(jié)果就是:http://dlhls.cdn.zhanqi.tv/zqlive/34338_PVMT5_1024/index.m3u8?Dnion_vsnae=34338_PVMT5
(純屬小學(xué)智力題淆两。。拂酣。)將它作為抓取地址再一次的結(jié)果
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-MEDIA-SEQUENCE:134611
#EXT-X-TARGETDURATION:10
#EXTINF:9.960,
35/1454056634183_128883.ts?Dnion_vsnae=34338_PVMT5
#EXTINF:9.960,
35/1454056644149_128892.ts?Dnion_vsnae=34338_PVMT5
#EXTINF:9.960,
35/1454056654075_128901.ts?Dnion_vsnae=34338_PVMT5
同理秋冰,繼續(xù)向下抓:(拼接地址:http://dlhls.cdn.zhanqi.tv/zqlive/34338_PVMT5_1024/index.m3u8?Dnion_vsnae=34338_PVMT5/35/1454056634183_128883.ts?Dnion_vsnae=34338_PVMT5/36/1454059958599_131904.ts?Dnion_vsnae=34338_PVMT5
)
抓取結(jié)果:
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-MEDIA-SEQUENCE:134984
#EXT-X-TARGETDURATION:10
#EXTINF:9.280,
36/1454059988579_131931.ts?Dnion_vsnae=34338_PVMT5
#EXTINF:9.960,
36/1454059998012_131940.ts?Dnion_vsnae=34338_PVMT5
#EXTINF:9.960,
36/1454060007871_131949.ts?Dnion_vsnae=34338_PVMT5
相比于第二次又獲取了一個(gè)片段的索引,而且只要是第二次之后婶熬,資源地址都會(huì)包含 .ts
丹莲,說(shuō)明里面是有視頻資源URL的,不過(guò)具體的截取方法還是需要查看前面提到的IETF的那套標(biāo)準(zhǔn)的HLS的協(xié)議尸诽,利用里面的協(xié)議應(yīng)該就能拼接出完整的資源路徑進(jìn)行下載甥材。反正我用蘋(píng)果自帶的MPMoviePlayerController直接播放是沒(méi)有問(wèn)題的,的確是直播資源性含。與之前說(shuō)過(guò)的蘋(píng)果自帶的QuickTime類(lèi)似洲赵,都遵循了HLS協(xié)議用于流媒體播放。而每次通過(guò)拼接獲取下一次的索引,符合協(xié)議里提到的不斷的更替索引的動(dòng)作叠萍。
內(nèi)容加密
如果內(nèi)容需要加密芝发,你可以在索引文件中找到密鑰的相關(guān)信息。如果索引文件中包含了一個(gè)密鑰文件的信息苛谷,那接下來(lái)的媒體文件就必須使用密鑰解密后才能解密打開(kāi)了辅鲸。當(dāng)前的 HLS 支持使用16-octet 類(lèi)型密鑰的 AES-128 加密。這個(gè)密鑰格式是一個(gè)由著在二進(jìn)制格式中的16個(gè)八進(jìn)制組的數(shù)組打包而成的腹殿。
加密的配置模式通常包含三種:
- 模式一:允許你在磁盤(pán)上制定一個(gè)密鑰文件路徑独悴,切片器會(huì)在索引文件中插入存在的密鑰文件的 URL。所有的媒體文件都使用該密鑰進(jìn)行加密锣尉。
- 模式二:切片器會(huì)生成一個(gè)隨機(jī)密鑰文件刻炒,將它保存在指定的路徑,并在索引文件中引用它自沧。所有的媒體文件都會(huì)使用這個(gè)隨機(jī)密鑰進(jìn)行加密坟奥。
- 模式三:每 n 個(gè)片段生成一個(gè)隨機(jī)密鑰文件,并保存到指定的位置拇厢,在索引中引用它爱谁。這個(gè)模式的密鑰處于輪流加密狀態(tài)。每一組 n 個(gè)片段文件會(huì)使用不同的密鑰加密孝偎。
理論上管行,不定期的碎片個(gè)數(shù)生成密鑰會(huì)更安全,但是定期的生成密鑰不會(huì)對(duì)系統(tǒng)的性能產(chǎn)生太大的影響邪媳。
你可以通過(guò) HTTP 或者 HTTPS 提供密鑰捐顷。也可以選擇使用你自己的基于會(huì)話(huà)的認(rèn)證安排去保護(hù)發(fā)送的key。更多詳情可以參考 通過(guò) HTTPS 安全的提供預(yù)約
密鑰文件需要一個(gè) initialization vector (IV) 去解碼加密的媒體文件雨效。IV 可以隨著密鑰定期的改變迅涮。
緩存和發(fā)送協(xié)議
HTTPS通常用于發(fā)送密鑰,同時(shí)徽龟,他也可以用于平時(shí)的媒體片段和索引文件的傳輸叮姑。但是當(dāng)擴(kuò)展性更重要時(shí),這樣做是不推薦的据悔。HTTPS 請(qǐng)求通常都是繞開(kāi) web 服務(wù)緩存传透,導(dǎo)致所有內(nèi)容請(qǐng)求都是通過(guò)你的服務(wù)進(jìn)行轉(zhuǎn)發(fā),這有悖于分布式網(wǎng)絡(luò)連接系統(tǒng)的目的极颓。
處于這個(gè)原因朱盐,確保你發(fā)送的網(wǎng)絡(luò)內(nèi)容都明白非常重要。當(dāng)處于實(shí)況廣播模式時(shí)索引文件不會(huì)像分片媒體文件一樣長(zhǎng)時(shí)間的被緩存菠隆,他會(huì)動(dòng)態(tài)不停地變化兵琳。
流切換
如果你的視頻具備流切換功能狂秘,這對(duì)于用戶(hù)來(lái)說(shuō)是一個(gè)非常棒的體驗(yàn),處于不同的帶寬躯肌、不同的網(wǎng)速播放不同清晰度的視頻流者春,這樣只能的流切換可以保證用戶(hù)感覺(jué)到非常流暢的觀(guān)影體驗(yàn),同時(shí)不同的設(shè)備也可以作為選擇的條件清女,比如視網(wǎng)膜屏可以再網(wǎng)速良好的情況下播放清晰度更高的視頻流钱烟。
這種功能的實(shí)現(xiàn)在于,索引文件的特殊結(jié)構(gòu)
有別于普通的索引嫡丙,具備流熱切換的索引通常由主索引和鏈接不同帶寬速率的資源的子索引拴袭,由子索引再鏈接對(duì)引得.ts視頻切片文件。其中主索引只下載一次迄沫,而子索引則會(huì)不停定期的下載稻扬,通常會(huì)先使用主索引中列出的第一個(gè)子索引卦方,之后才會(huì)根據(jù)當(dāng)時(shí)的網(wǎng)絡(luò)情況去動(dòng)態(tài)切換合適的流羊瘩。客戶(hù)端會(huì)在任何時(shí)間去切換不同的流盼砍。比如連入或者退出一個(gè) wifi 熱點(diǎn)尘吗。所有的切換都會(huì)使用相同的音頻文件(換音頻沒(méi)多大意思相對(duì)于視頻)在不同的流之間平滑的進(jìn)行切換。
這一套不同速率的視頻都是有工具生成的浇坐,使用variantplaylistcreator
工具并且為 mediafilesegmenter
或者 mediastreamsegmenter
指定 -generate-variant-playlist 選項(xiàng),詳情參考 下載工具
概念先寫(xiě)到這吧睬捶,前面的知識(shí)夠?qū)SL的整體結(jié)構(gòu)做一個(gè)初步的了解。
后面一篇博客會(huì)結(jié)合代碼對(duì)整個(gè)流程進(jìn)行說(shuō)明近刘。