HLS playlist典型示例

0 引言

本文主要是對apple官網上的echnical Note TN2288-Example Playlist Files for use with HTTP Live Streaming一文的整理,加上rfc8216 section 8的部分內容。

本文的目標在於整理不同類型的HLS

m3u8格式,對其表徵的多媒體數據做必要說明。希望讀者讀完本文能夠基本知道目前HLS所支持的m3u8格式。至於對應字段的詳細含義,建議參考rfc8216或其他資料。

言歸正傳,HLS通過一系列小文件來發送音視頻等多媒體數據,通常該分片長度爲10s。一個索引文件,也稱爲playlist(中譯名爲播放列表),通常提供對這一系列分片文件的描述信息,通常使用.m3u8作爲其後綴;對於mp3格式的playlist則使用.m3u作爲後綴。該索引文件將被客戶端獲取,客戶端解析之後可得到對應的待請求序列的信息。

1 不同HLS playlist示例文件

本文將給出10種不同的playlist,包括內容如下:

1.點播(VOD,Video On Demand)playlist

2.Event playlist

3.直播playlist(滑動窗口)

4.byte-range playlist

5.包含密鑰的playlist

6.內嵌廣告的playlist

7.master playlist

8.包含alternate media的playlist

9.I-frame playlist

10.包含session的master playlist

其中加粗的是在實際工作中可能遇到比較多的。其他的僅在標準文檔中見到。
前三類playlist(VOD/Event/Live)我們可以將之稱爲basic playlist。master playlist是對basic playlist的描述信息。

2 點播playlist

HLS中點播playlist是靜態的文件,生成之後一般不允許修改,server端可以預先生成切片文件。其格式如下:

#EXTM3U
#EXT-X-PLAYLIST-TYPE:VOD
#EXT-X-TARGETDURATION:10
#EXT-X-VERSION:3
#EXTINF:9.009,
http://media.example.com/first.ts
#EXTINF:9.009,
http://media.example.com/second.ts
#EXTINF:3.003,
http://media.example.com/third.ts
#EXT-X-ENDLIST

m3u8中支持絕對路徑,也支持相對路徑(推薦使用,節省帶寬資源);以下格式與上面是等效的

#EXTM3U
#EXT-X-PLAYLIST-TYPE:VOD
#EXT-X-TARGETDURATION:10
#EXT-X-VERSION:3
#EXTINF:9.009,
first.ts
#EXTINF:9.009,
second.ts
#EXTINF:3.003,
third.ts
#EXT-X-ENDLIST

點播playlist最典型的特徵是:
playlist中包含

#EXT-X-ENDLIST

字段

#EXT-X-PLAYLIST-TYPE

字段爲VOD(可選)
playlist可以使用http,也可以使用https協議。

3 Event playlist

Event playlist特徵字段是:#EXT-X-PLAYLIST-TYPE字段是EVENT。
在剛啓動時,其m3u8內容如下:

#EXTM3U
#EXT-X-PLAYLIST-TYPE:EVENT
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:10,
fileSequence0.ts
#EXTINF:10,
fileSequence1.ts
#EXTINF:10,
fileSequence2.ts
#EXTINF:10,
fileSequence3.ts

其中並不包含EXT-X-ENDLIST字段,後續結束是會自動添加。這裏EVENT字段含義是可以改動playlist內容,但是只能在m3u8文件末尾添加新的分片信息,不能在文件中間添加任何內容。
當Event playlist結束時,其內容如下:

#EXTM3U
#EXT-X-PLAYLIST-TYPE:EVENT
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:10,
fileSequence0.ts
#EXTINF:10,
fileSequence1.ts
#EXTINF:10,
fileSequence2.ts
#EXTINF:10,
fileSequence3.ts
...
#EXTINF:10,
fileSequence120.ts
#EXTINF:10,
fileSequence121.ts
#EXT-X-ENDLIST

Event playlist通常用於晚會或體育賽事,用於爲用戶提供當前時間到開播時間任意點的seek。

4 直播playlist

