HTTP Live Streaming (HLS) - 概念

先貼出一系列參考網(wǎng)站 :

  1. 蘋果官方文檔
  2. HLS-iOS視頻播放服務(wù)架構(gòu)深入探究
  3. HLS標(biāo)準(zhǔn)協(xié)議

概念解釋 :

***HLS是一套解決方案, 包含三個(gè)部分 : ***

蘋果官方文檔的配圖

Server :
服務(wù)器組件負(fù)責(zé)獲取的媒體輸入流 , 然后Media編碼后 MPEG-4(H.264 video 和 AAC audio)格式然后用硬件打包到 MPEG-2 (MPEG-2 transport stream)的傳輸流中。圖中顯示,傳輸流會(huì)經(jīng)過(guò)stream segmenter, 這里的工作是MPEG-2傳輸流會(huì)被分散為小片段然后保存為一個(gè)或多個(gè)系列的 .ts 格式的媒體文件。這個(gè)過(guò)程需要借助編碼工具來(lái)完成,比如 Apple stream segmenter。
(視頻類是.ts文件,純音頻會(huì)被編碼為一些音頻小片段,通常為 ADTS頭的AAC、MP3、或者 AC-3格式。)
服務(wù)端可以采用硬件編碼和軟件編碼兩種形式,其功能都是按照上文描述的規(guī)則對(duì)現(xiàn)有的媒體文件進(jìn)行切片并使用索引文件進(jìn)行管理。而軟件切片通常會(huì)使用 Apple 公司提供的工具或者第三方的集成工具。

Distribution :
同時(shí)上面提到的那個(gè)切片器(segmenter)也會(huì)創(chuàng)建一個(gè)索引文件,通常會(huì)包含這些媒體文件的一個(gè)列表,也能包含元數(shù)據(jù)。他一般都是一個(gè).M38U 個(gè)hi的列表。列表元素會(huì)關(guān)聯(lián)一個(gè) URL 用于客戶端訪問(wèn)。然后按序去請(qǐng)求這些 URL。

client :
分配組件由標(biāo)準(zhǔn)的網(wǎng)絡(luò)服務(wù)器。他們負(fù)責(zé)接受Client客戶端請(qǐng)求并提供相關(guān)聯(lián)的資源給客戶端。


接下來(lái)將上面的圖的每一塊解釋一下

Media encoder (媒體編碼) :
媒體編碼器獲取到音視頻設(shè)備的實(shí)時(shí)信號(hào),將其編碼后壓縮用于傳輸。而編碼格式必須配置為客戶端所支持的格式,比如 H.264 視頻和HE-AAC 音頻。當(dāng)前,支持 用于視頻的 MPEG-2 傳輸流和 純音頻 MPEG 基本流。編碼器通過(guò)本地網(wǎng)絡(luò)將 MPEG-2 傳輸流分發(fā)出去,送到流切片器(Stream segmenter)那里。標(biāo)準(zhǔn)傳輸流和壓縮傳輸流無(wú)法混合使用。傳輸流(這個(gè)流是指, 圖中MPEG-2 transport stream流)可以被打包成很多種不同的壓縮格式,這里有兩個(gè)表詳細(xì)列舉了支持的壓縮格式類型。 * 音頻框架技術(shù): Audio Technologies *
視頻框架 : Vedio Technologies

在編碼中涂,不要修改視頻編碼器的設(shè)置,比如視頻大小或者編碼解碼器類型。如果避免不了,那修改動(dòng)作必須發(fā)生在一個(gè)片段邊界。并且需要早之后相連的片段上用 EXT-X-DISCONTINUITY進(jìn)行標(biāo)記。

Stream segmenter (流切片器)
流切片器(通常是一個(gè)軟件,一個(gè)SDK)會(huì)通過(guò)本地網(wǎng)絡(luò)從上面的媒體編碼器中讀取數(shù)據(jù),然后將著這些數(shù)據(jù)一組相等時(shí)間間隔的小媒體文件。雖然每一個(gè)片段都是一個(gè)單獨(dú)的文件,但是他們的來(lái)源是一個(gè)連續(xù)的流,切完照樣可以無(wú)縫重構(gòu)回去。
切片器在切片同時(shí)會(huì)創(chuàng)建一個(gè)索引文件(Index file),索引文件會(huì)包含這些切片文件的引用。每當(dāng)一個(gè)切片文件生成后,索引文件都會(huì)進(jìn)行更新。索引用于追蹤切片文件的有效性和定位切片文件的位置。切片器同時(shí)也可以對(duì)你的媒體片段進(jìn)行加密并且創(chuàng)建一個(gè)密鑰文件作為整個(gè)過(guò)程的一部分。

