http live streaming(縮寫是hls)是乙個由蘋果公司提出的基於http的流**網路傳輸協議。
是蘋果公司quicktime x和iphone軟體系統的一部分。
hls只請求基本的http報文,與實時傳輸協議(rtp)不同,hls可以穿過任何允許http資料通過的防火牆或者**伺服器。
它也很容易使用內容分發網路來傳輸**流。
hls的工作流程的三個部分:
蘋果官方文件的配圖
2. distribution :
同時上面提到的那個切片器(segmenter)也會建立乙個索引檔案,通常會包含這些**檔案的乙個列表,也能包含元資料。
他一般都是乙個.m3u8的列表。列表元素會關聯乙個url 用於客戶端訪問。然後按序去請求這些url。
3. client :
分配元件由標準的網路伺服器。他們負責接受client客戶端請求並提供相關聯的資源給客戶端。
2.2上面的圖的每一塊解釋
如果避免不了,那修改動作必須發生在乙個片段邊界。並且需要早之後相連的片段上用ext-x-discontinuity進行標記。
2.stream segmenter (流切片器)
流切片器(通常是乙個軟體,乙個sdk)會通過本地網路從上面的**編碼器中讀取資料,
然後將著這些資料一組相等時間間隔的小**檔案。雖然每乙個片段都是乙個單獨的檔案,
但是他們的**是乙個連續的流,切完照樣可以無縫重構回去。
切片器在切片同時會建立乙個索引檔案(index file),索引檔案會包含這些切片檔案的引用。
每當乙個切片檔案生成後,索引檔案都會進行更新。索引用於追蹤切片檔案的有效性和定位切片檔案的位置。
切片器同時也可以對你的**片段進行加密並且建立乙個金鑰檔案作為整個過程的一部分。
3.檔案切片器(相對於上面的流切片器, 就是切檔案的)
4. **片段檔案,(上面切除來的小片段)
5. 索引檔案(playlists)
通常由切片器附帶生成,儲存為.m3u8格式,.m3u一般用於*** 音訊的索引檔案。
note
4. .m3u8 playlists檔案
通常包含live 和vod (點播)兩種:
1.點播vod:
特點就是可以獲取到乙個靜態的索引檔案,其中那個包含一套完整的資源檔案位址。
2.live 會話:
就是實時事件的錄製展示。它的索引檔案一直處於動態變化的,你需要不斷的更新索引檔案playlist 然後移除舊的索引檔案。
3.live轉vod:
這種型別通過向索引檔案新增**位址可以很容易的轉化為vod型別。
在轉化時不要移除原來舊的源,而是通過新增乙個#et-x-endlist
標記來終止實時事件。
轉化時如果你的索引檔案中包含ext-x-playlist-type標籤,你需要將值從event改為vod。
直播源:
#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
每乙個標籤的格式, 屬性, 作用,請參考這裡
( 1.
#extm3u
每個m3u檔案第一行必須是這個tag,請標示作用
2. #ext-x-version
用以標示協議版本。(到我寫這篇文章為止,hls協議已經經歷了19個版本了,既然這裡是3, 那麼這裡用的就是hls協議第三個版本)此標籤只能有0或1個,不寫代表使用版本1。
3. #ext-x-stream-inf
#ext-x-stream-inf的格式:
#ext-x-stream-inf : [attribute=value][,attribute=value]*
標籤的屬性列表中直接指明當前流是video還是audio
屬性:
bandwidth 指定位元速率
program-id 唯一id (這個屬性在後面的協議版本廢除了)
codecs 指定流的編碼型別
#ext-x-media-sequence:1462118775 每乙個media uri 在playlist中只有唯一的序號,相鄰之間序號+1,
乙個media uri並不是必須要包含的,如果沒有,預設為0
這種功能的實現在於,索引檔案的特殊結構
**於蘋果官網
主索引檔案和子索引檔案都是.m3u8的playlist
客戶端可能會在任何時候改變到備用流,所有的切換都應該使用相同的音訊檔案
根據上面的主索引檔案,這裡我選擇了,1024, 位元速率為1024000的資料來源, 將url拼接一下, 得到下面的url
結果:
#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
1. #ext-x-media-sequence
每乙個media uri 在playlist中只有唯一的序號,相鄰之間序號+1
(上面那個url, 不斷請求的過程中能不斷獲取子索引, 每一次獲取下來的都能發現ext-x-media-sequence會不斷增大)
2. #ext-x-targetduration:10
每乙份**檔案的時間, 以秒為單位, 這裡是10秒乙份
3. #extinf
格式#extinf ,
每乙份**檔案的詳細資訊, duration : **持續時間, 應該四捨五入為整數,上面的例子,9.560就是這乙份**檔案的持續時間
title : 1462167932532_1462167932532.ts?dnion_vsnae=30647_jijp2這個是這乙份**檔案的url位址,
HLS協議實現
一 hls介紹 是由公司定義的用於實時流傳輸的協議,hls基於 協議實現,傳輸內容包括兩部分,一是 m3u8 描述檔案,二是 ts 檔案。1 m3u8檔案 用文字方式對 檔案進行描述,由一系列標籤組成。extm3u ext x targetduration 5 extinf 5,0.ts extin...
HLS協議實現
一 hls介紹 是由公司定義的用於實時流傳輸的協議,hls基於 協議實現,傳輸內容包括兩部分,一是 m3u8 描述檔案,二是 ts 檔案。1 m3u8檔案 用文字方式對 檔案進行描述,由一系列標籤組成。extm3u ext x targetduration 5 extinf 5,0.ts extin...
HLS協議實現
一 hls介紹 是由公司定義的用於實時流傳輸的協議,hls基於 協議實現,傳輸內容包含兩部分,一是 m3u8 描寫敘述檔案,二是 ts 檔案。1 m3u8檔案 用文字方式對 檔案進行描寫敘述,由一系列標籤組成。extm3u ext x targetduration 5 extinf 5,0.ts e...