對於直播playlist,其特徵字段就是沒有EXT-X-ENDLIST標籤,並且不存在EXT-X-PLAYLIST-TYPE標籤。
直播playlist是一個典型的滑動窗口,server端會對源格式做實時轉碼(存在一點延時),並定期清理已發佈的分片信息。典型的滑動窗口大小爲3-5個分片。其m3u8格式如下:

#EXTM3U
#EXT-X-TARGETDURATION:10
#EXT-X-VERSION:3
#EXT-X-MEDIA-SEQUENCE:1
#EXTINF:10,
fileSequence1.ts
#EXTINF:10,
fileSequence2.ts
#EXTINF:10,
fileSequence3.ts

對於任意一個分片URI被移除該playlist,必須更新EXT-X-MEDIA-SEQUENCE字段(+1即可)。移除URI必須按照順序,並保證客戶端通過滑動窗口拿到連續的分片信息。按照這樣更新之後的playlist如下:

#EXTM3U
#EXT-X-TARGETDURATION:10
#EXT-X-VERSION:3
#EXT-X-MEDIA-SEQUENCE:2
#EXTINF:10,
fileSequence2.ts
#EXTINF:10,
fileSequence3.ts
#EXTINF:10,
fileSequence4.ts
#EXTINF:10,

5 帶有密鑰的playlist

這裏的密鑰是由EXT-X-KEY字段指定的,其中給出了加密方法,和密鑰的存儲路徑。

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-MEDIA-SEQUENCE:7794
#EXT-X-TARGETDURATION:15
#EXT-X-KEY:METHOD=AES-128,URI="https://priv.example.com/key.php?r=52"
#EXTINF:2.833,
http://media.example.com/fileSequence52-A.ts
#EXTINF:15.0,
http://media.example.com/fileSequence52-B.ts
#EXTINF:13.333,
http://media.example.com/fileSequence52-C.ts
#EXT-X-KEY:METHOD=AES-128,URI="https://priv.example.com/key.php?r=53"
#EXTINF:15.0,
http://media.example.com/fileSequence53-A.ts

6 byte-range playlist

該類型playlist主要是使用新的字段

#EXT-X-BYTERANGE: length[@offset]

使用該字段,可以不用在server上存儲大量的小文件,而僅通過一個文件,通過偏移量和長度來支持分片。與點播playlist中的m3u8等價的playlist內容如下:

#EXTM3U
#EXT-X-TARGETDURATION:11
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-VERSION:4

#EXTINF:9.009,
#EXT-X-BYTERANGE:75232@0
media.ts

#EXTINF:9.009,
#EXT-X-BYTERANGE:82112@752321
media.ts

#EXTINF:3.003,
#EXT-X-BYTERANGE:69864
media.ts

注意這裏必須指定EXT-X-VERSION字段爲4,否則可能低版本HLS協議不支持。

7 內嵌廣告的playlist

有時候我們需要在直播或點播中插入廣告,廣告的編碼格式可能跟原來的編碼格式不同,爲了支持類似場景,HLS提供了EXT-X-DISCONTINUITY字段,用於通知客戶端可能存在碼流編碼格式不連續。其對應的m3u8格式如下:

#EXTM3U
#EXT-X-TARGETDURATION:10
#EXT-X-VERSION:3
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:10.0,
ad0.ts
#EXTINF:8.0,
ad1.ts
#EXT-X-DISCONTINUITY
#EXTINF:10.0,
movieA.ts
#EXTINF:10.0,
movieB.ts

8 master playlist

master playlist其中並不包含分片有關信息,而是描述了同一個源的不同編碼格式,在HLS中稱之爲variant。master playlist中描述了variant的諸多信息,比如下載帶寬、音視頻編碼信息、視頻分辨率等等。典型的示例如下:

#EXTM3U
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=150000,RESOLUTION=416x234, \
CODECS="avc1.42e00a,mp4a.40.2"
http://example.com/low/index.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=240000,RESOLUTION=416x234, \
CODECS="avc1.42e00a,mp4a.40.2"
http://example.com/lo_mid/index.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=640000,RESOLUTION=640x360, \
CODECS="avc1.42e00a,mp4a.40.2"
http://example.com/high/index.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=64000,CODECS="mp4a.40.5"
http://example.com/audio/index.m3u8

master playlist中不包含#EXTINF字段。其中描述的每個variant都是一個獨立的m3u8文件。