文件切片器(相對(duì)于上面的流切片器, 就是切文件的)

如果已經(jīng)有編碼后的文件(而不是編碼流),你可以使用文件切片器,通過(guò)它對(duì)編碼后的媒體文件進(jìn)行 MPEG-2 流的封裝并且將它們分割為等長(zhǎng)度的小片段。切片器允許你使用已經(jīng)存在的音視頻庫(kù)用于 HLS 服務(wù)。它和流切片器的功能相似,但是處理的源從流替換流為了文件。

媒體片段文件,(上面切除來(lái)的小片段)

媒體片段是由切片器生成的,基于編碼后的媒體源,并且是由一系列的 .ts(如果是純音頻則不是.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文件,那客戶的軟件可能要與典型的 MP3 playList 保持一致來(lái)完成 流網(wǎng)絡(luò)音頻的播放。

.m3u8 PlayLists文件

為了更精確,你可以在 version 3 或者之后的協(xié)議版本中使用 float 數(shù)來(lái)標(biāo)記媒體片段的時(shí)長(zhǎng),并且要明確寫明版本號(hào),如果沒有版本號(hào),則必須與 version 1 協(xié)議保持一致。你可以使用官方提供的切片器去生產(chǎn)各種各樣的 playlist 索引文件,詳見 媒體文件切片器

Distribution分布式部分
分布式系統(tǒng)是一個(gè)網(wǎng)絡(luò)服務(wù)或者一個(gè)網(wǎng)絡(luò)緩存系統(tǒng),用于通過(guò) HTTP 向客戶端發(fā)送媒體文件和索引文件。不用自定義模塊發(fā)送內(nèi)容。通常僅僅需要很簡(jiǎn)單的網(wǎng)絡(luò)配置即可使用。而且這種配置一般就是限制指定 .M38U 文件和 .ts 文件的 MIME 類型。詳見 部署 HTTP Live Streaming

Client客戶端部分
客戶端開始時(shí)回去抓取 索引文件(.m3u8/.m3u),其中用URL來(lái)標(biāo)記不同的流。索引文件可以指定可用媒體文件的位置,解密的密鑰,以及任何可以切換的流。對(duì)于選中的流,客戶端會(huì)有序的下載每一個(gè)可獲得的文件。每一個(gè)文件都包含流中的連環(huán)碎片。一旦下載到足夠量的數(shù)據(jù),客戶端會(huì)開始向用戶展示重新裝配好的媒體資源。
客戶端負(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ù)廣播的??蛻舳藭?huì)定期的加載一些新的索引文件??蛻舳藭?huì)從新更新的索引文件中去查找加密密鑰并且將關(guān)聯(lián)的URL加入到請(qǐng)求隊(duì)列中去。


會(huì)話模式##

通常包含 Live 和 VOD (點(diǎn)播)兩種
點(diǎn)播VOD的特點(diǎn)就是可以獲取到一個(gè)靜態(tài)的索引文件,其中那個(gè)包含一套完整的資源文件地址。這種模式允許客戶端訪問(wèn)全部節(jié)目。VOD點(diǎn)播擁有先進(jìn)的下載技術(shù),包括加密認(rèn)證技術(shù)和動(dòng)態(tài)切換文件傳輸速率的功能(通常用于不同分辨率視頻之間的切換)。

