先貼出一系列參考網(wǎng)站 :
概念解釋 :
***HLS是一套解決方案, 包含三個部分 : ***
Server :
服務器組件負責獲取的媒體輸入流 , 然后Media編碼后 MPEG-4(H.264 video 和 AAC audio)格式然后用硬件打包到 MPEG-2 (MPEG-2 transport stream)的傳輸流中来农。圖中顯示,傳輸流會經(jīng)過stream segmenter, 這里的工作是MPEG-2傳輸流會被分散為小片段然后保存為一個或多個系列的 .ts 格式的媒體文件廷雅。這個過程需要借助編碼工具來完成,比如 Apple stream segmenter。
(視頻類是.ts文件,純音頻會被編碼為一些音頻小片段,通常為 ADTS頭的AAC、MP3、或者 AC-3格式。)
服務端可以采用硬件編碼和軟件編碼兩種形式饵较,其功能都是按照上文描述的規(guī)則對現(xiàn)有的媒體文件進行切片并使用索引文件進行管理。而軟件切片通常會使用 Apple 公司提供的工具或者第三方的集成工具遭赂。
Distribution :
同時上面提到的那個切片器(segmenter)也會創(chuàng)建一個索引文件循诉,通常會包含這些媒體文件的一個列表,也能包含元數(shù)據(jù)撇他。他一般都是一個.M38U 個hi的列表茄猫。列表元素會關聯(lián)一個 URL 用于客戶端訪問。然后按序去請求這些 URL困肩。
client :
分配組件由標準的網(wǎng)絡服務器划纽。他們負責接受Client客戶端請求并提供相關聯(lián)的資源給客戶端。
接下來將上面的圖的每一塊解釋一下
Media encoder (媒體編碼) :
媒體編碼器獲取到音視頻設備的實時信號锌畸,將其編碼后壓縮用于傳輸勇劣。而編碼格式必須配置為客戶端所支持的格式,比如 H.264 視頻和HE-AAC 音頻潭枣。當前比默,支持 用于視頻的 MPEG-2 傳輸流和 純音頻 MPEG 基本流。編碼器通過本地網(wǎng)絡將 MPEG-2 傳輸流分發(fā)出去盆犁,送到流切片器(Stream segmenter)那里命咐。標準傳輸流和壓縮傳輸流無法混合使用。傳輸流(這個流是指, 圖中MPEG-2 transport stream流)可以被打包成很多種不同的壓縮格式蚣抗,這里有兩個表詳細列舉了支持的壓縮格式類型侈百。 * 音頻框架技術: Audio Technologies *
視頻框架 : Vedio Technologies
在編碼中涂,不要修改視頻編碼器的設置翰铡,比如視頻大小或者編碼解碼器類型。如果避免不了讽坏,那修改動作必須發(fā)生在一個片段邊界锭魔。并且需要早之后相連的片段上用 EXT-X-DISCONTINUITY進行標記族跛。
Stream segmenter (流切片器)
流切片器(通常是一個軟件,一個SDK)會通過本地網(wǎng)絡從上面的媒體編碼器中讀取數(shù)據(jù)困乒,然后將著這些數(shù)據(jù)一組相等時間間隔的小媒體文件。雖然每一個片段都是一個單獨的文件幸乒,但是他們的來源是一個連續(xù)的流,切完照樣可以無縫重構回去漠秋。
切片器在切片同時會創(chuàng)建一個索引文件(Index file)笙蒙,索引文件會包含這些切片文件的引用。每當一個切片文件生成后庆锦,索引文件都會進行更新捅位。索引用于追蹤切片文件的有效性和定位切片文件的位置。切片器同時也可以對你的媒體片段進行加密并且創(chuàng)建一個密鑰文件作為整個過程的一部分搂抒。
文件切片器(相對于上面的流切片器, 就是切文件的)
如果已經(jīng)有編碼后的文件(而不是編碼流)艇搀,你可以使用文件切片器,通過它對編碼后的媒體文件進行 MPEG-2 流的封裝并且將它們分割為等長度的小片段求晶。切片器允許你使用已經(jīng)存在的音視頻庫用于 HLS 服務焰雕。它和流切片器的功能相似,但是處理的源從流替換流為了文件芳杏。
媒體片段文件,(上面切除來的小片段)
媒體片段是由切片器生成的矩屁,基于編碼后的媒體源,并且是由一系列的 .ts(如果是純音頻則不是.ts格式)格式的文件組成爵赵,其中包含了你想通過 MPEG-2 傳送流攜帶的 H.264 視頻 和 AAC /MP3/AC-3 音頻吝秕。對于純音頻的廣播,切片器可以生產(chǎn) MPEG 基礎音頻流亚再,其中包含了 ADTS頭的AAC郭膛、MP3、或者AC3等音頻氛悬。
索引文件(PlayLists)
通常由切片器附帶生成则剃,保存為 .m3u8格式,.m3u一般用于 MP3 音頻的索引文件如捅。 Note如果你的擴展名是.m3u,并且系統(tǒng)支持.mp3文件棍现,那客戶的軟件可能要與典型的 MP3 playList 保持一致來完成 流網(wǎng)絡音頻的播放。
為了更精確镜遣,你可以在 version 3 或者之后的協(xié)議版本中使用 float 數(shù)來標記媒體片段的時長己肮,并且要明確寫明版本號,如果沒有版本號悲关,則必須與 version 1 協(xié)議保持一致谎僻。你可以使用官方提供的切片器去生產(chǎn)各種各樣的 playlist 索引文件,詳見 媒體文件切片器
Distribution分布式部分
分布式系統(tǒng)是一個網(wǎng)絡服務或者一個網(wǎng)絡緩存系統(tǒng)寓辱,用于通過 HTTP 向客戶端發(fā)送媒體文件和索引文件艘绍。不用自定義模塊發(fā)送內(nèi)容。通常僅僅需要很簡單的網(wǎng)絡配置即可使用秫筏。而且這種配置一般就是限制指定 .M38U 文件和 .ts 文件的 MIME 類型诱鞠。詳見 部署 HTTP Live Streaming
Client客戶端部分
客戶端開始時回去抓取 索引文件(.m3u8/.m3u)挎挖,其中用URL來標記不同的流。索引文件可以指定可用媒體文件的位置航夺,解密的密鑰蕉朵,以及任何可以切換的流。對于選中的流阳掐,客戶端會有序的下載每一個可獲得的文件始衅。每一個文件都包含流中的連環(huán)碎片。一旦下載到足夠量的數(shù)據(jù)锚烦,客戶端會開始向用戶展示重新裝配好的媒體資源觅闽。
客戶端負責抓取任何解密密鑰,認證或者展示一個用于認證的界面涮俄,之后再解密需要的文件蛉拙。
這個過程會一直持續(xù)知道出現(xiàn) 結束標記 #EXT-X-ENDLIST
。如果結束標記不出現(xiàn)彻亲,該索引就是用于持續(xù)廣播的孕锄。客戶端會定期的加載一些新的索引文件苞尝』粒客戶端會從新更新的索引文件中去查找加密密鑰并且將關聯(lián)的URL加入到請求隊列中去。
會話模式##
通常包含 Live 和 VOD (點播)兩種
點播VOD的特點就是可以獲取到一個靜態(tài)的索引文件宙址,其中那個包含一套完整的資源文件地址轴脐。這種模式允許客戶端訪問全部節(jié)目。VOD點播擁有先進的下載技術抡砂,包括加密認證技術和動態(tài)切換文件傳輸速率的功能(通常用于不同分辨率視頻之間的切換)大咱。
Live 會話就是實時事件的錄制展示。它的索引文件一直處于動態(tài)變化的注益,你需要不斷的更新索引文件 playlist 然后移除舊的索引文件碴巾。這種類型通過向索引文件添加媒體地址可以很容易的轉(zhuǎn)化為VOD類型。在轉(zhuǎn)化時不要移除原來舊的源丑搔,而是通過添加一個 #ET-X-ENDLIST
標記來終止實時事件厦瓢。轉(zhuǎn)化時如果你的索引文件中包含 EXT-X-PLAYLIST-TYPE
標簽,你需要將值從 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
每一個標簽的格式, 屬性, 作用,請參考這里
#EXTM3U
每個M3U文件第一行必須是這個tag煮仇,請標示作用
#EXT-X-VERSION
用以標示協(xié)議版本。(到我寫這篇文章為止,HLS協(xié)議已經(jīng)經(jīng)歷了19個版本了,既然這里是3, 那么這里用的就是HLS協(xié)議第三個版本)此標簽只能有0或1個谎仲,不寫代表使用版本1欺抗。
#EXT-X-STREAM-INF
#EXT-X-STREAM-INF的格式 :
#EXT-X-STREAM-INF : [attribute=value][,attribute=value]* <URI>
標簽的屬性列表中直接指明當前流是VIDEO還是AUDIO
屬性 :
- BANDWIDTH 指定碼率
- PROGRAM-ID 唯一ID (這個屬性在后面的協(xié)議版本廢除了)
- CODECS 指定流的編碼類型
**#EXT-X-MEDIA-SEQUENCE:1462118775 **每一個media URI 在 PlayList中只有唯一的序號,相鄰之間序號+1, 一個media URI并不是必須要包含的强重,如果沒有绞呈,默認為0
如果你的視頻具備流切換功能,處于不同的帶寬间景、不同的網(wǎng)速播放不同清晰度的視頻流佃声,這樣只能的流切換可以保證用戶感覺到非常流暢的觀影體驗,同時不同的設備也可以作為選擇的條件倘要,比如視網(wǎng)膜屏可以再網(wǎng)速良好的情況下播放清晰度更高的視頻流圾亏。
這種功能的實現(xiàn)在于,索引文件的特殊結構
- 主索引文件和子索引文件都是.M3U8的playlist
- 主索引文件只需下載一次封拧,但對于直播節(jié)目子索引文件定期重新加載志鹃。
- 客戶端可能會在任何時候改變到備用流,所有的切換都應該使用相同的音頻文件
- 這一套不同速率的視頻都是有工具生成的
使用variantplaylistcreator工具并且為 mediafilesegmenter
或者 mediastreamsegmenter
指定 -generate-variant-playlist 選項,詳情參考 下載工具
子索引 :
根據(jù)上面的主索引文件,這里我選擇了,1024, 碼率為1024000的數(shù)據(jù)源, 將URL拼接一下, 得到下面的URL
http://dlhls.cdn.zhanqi.tv/zqlive/30647_JIjP2_1024/index.m3u8?Dnion_vsnae=30647_JIjP2
結果 :
#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
傳說已久的.ts文件已經(jīng)看到, 這些就是視頻數(shù)據(jù)源文件,解釋一下標簽的作用
#EXT-X-MEDIA-SEQUENCE
每一個media URI 在 PlayList中只有唯一的序號,相鄰之間序號+1
(上面那個URL, 不斷請求的過程中能不斷獲取子索引, 每一次獲取下來的都能發(fā)現(xiàn)EXT-X-MEDIA-SEQUENCE會不斷增大)
#EXT-X-TARGETDURATION:10
每一份媒體文件的時間, 以秒為單位, 這里是10秒一份
**#EXTINF **
格式 #EXTINF <duration>,<title>
每一份媒體文件的詳細信息, duration : 媒體持續(xù)時間, 應該四舍五入為整數(shù),上面的例子,9.560就是這一份媒體文件的持續(xù)時間
title : 1462167932532_1462167932532.ts?Dnion_vsnae=30647_JIjP2這個是這一份媒體文件的URL地址,
加密##
加密部分以后再補充.