HLS協議全解

2021-08-07 12:24:43 字數 3779 閱讀 8487

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...