9 包含alternate media的master playlist

alternate media爲HLS提供了一種外掛音頻、視頻、字幕的格式,可以在不改動已生成的HLS分片信息的情況下,爲客戶端提供新的可選媒體信息。爲此,在STREAM-INF添加了AUIOD、VIDEO屬性,以實現關聯。
該形式的m3u8格式如下:

#EXTM3U

#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="bipbop_audio",LANGUAGE="eng",NAME="BipBop Audio 1",AUTOSELECT=YES,DEFAULT=YES
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="bipbop_audio",LANGUAGE="eng",NAME="BipBop Audio 2",AUTOSELECT=NO,DEFAULT=NO,URI="alternate_audio_aac/prog_index.m3u8"

#EXT-X-MEDIA:TYPE=SUBTITLES,GROUP-ID="subs",NAME="English",DEFAULT=YES,AUTOSELECT=YES,FORCED=NO,LANGUAGE="en",CHARACTERISTICS="public.accessibility.transcribes-spoken-dialog, public.accessibility.describes-music-and-sound",URI="subtitles/eng/prog_index.m3u8"

#EXT-X-STREAM-INF:BANDWIDTH=263851,CODECS="mp4a.40.2, avc1.4d400d",RESOLUTION=416x234,AUDIO="bipbop_audio",SUBTITLES="subs"
gear1/prog_index.m3u8

#EXT-X-STREAM-INF:BANDWIDTH=41457,CODECS="mp4a.40.2",AUDIO="bipbop_audio",SUBTITLES="subs"
gear0/prog_index.m3u8

此m3u8中包含2個variants,一個alternate audio以及一個alternate subtitle。它們使用EXT-X-MEDIA中的GROUP-ID字段與EXT-X-STREAM-INF中的AUDIO、VIDEO、SUBTITLES關聯在一起。
可以通過alternate media實現多碼率、多音頻、多字幕、多視角的HLS推流。

10 I-frame playlist

爲了實現快播和倒放,通常需要特定的數據以支持類似操作,一種方法就是通過記錄I幀位置來實現。HLS爲了支持此功能,提供了EXT-X-I-FRAMES-ONLY和EXT-X-I-FRAME-STREAM-INF字段。後者需要放到master playlist中即可,其示例如下:

#EXTM3U
#EXT-X-VERSION:4
#EXT-X-I-FRAME-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=80000,CODECS="avc1.42e00a,mp4a.40.2", \
URI="lo/iframes.m3u8"
#EXT-X-I-FRAME-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=200000,CODECS="avc1.42e00a,mp4a.40.2", \
URI="mid/iframes.m3u8"
#EXT-X-I-FRAME-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=380000,CODECS="avc1.42e00a,mp4a.40.2", \
URI="hi/iframes.m3u8"

EXT-X-I-FRAMES-ONLY字段是放在對應I-Frame的playlist中的,典型用法如下:

#EXTM3U
#EXT-X-VERSION:4
#EXT-X-I-FRAMES-ONLY

...

#EXTINF:4.12,
#EXT-X-BYTERANGE:9400@376
segment1.ts
#EXTINF:3.56,
#EXT-X-BYTERANGE:7144@47000
segment1.ts

#EXTINF:3.82,
#EXT-X-BYTERANGE:10340@1880
segment2.ts

該文件間接給出了I幀所在位置的偏移量及其長度。

11 包含session的master playlist

session用於在playlist中傳輸任意服務器端自定義的數據,其對應字段如下:

#EXT-X-SESSION-DATA:DATA-ID="com.example.lyrics",URI="lyrics.json"
#EXT-X-SESSION-DATA:DATA-ID="com.example.title",LANGUAGE="en", \
VALUE="This is an example"
#EXT-X-SESSION-DATA:DATA-ID="com.example.title",LANGUAGE="es", \
VALUE="Este es un ejemplo"

12 小結

本文簡要整理了HLS不同類型的playlist及其對應的關鍵字,可以根據不同的關鍵字區分不同的playlist類型。理清這些類型之後,對於熟悉HLS解析會有較大幫助。

發佈了34 篇原創文章 · 獲贊 14 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章