Live 會(huì)話就是實(shí)時(shí)事件的錄制展示。它的索引文件一直處于動(dòng)態(tài)變化的,你需要不斷的更新索引文件 playlist 然后移除舊的索引文件。這種類型通過(guò)向索引文件添加媒體地址可以很容易的轉(zhuǎn)化為VOD類型。在轉(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。


抓取分析##

主索引 :

直播源 : http://dlhls.cdn.zhanqi.tv/zqlive/30647_JIjP2.m3u8

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-STREAM-INF:PROGRAM-ID=1,PUBLISHEDTIME=1462118775,CURRENTTIME=1462155858,BANDWIDTH=400000,RESOLUTION=854x480
30647_JIjP2_400/index.m3u8?Dnion_vsnae=30647_JIjP2
#EXT-X-STREAM-INF:PROGRAM-ID=1,PUBLISHEDTIME=1462118776,CURRENTTIME=1462155858,BANDWIDTH=700000,RESOLUTION=1280x720
30647_JIjP2_700/index.m3u8?Dnion_vsnae=30647_JIjP2
#EXT-X-STREAM-INF:PROGRAM-ID=1,PUBLISHEDTIME=1462118775,CURRENTTIME=1462155858,BANDWIDTH=1024000,RESOLUTION=1280x720
30647_JIjP2_1024/index.m3u8?Dnion_vsnae=30647_JIjP2

每一個(gè)標(biāo)簽的格式, 屬性, 作用,請(qǐng)參考這里


#EXTM3U
每個(gè)M3U文件第一行必須是這個(gè)tag,請(qǐng)標(biāo)示作用

#EXT-X-VERSION
用以標(biāo)示協(xié)議版本。(到我寫這篇文章為止,HLS協(xié)議已經(jīng)經(jīng)歷了19個(gè)版本了,既然這里是3, 那么這里用的就是HLS協(xié)議第三個(gè)版本)此標(biāo)簽只能有0或1個(gè),不寫代表使用版本1。

#EXT-X-STREAM-INF
#EXT-X-STREAM-INF的格式 :
#EXT-X-STREAM-INF : [attribute=value][,attribute=value]* <URI>
標(biāo)簽的屬性列表中直接指明當(dāng)前流是VIDEO還是AUDIO
屬性 :

  1. BANDWIDTH 指定碼率
  2. PROGRAM-ID 唯一ID (這個(gè)屬性在后面的協(xié)議版本廢除了)
  3. CODECS 指定流的編碼類型

**#EXT-X-MEDIA-SEQUENCE:1462118775 **每一個(gè)media URI 在 PlayList中只有唯一的序號(hào),相鄰之間序號(hào)+1, 一個(gè)media URI并不是必須要包含的,如果沒有,默認(rèn)為0


如果你的視頻具備流切換功能,處于不同的帶寬、不同的網(wǎng)速播放不同清晰度的視頻流,這樣只能的流切換可以保證用戶感覺到非常流暢的觀影體驗(yàn),同時(shí)不同的設(shè)備也可以作為選擇的條件,比如視網(wǎng)膜屏可以再網(wǎng)速良好的情況下播放清晰度更高的視頻流。

這種功能的實(shí)現(xiàn)在于,索引文件的特殊結(jié)構(gòu)

圖片來(lái)源于蘋果官網(wǎng)
  1. 主索引文件和子索引文件都是.M3U8的playlist
  2. 主索引文件只需下載一次,但對(duì)于直播節(jié)目子索引文件定期重新加載。
  3. 客戶端可能會(huì)在任何時(shí)候改變到備用流,所有的切換都應(yīng)該使用相同的音頻文件
  4. 這一套不同速率的視頻都是有工具生成的
    使用variantplaylistcreator工具并且為 mediafilesegmenter
    或者 mediastreamsegmenter
    指定 -generate-variant-playlist 選項(xiàng),詳情參考 下載工具

子索引 :

根據(jù)上面的主索引文件,這里我選擇了,1024, 碼率為1024000的數(shù)據(jù)源, 將URL拼接一下, 得到下面的URL
http://dlhls.cdn.zhanqi.tv/zqlive/30647_JIjP2_1024/index.m3u8?Dnion_vsnae=30647_JIjP2

結(jié)果 :

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-MEDIA-SEQUENCE:5647
#EXT-X-TARGETDURATION:10
#EXTINF:9.560,
1462167932532_1462167932532.ts?Dnion_vsnae=30647_JIjP2
#EXTINF:6.520,
1462167942133_1462167942133.ts?Dnion_vsnae=30647_JIjP2
#EXTINF:9.960,
1462167948685_1462167948685.ts?Dnion_vsnae=30647_JIjP2

傳說(shuō)已久的.ts文件已經(jīng)看到, 這些就是視頻數(shù)據(jù)源文件,解釋一下標(biāo)簽的作用

#EXT-X-MEDIA-SEQUENCE
每一個(gè)media URI 在 PlayList中只有唯一的序號(hào),相鄰之間序號(hào)+1
(上面那個(gè)URL, 不斷請(qǐng)求的過(guò)程中能不斷獲取子索引, 每一次獲取下來(lái)的都能發(fā)現(xiàn)EXT-X-MEDIA-SEQUENCE會(huì)不斷增大)

#EXT-X-TARGETDURATION:10
每一份媒體文件的時(shí)間, 以秒為單位, 這里是10秒一份

**#EXTINF **
格式 #EXTINF <duration>,<title>
每一份媒體文件的詳細(xì)信息, duration : 媒體持續(xù)時(shí)間, 應(yīng)該四舍五入為整數(shù),上面的例子,9.560就是這一份媒體文件的持續(xù)時(shí)間
title : 1462167932532_1462167932532.ts?Dnion_vsnae=30647_JIjP2這個(gè)是這一份媒體文件的URL地址,


加密##

加密部分以后再補(bǔ)充.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容