這篇文章主要為大家展示了“m3u8文件格式的示例分析”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“m3u8文件格式的示例分析”這篇文章吧。
青原網(wǎng)站制作公司哪家好,找成都創(chuàng)新互聯(lián)公司!從網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、響應(yīng)式網(wǎng)站等網(wǎng)站項目制作,到程序開發(fā),運營維護。成都創(chuàng)新互聯(lián)公司于2013年成立到現(xiàn)在10年的時間,我們擁有了豐富的建站經(jīng)驗和運維經(jīng)驗,來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選成都創(chuàng)新互聯(lián)公司。
m3u8 文件格式詳解
M3U8 是 Unicode 版本的 M3U,用 UTF-8 編碼。"M3U" 和 "M3U8" 文件都是蘋果公司使用的 HTTP Live Streaming(HLS) 協(xié)議格式的基礎(chǔ),這種協(xié)議格式可以在 iPhone 和 Macbook 等設(shè)備播放。
上述文字定義來自于維基百科??梢钥吹?,m3u8 文件其實是 HTTP Live Streaming(縮寫為 HLS) 協(xié)議的部分內(nèi)容,而 HLS 是一個由蘋果公司提出的基于 HTTP 的流媒體網(wǎng)絡(luò)傳輸協(xié)議。
HLS 的工作原理是把整個流分成一個個小的基于 HTTP 的文件來下載,每次只下載一些。當(dāng)媒體流正在播放時,客戶端可以選擇從許多不同的備用源中以不同的速率下載同樣的資源,允許流媒體會話適應(yīng)不同的數(shù)據(jù)速率。在開始一個流媒體會話時,客戶端會下載一個包含元數(shù)據(jù)的 extended M3U (m3u8) playlist文件,用于尋找可用的媒體流。 HLS 只請求基本的 HTTP 報文,與實時傳輸協(xié)議(RTP)不同,HLS 可以穿過任何允許 HTTP 數(shù)據(jù)通過的防火墻或者代理服務(wù)器。它也很容易使用內(nèi)容分發(fā)網(wǎng)絡(luò)來傳輸媒體流。
簡而言之,HLS 是新一代流媒體傳輸協(xié)議,其基本實現(xiàn)原理為將一個大的媒體文件進(jìn)行分片,將該分片文件資源路徑記錄于 m3u8 文件(即 playlist)內(nèi),其中附帶一些額外描述(比如該資源的多帶寬信息···)用于提供給客戶端??蛻舳艘罁?jù)該 m3u8 文件即可獲取對應(yīng)的媒體資源,進(jìn)行播放。
因此,客戶端獲取 HLS 流文件,主要就是對 m3u8 文件進(jìn)行解析操作。
那么,下面就簡單介紹下 m3u8 文件。
M3U8 文件簡介 m3u8 文件實質(zhì)是一個播放列表(playlist),其可能是一個媒體播放列表(Media Playlist),或者是一個主列表(Master Playlist)。但無論是哪種播放列表,其內(nèi)部文字使用的都是 utf-8 編碼。
當(dāng) m3u8 文件作為媒體播放列表(Meida Playlist)時,其內(nèi)部信息記錄的是一系列媒體片段資源,順序播放該片段資源,即可完整展示多媒體資源。其格式如下所示:
#EXTM3U #EXT-X-TARGETDURATION:10
#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 對于點播來說,客戶端只需按順序下載上述片段資源,依次進(jìn)行播放即可。而對于直播來說,客戶端需要 定時重新請求 該 m3u8 文件,看下是否有新的片段數(shù)據(jù)需要進(jìn)行下載并播放。
當(dāng) m3u8 作為主播放列表(Master Playlist)時,其內(nèi)部提供的是同一份媒體資源的多份流列表資源(Variant Stream)。其格式如下所示:
#EXTM3U #EXT-X-STREAM-INF:BANDWIDTH=150000,RESOLUTION=416x234,CODECS="avc1.42e00a,mp4a.40.2" http://example.com/low/index.m3u8 #EXT-X-STREAM-INF:BANDWIDTH=240000,RESOLUTION=416x234,CODECS="avc1.42e00a,mp4a.40.2" http://example.com/lo_mid/index.m3u8 #EXT-X-STREAM-INF:BANDWIDTH=440000,RESOLUTION=416x234,CODECS="avc1.42e00a,mp4a.40.2" http://example.com/hi_mid/index.m3u8 #EXT-X-STREAM-INF:BANDWIDTH=640000,RESOLUTION=640x360,CODECS="avc1.42e00a,mp4a.40.2" http://example.com/high/index.m3u8 #EXT-X-STREAM-INF:BANDWIDTH=64000,CODECS="mp4a.40.5" http://example.com/audio/index.m3u8 該備用流資源指定了多種不同碼率,不同格式的媒體播放列表,并且,該備用流資源也可同時提供不同版本的資源內(nèi)容,比如不同語言的音頻文件,不同角度拍攝的視屏文件等等??蛻艨梢愿鶕?jù)不同的網(wǎng)絡(luò)狀態(tài)選取合適碼流的資源,并且最好根據(jù)用戶喜好選擇合適的資源內(nèi)容。
更多詳細(xì)內(nèi)容,可查看:
Creating a Master Playlist Adding Alternate Media to a Playlist 以上,就是 m3u8 文件的大概內(nèi)容。下面,我們就對 m3u8 內(nèi)容格式進(jìn)行講解。
m3u8 文件格式簡解 m3u8 的文件格式主要包含三方面內(nèi)容:
文件播放列表格式定義:播放列表(Playlist,也即 m3u8 文件) 內(nèi)容需嚴(yán)格滿足規(guī)范定義所提要求。下面羅列一些主要遵循的條件: m3u8 文件必須以 utf-8 進(jìn)行編碼,不能使用 Byte Order Mark(BOM)字節(jié)序, 不能包含 utf-8 控制字符(U+0000 ~ U_001F 和 U+007F ~ u+009F)。
m3u8 文件的每一行要么是一個 URI,要么是空行,要么就是以 # 開頭的字符串。不能出現(xiàn)空白字符,除了顯示聲明的元素。
m3u8 文件中以 # 開頭的字符串要么是注釋,要么就是標(biāo)簽。標(biāo)簽以 #EXT 開頭,大小寫敏感。
屬性列表(Attribute Lists):某些特定的標(biāo)簽的值為屬性列表。標(biāo)簽后面的屬性列表以 逗號 作為分隔符,分離出多組不帶空格的 屬性/值 對。 屬性/值 對的語法格式如下: AttributeName=AttributeValue 其中:
屬性AttributeName是由 [A..Z],[0..9] 和 - 組成的不帶引號的字符串。因此,屬性AttributeName只能使用大寫字母,不能使用小寫字母,并且AttributeName和=中間不能有空格,同理,=和AttributeValue之間也不能有空格。
值A(chǔ)ttributeValue的只能取以下類型:
十進(jìn)制整型(decimal-interger):由 [0..9] 之間組成的十進(jìn)制不帶引號的字符串,范圍為 0 ~ 2^{64}(18446744073709551615),字符長度為 1 ~ 20 之間。 十六進(jìn)制序列:由 [0..9] 和 [A..F] 且前綴為 0x 或 0X 組合成的不帶引號的字符串。其序列的最大長度取決于他的屬性名AttributeNames。 帶符號十進(jìn)制浮點型(signed-decimal-floating-point):由 [0..9],-和.組合成的不帶引號的字符串。 字符串(quoted-string):由雙引號包裹表示的字符串。其中,0xA,0xD 和 雙引號"不能出現(xiàn)在該字符串中。該字符串區(qū)分大小寫。 可枚舉字符串(enumerated-string):由AttributeName顯示定義的一系列不帶引號的字符串。該字符串不能包含雙引號",逗號,和空白字符。 decimal-resolution:由字符x進(jìn)行隔離的兩個十進(jìn)制整型數(shù)。第一個整型表示水平寬度大小,第二個整型數(shù)表示垂直方向高度大?。▎挝唬合袼兀?。 標(biāo)簽:標(biāo)簽用于指定 m3u8 文件的全局參數(shù)或在其后面的切片文件/媒體播放列表的一些信息。 標(biāo)簽的類型可分為五種類型:基礎(chǔ)標(biāo)簽(Basic Tags),媒體片段類型標(biāo)簽(Media Segment Tags),媒體播放列表類型標(biāo)簽,主播放列表類型標(biāo)簽 和 播放列表類型標(biāo)簽。其具體內(nèi)容如下所示:
基礎(chǔ)標(biāo)簽(Basic Tags):可同時適用于媒體播放列表(Media Playlist)和主播放列表(Master Playlist)。具體標(biāo)簽如下:
EXTM3U:表明該文件是一個 m3u8 文件。每個 M3U 文件必須將該標(biāo)簽放置在第一行。 EXT-X-VERSION:表示 HLS 的協(xié)議版本號,該標(biāo)簽與流媒體的兼容性相關(guān)。該標(biāo)簽為全局作用域,使能整個 m3u8 文件;每個 m3u8 文件內(nèi)最多只能出現(xiàn)一個該標(biāo)簽定義。如果 m3u8 文件不包含該標(biāo)簽,則默認(rèn)為協(xié)議的第一個版本。 媒體片段類型標(biāo)簽(Media Segment Tags):每個切片 URI 前面都有一系列媒體片段標(biāo)簽對其進(jìn)行描述。有些片段標(biāo)簽只對其后切片資源有效;有些片段標(biāo)簽對其后所有切片都有效,直到后續(xù)遇到另一個該標(biāo)簽描述。媒體片段類型標(biāo)簽不能出現(xiàn)在主播放列表(Master Playlist)中。具體標(biāo)簽如下:
EXTINF:表示其后 URL 指定的媒體片段時長(單位為秒)。每個 URL 媒體片段之前必須指定該標(biāo)簽。該標(biāo)簽的使用格式為:
#EXTINF:
duration:可以為十進(jìn)制的整型或者浮點型,其值必須小于或等于 EXT-X-TARGETDURATION 指定的值。 注:建議始終使用浮點型指定時長,這可以讓客戶端在定位流時,減少四舍五入錯誤。但是如果兼容版本號 EXT-X-VERSION 小于 3,那么必須使用整型。 EXT-X-BYTERANGE:該標(biāo)簽表示接下來的切片資源是其后 URI 指定的媒體片段資源的局部范圍(即截取 URI 媒體資源部分內(nèi)容作為下一個切片)。該標(biāo)簽只對其后一個 URI 起作用。其格式為:
#EXT-X-BYTERANGE:
n是一個十進(jìn)制整型,表示截取片段大?。▎挝唬鹤止?jié))。 可選參數(shù)o也是一個十進(jìn)制整型,指示截取起始位置(以字節(jié)表示,在 URI 指定的資源開頭移動該字節(jié)位置后進(jìn)行截?。?。 如果o未指定,則截取起始位置從上一個該標(biāo)簽截取完成的下一個字節(jié)(即上一個n+o+1)開始截取。 如果沒有指定該標(biāo)簽,則表明的切分范圍為整個 URI 資源片段。 注:使用 EXT-X-BYTERANGE 標(biāo)簽要求兼容版本號 EXT-X-VERSION 大于等于 4。 EXT-X-DISCONTINUITY:該標(biāo)簽表明其前一個切片與下一個切片之間存在中斷。其格式為:
#EXT-X-DISCONTINUITY 當(dāng)以下任一情況變化時,必須使用該標(biāo)簽:
文件格式(file format) 數(shù)字(number),類型(type),媒體標(biāo)識符(identifiers of tracks) 時間戳序列(timestamp sequence) 當(dāng)以下任一情況變化時,應(yīng)當(dāng)使用該標(biāo)簽:
編碼參數(shù)(encoding parameters) 編碼序列(encoding sequence) 注:EXT-X-DISCONTINUITY 的一個經(jīng)典使用場景就是在視屏流中插入廣告,由于視屏流與廣告視屏流不是同一份資源,因此在這兩種流切換時使用 EXT-X-DISCONTINUITY 進(jìn)行指明,客戶端看到該標(biāo)簽后,就會處理這種切換中斷問題,讓體驗更佳。 更多詳細(xì)內(nèi)容,請查看:Incorporating Ads into a Playlist
EXT-X-KEY:媒體片段可以進(jìn)行加密,而該標(biāo)簽可以指定解密方法。 該標(biāo)簽對所有 媒體片段 和 由標(biāo)簽 EXT-X-MAP 聲明的圍繞其間的所有 媒體初始化塊(Meida Initialization Section) 都起作用,直到遇到下一個 EXT-X-KEY(若 m3u8 文件只有一個 EXT-X-KEY 標(biāo)簽,則其作用于所有媒體片段)。 多個 EXT-X-KEY 標(biāo)簽如果最終生成的是同樣的秘鑰,則他們都可作用于同一個媒體片段。 該標(biāo)簽使用格式為:
#EXT-X-KEY:
METHOD:該值是一個可枚舉的字符串,指定了加密方法。 該鍵是必須參數(shù)。其值可為NONE,AES-128,SAMPLE-AES當(dāng)中的一個。 其中: NONE:表示切片未進(jìn)行加密(此時其他屬性不能出現(xiàn)); AES-128:表示表示使用 AES-128 進(jìn)行加密。 SAMPLE-AES:意味著媒體片段當(dāng)中包含樣本媒體,比如音頻或視頻,它們使用 AES-128 進(jìn)行加密。這種情況下 IV 屬性可以出現(xiàn)也可以不出現(xiàn)。
URI:指定密鑰路徑。 該密鑰是一個 16 字節(jié)的數(shù)據(jù)。 該鍵是必須參數(shù),除非 METHOD 為NONE。
IV:該值是一個 128 位的十六進(jìn)制數(shù)值。 AES-128 要求使用相同的 16字節(jié) IV 值進(jìn)行加密和解密。使用不同的 IV 值可以增強密碼強度。 如果屬性列表出現(xiàn) IV,則使用該值;如果未出現(xiàn),則默認(rèn)使用媒體片段序列號(即 EXT-X-MEDIA-SEQUENCE)作為其 IV 值,使用大端字節(jié)序,往左填充 0 直到序列號滿足 16 字節(jié)(128 位)。
KEYFORMAT:由雙引號包裹的字符串,標(biāo)識密鑰在密鑰文件中的存儲方式(密鑰文件中的 AES-128 密鑰是以二進(jìn)制方式存儲的16個字節(jié)的密鑰)。 該屬性為可選參數(shù),其默認(rèn)值為"identity"。 使用該屬性要求兼容版本號 EXT-X-VERSION 大于等于 5。
KEYFORMATVERSIONS:由一個或多個被/分割的正整型數(shù)值構(gòu)成的帶引號的字符串(比如:"1","1/2","1/2/5")。 如果有一個或多特定的 KEYFORMT 版本被定義了,則可使用該屬性指示具體版本進(jìn)行編譯。 該屬性為可選參數(shù),其默認(rèn)值為"1"。 使用該屬性要求兼容版本號 EXT-X-VERSION 大于等于 5。
EXT-X-MAP:該標(biāo)簽指明了獲取媒體初始化塊(Meida Initialization Section)的方法。 該標(biāo)簽對其后所有媒體片段生效,直至遇到另一個 EXT-X-MAP 標(biāo)簽。 其格式為:
#EXT-X-MAP:
URI:由引號包裹的字符串,指定了包含媒體初始化塊的資源的路徑。該屬性為必選參數(shù)。
BYTERANGE:由引號包裹的字符串,指定了媒體初始化塊在 URI 指定的資源的位置(片段)。 該屬性指定的范圍應(yīng)當(dāng)只包含媒體初始化塊。 該屬性為可選參數(shù),如果未指定,則表示 URI 指定的資源就是全部的媒體初始化塊。
EXT-X-PROGRAM-DATE-TIME:該標(biāo)簽使用一個絕對日期/時間表明第一個樣本片段的取樣時間。 其格式為:
#EXT-X-PROGRAM-DATE-TIME:
EXT-X-DATERANGE:該標(biāo)簽定義了一系列由屬性/值對組成的日期范圍。 其格式為:
#EXT-X-DATERANGE:
ID:雙引號包裹的唯一指明日期范圍的標(biāo)識。 該屬性為必選參數(shù)。
CLASS:雙引號包裹的由客戶定義的一系列屬性與與之對應(yīng)的語意值。 所有擁有同一 CLASS 屬性的日期范圍必須遵守對應(yīng)的語意。 該屬性為可選參數(shù)。
START-DATE:雙引號包裹的日期范圍起始值。 該屬性為必選參數(shù)。
END-DATE:雙引號包裹的日期范圍結(jié)束值。 該屬性值必須大于或等于 START-DATE。 該屬性為可選參數(shù)。
DURATION:日期范圍的持續(xù)時間是一個十進(jìn)制浮點型數(shù)值類型(單位:秒)。 該屬性值不能為負(fù)數(shù)。 當(dāng)表達(dá)立即時間時,將該屬性值設(shè)為 0 即可。 該屬性為可選參數(shù)。
PLANNED-DURATION:該屬性為日期范圍的期望持續(xù)時長。 其值為一個十進(jìn)制浮點數(shù)值類型(單位:秒)。 該屬性值不能為負(fù)數(shù)。 在預(yù)先無法得知真實持續(xù)時長的情況下,可使用該屬性作為日期范圍的期望預(yù)估時長。 該屬性為可選參數(shù)。
X-
SCTE35-CMD, SCTE35-OUT, SCTE35-IN:用于攜帶 SCET-35 數(shù)據(jù)。 該屬性為可選參數(shù)。
END-ON-NEXT:該屬性值為一個可枚舉字符串,其值必須為YES。 該屬性表明達(dá)到該范圍末尾,也即等于后續(xù)范圍的起始位置 START-DATE。后續(xù)范圍是指具有相同 CLASS 的,在該標(biāo)簽 START-DATE 之后的具有最早 START-DATE 值的日期范圍。 該屬性時可選參數(shù)。
媒體播放列表類型標(biāo)簽:媒體播放列表標(biāo)簽為 m3u8 文件的全局參數(shù)信息。 這些標(biāo)簽只能在 m3u8 文件中至多出現(xiàn)一次。 媒體播放列表(Media Playlist)標(biāo)簽不能出現(xiàn)在主播放列表(Master Playlist)中。 媒體播放列表具體標(biāo)簽如下所示:
EXT-X-TARGETDURATION:表示每個視頻分段最大的時長(單位秒)。 該標(biāo)簽為必選標(biāo)簽。 其格式為:
#EXT-X-TARGETDURATION: 其中:參數(shù)s表示目標(biāo)時長(單位:秒)。
EXT-X-MEDIA-SEQUENCE:表示播放列表第一個 URL 片段文件的序列號。 每個媒體片段 URL 都擁有一個唯一的整型序列號。 每個媒體片段序列號按出現(xiàn)順序依次加 1。 如果該標(biāo)簽未指定,則默認(rèn)序列號從 0 開始。 媒體片段序列號與片段文件名無關(guān)。 其格式為:
#EXT-X-MEDIA-SEQUENCE:
EXT-X-DISCONTINUITY-SEQUENCE:該標(biāo)簽使能同步相同流的不同 Rendition 和 具備 EXT-X-DISCONTINUITY 標(biāo)簽的不同備份流。 其格式為:
#EXT-X-DISCONTINUITY-SEQUENCE:
EXT-X-ENDLIST:表明 m3u8 文件的結(jié)束。 該標(biāo)簽可出現(xiàn)在 m3u8 文件任意位置,一般是結(jié)尾。 其格式為:
#EXT-X-ENDLIST EXT-X-PLAYLIST-TYPE:表明流媒體類型。全局生效。 該標(biāo)簽為可選標(biāo)簽。 其格式為:
#EXT-X-PLAYLIST-TYPE:
VOD:即 Video on Demand,表示該視屏流為點播源,因此服務(wù)器不能更改該 m3u8 文件;
EVENT:表示該視頻流為直播源,因此服務(wù)器不能更改或刪除該文件任意部分內(nèi)容(但是可以在文件末尾添加新內(nèi)容)。 注:VOD 文件通常帶有 EXT-X-ENDLIST 標(biāo)簽,因為其為點播源,不會改變;而 EVEVT 文件初始化時一般不會有 EXT-X-ENDLIST 標(biāo)簽,暗示有新的文件會添加到播放列表末尾,因此也需要客戶端定時獲取該 m3u8 文件,以獲取新的媒體片段資源,直到訪問到 EXT-X-ENDLIST 標(biāo)簽才停止)。
EXT-X-I-FRAMES-ONLY:該標(biāo)簽表示每個媒體片段都是一個 I-frame。I-frames 幀視屏編碼不依賴于其他幀數(shù),因此可以通過 I-frame 進(jìn)行快速播放,急速翻轉(zhuǎn)等操作。 該標(biāo)簽全局生效。 其格式為:
#EXT-X-I-FRAMES-ONLY 如果播放列表設(shè)置了 EXT-X-I-FRAMES-ONLY,那么切片的時長(EXTINF 標(biāo)簽的值)即為當(dāng)前切片 I-frame 幀開始到下一個 I-frame 幀出現(xiàn)的時長。 媒體資源如果包含 I-frame 切片,那么必須提供媒體初始化塊或者通過 EXT-X-MAP 標(biāo)簽提供媒體初始化塊的獲取途徑,這樣客戶端就能通過這些 I-frame 切片以任意順序進(jìn)行加載和解碼。 如果 I-frame 切片設(shè)置了 EXT-BYTERANGE,那么就絕對不能提供媒體初始化塊。 使用 EXT-X-I-FRAMES-ONLY 要求的兼容版本號 EXT-X-VERSION 大于等于 4。
主播放列表類型標(biāo)簽:主播放列表(Master Playlist)定義了備份流,多語言翻譯流和其他全局參數(shù)。 主播放列表標(biāo)簽絕不能出現(xiàn)在媒體播放列表(Media Playlist)中。 其具體標(biāo)簽如下:
EXT-X-MEDIA:用于指定相同內(nèi)容的可替換的多語言翻譯播放媒體列表資源。 比如,通過三個 EXT-X-MEIDA 標(biāo)簽,可以提供包含英文,法語和西班牙語版本的相同內(nèi)容的音頻資源,或者通過兩個 EXT-X-MEDIA 提供兩個不同拍攝角度的視屏資源。 其格式為:
#EXT-X-MEDIA:
TYPE:該屬性值為一個可枚舉字符串。 其值有如下四種:AUDIO,VIDEO,SUBTITLES,CLOSED-CAPTIONS。 通常使用的都是CLOSED-CAPTIONS。 該屬性為必選參數(shù)。
URI:雙引號包裹的媒體資源播放列表路徑。 如果 TYPE 屬性值為 CLOSED-CAPTIONS,那么則不能提供 URI。 該屬性為可選參數(shù)。
GROUP-ID:雙引號包裹的字符串,表示多語言翻譯流所屬組。 該屬性為必選參數(shù)。
LANGUAGE:雙引號包裹的字符串,用于指定流主要使用的語言。 該屬性為可選參數(shù)。
ASSOC-LANGUAGE:雙引號包裹的字符串,其內(nèi)包含一個語言標(biāo)簽,用于提供多語言流的其中一種語言版本。 該參數(shù)為可選參數(shù)。
NAME:雙引號包裹的字符串,用于為翻譯流提供可讀的描述信息。 如果設(shè)置了 LANGUAGE 屬性,那么也應(yīng)當(dāng)設(shè)置 NAME 屬性。 該屬性為必選參數(shù)。
DEFAULT:該屬性值為一個可枚舉字符串。 可選值為YES和NO。 該屬性未指定時默認(rèn)值為NO。 如果該屬性設(shè)為YES,那么客戶端在缺乏其他可選信息時應(yīng)當(dāng)播放該翻譯流。 該屬性為可選參數(shù)。
AUTOSELECT:該屬性值為一個可枚舉字符串。 其有效值為YES或NO。 未指定時,默認(rèn)設(shè)為NO。 如果該屬性設(shè)置YES,那么客戶端在用戶沒有顯示進(jìn)行設(shè)置時,可以選擇播放該翻譯流,因為其能配置當(dāng)前播放環(huán)境,比如系統(tǒng)語言選擇。 如果設(shè)置了該屬性,那么當(dāng) DEFAULT 設(shè)置YES時,該屬性也必須設(shè)置為YES。 該屬性為可選參數(shù)。
FORCED:該屬性值為一個可枚舉字符串。 其有效值為YES或NO。 未指定時,默認(rèn)設(shè)為NO。 只有在設(shè)置了 TYPE 為 SUBTITLES 時,才可以設(shè)置該屬性。 當(dāng)該屬性設(shè)為YES時,則暗示該翻譯流包含重要內(nèi)容。當(dāng)設(shè)置了該屬性,客戶端應(yīng)當(dāng)選擇播放匹配當(dāng)前播放環(huán)境最佳的翻譯流。 當(dāng)該屬性設(shè)為NO時,則表示該翻譯流內(nèi)容意圖用于回復(fù)用戶顯示進(jìn)行請求。 該屬性為可選參數(shù)。
INSTREAM-ID:由雙引號包裹的字符串,用于指示切片的語言(Rendition)版本。 當(dāng) TYPE 設(shè)為 CLOSED-CAPTIONS 時,必須設(shè)置該屬性。 其可選值為:"CC1", "CC2", "CC3", "CC4" 和 "SERVICEn"(n的值為 1~63)。 對于其他 TYPE 值,該屬性絕不能進(jìn)行設(shè)置。
CHARACTERISTICS:由雙引號包裹的由一個或多個由逗號分隔的 UTI 構(gòu)成的字符串。 每個 UTI 表示一種翻譯流的特征。 該屬性可包含私有 UTI。 該屬性為可選參數(shù)。
CHANNELS:由雙引號包裹的有序,由反斜杠/分隔的參數(shù)列表組成的字符串。 所有音頻 EXT-X-MEDIA 標(biāo)簽應(yīng)當(dāng)都設(shè)置 CHANNELS 屬性。 如果主播放列表包含兩個相同編碼但是具有不同數(shù)目 channed 的翻譯流,則必須設(shè)置 CHANNELS 屬性;否則,CHANNELS 屬性為可選參數(shù)。
EXT-X-STREAM-INF:該屬性指定了一個備份源。該屬性值提供了該備份源的相關(guān)信息。 其格式為:
#EXT-X-STREAM-INF:
URI 指定的媒體播放列表攜帶了該標(biāo)簽指定的翻譯備份源。 URI 為必選參數(shù)。
EXT-X-STREAM-INF 標(biāo)簽的參數(shù)屬性列表有如下選項:
BANDWIDTH:該屬性為每秒傳輸?shù)谋忍財?shù),也即帶寬。代表該備份流的巔峰速率。 該屬性為必選參數(shù)。
AVERAGE-BANDWIDTH:該屬性為備份流的平均切片傳輸速率。 該屬性為可選參數(shù)。
CODECS:雙引號包裹的包含由逗號分隔的格式列表組成的字符串。 每個 EXT-X-STREAM-INF 標(biāo)簽都應(yīng)當(dāng)攜帶 CODECS 屬性。
RESOLUTION:該屬性描述備份流視屏源的最佳像素方案。 該屬性為可選參數(shù),但對于包含視屏源的備份流建議增加該屬性設(shè)置。
FRAME-RATE:該屬性用一個十進(jìn)制浮點型數(shù)值作為描述備份流所有視屏最大幀率。 對于備份流中任意視屏源幀數(shù)超過每秒 30 幀的,應(yīng)當(dāng)增加該屬性設(shè)置。 該屬性為可選參數(shù),但對于包含視屏源的備份流建議增加該屬性設(shè)置。
HDCP-LEVEL:該屬性值為一個可枚舉字符串。 其有效值為TYPE-0或NONE。 值為TYPE-0表示該備份流可能會播放失敗,除非輸出被高帶寬數(shù)字內(nèi)容保護(HDCP)。 值為NONE表示流內(nèi)容無需輸出拷貝保護。 使用不同程度的 HDCP 加密備份流應(yīng)當(dāng)使用不同的媒體加密密鑰。 該屬性為可選參數(shù)。在缺乏 HDCP 可能存在播放失敗的情況下,應(yīng)當(dāng)提供該屬性。
AUDIO:屬性值由雙引號包裹,其值必須與定義在主播放列表某處的設(shè)置了 TYPE 屬性值為 AUDIO 的 EXT-X-MEDIA 標(biāo)簽的 GROUP-ID 屬性值相匹配。 該屬性為可選參數(shù)。
VIDEO:屬性值由雙引號包裹,其值必須與定義在主播放列表某處的設(shè)置了 TYPE 屬性值為 VIDEO 的 EXT-X-MEDIA 標(biāo)簽的 GROUP-ID 屬性值相匹配。 該屬性為可選參數(shù)。
SUBTITLES:屬性值由雙引號包裹,其值必須與定義在主播放列表某處的設(shè)置了 TYPE 屬性值為 SUBTITLES 的 EXT-X-MEDIA 標(biāo)簽的 GROUP-ID 屬性值相匹配。 該屬性為可選參數(shù)。
CLOSED-CAPTIONS:該屬性值可以是一個雙引號包裹的字符串或NONE。 如果其值為一個字符串,則必須與定義在主播放列表某處的設(shè)置了 TYPE 屬性值為 CLOSED-CAPTIONS 的 EXT-X-MEDIA 標(biāo)簽的 GROUP-ID 屬性值相匹配。 如果其值為NONE,則所有的 ext-x-stream-inf 標(biāo)簽必須同樣將該屬性設(shè)置NONE,表示主播放列表備份流均沒有關(guān)閉的標(biāo)題。對于某個備份流具備關(guān)閉標(biāo)題,另一個備份流不具備關(guān)閉標(biāo)題可能會觸發(fā)播放中斷。 該屬性為可選參數(shù)。
EXT-X-I-FRAME-STREAM-INF:該標(biāo)簽表明媒體播放列表文件包含多種媒體資源的 I-frame 幀。 其格式為:
#EXT-X-I-FRAME-STREAM-INF:
URI:該屬性值由雙引號包裹的字符串,指示了 I-frame 媒體播放列表文件的路徑,該媒體播放列表文件必須包含 EXT-X-I-FRAMES-ONLY 標(biāo)簽。 EXT-X-SESSION-DATA:該標(biāo)簽允許主播放列表攜帶任意 session 數(shù)據(jù)。 該標(biāo)簽為可選參數(shù)。 其格式為:
#EXT-X-SESSION-DATA:
DATA-ID:由雙引號包裹的字符串,代表一個特定的數(shù)據(jù)值。 該屬性應(yīng)當(dāng)使用反向 DNS 進(jìn)行命名,如"com.example.movie.title"。然而,由于沒有中央注冊機構(gòu),所以可能出現(xiàn)沖突情況。 該屬性為必選參數(shù)。
VALUE:該屬性值為一個雙引號包裹的字符串,其包含 DATA-ID 指定的值。 如果設(shè)置了 LANGUAGE,則 VALUE 應(yīng)當(dāng)包含一個用該語言書寫的可讀字符串。
URI:由雙引號包裹的 URI 字符串。由該 URI 指示的資源必選使用 JSON 格式,否則,客戶端可能會解析失敗。
LANGUAGE:由雙引號包裹的,包含一個語言標(biāo)簽的字符串。指示了 VALUE 所使用的語言。
EXT-X-SESSION-KEY:該標(biāo)簽允許主播放列表(Master Playlist)指定媒體播放列表(Meida Playlist)的加密密鑰。這使得客戶端可以預(yù)先加載這些密鑰,而無需從媒體播放列表中獲取。 該標(biāo)簽為可選參數(shù)。 其格式為: #EXT-X-SESSION-KEY:
EXT-X-INDEPENDENT-SEGMENTS:該標(biāo)簽表明對于一個媒體片段中的所有媒體樣本均可獨立進(jìn)行解碼,而無須依賴其他媒體片段信息。 該標(biāo)簽對列表內(nèi)所有媒體片段均有效。 其格式為:
#EXT-X-INDEPENDENT-SEGMENTS 如果該標(biāo)簽出現(xiàn)在主播放列表中,則其對所有媒體播放列表的所有媒體片段都生效。
EXT-X-START:該標(biāo)簽表示播放列表播放起始位置。 默認(rèn)情況下,客戶端開啟一個播放會話時,應(yīng)當(dāng)使用該標(biāo)簽指定的位置進(jìn)行播放。 該標(biāo)簽為可選標(biāo)簽。 其格式為:
#EXT-X-START:
TIME-OFFSET:該屬性值為一個帶符號十進(jìn)制浮點數(shù)(單位:秒)。 一個正數(shù)表示以播放列表起始位置開始的時間偏移量。 一個負(fù)數(shù)表示播放列表上一個媒體片段最后位置往前的時間偏移量。 該屬性的絕對值應(yīng)當(dāng)不超過播放列表的時長。如果超過,則表示到達(dá)文件結(jié)尾(數(shù)值為正數(shù)),或者達(dá)到文件起始(數(shù)值為負(fù)數(shù))。 如果播放列表不包含 EXT-X-ENDLIST 標(biāo)簽,那么 TIME-OFFSET 屬性值不應(yīng)當(dāng)在播放文件末尾三個切片時長之內(nèi)。
PRECISE:該值為一個可枚舉字符串。 有效的取值為YES 或 NO。 如果值為YES,客戶端應(yīng)當(dāng)播放包含 TIME-OFFSET 的媒體片段,但不要渲染該塊內(nèi)優(yōu)先于 TIME-OFFSET 的樣本塊。 如果值為NO,客戶端應(yīng)當(dāng)嘗試渲染在媒體片段內(nèi)的所有樣本塊。 該屬性為可選參數(shù),未指定則認(rèn)為NO。
到此,m3u8 相關(guān)的標(biāo)簽我們已經(jīng)完全介紹完畢。
下面我們再簡單介紹下資源文件的獲取具體操作。
上文提到,m3u8 文件要么是媒體播放列表(Meida Playlist),要么是主播放列表(Master Playlist)。但無論是哪種列表,其有效內(nèi)容均由兩部分結(jié)構(gòu)組成:
以 #EXT 開頭的為標(biāo)簽信息,作為對媒體資源的進(jìn)一步描述; 剩余的為資源信息,要么是片段資源(Media Playlist)路徑,要么是 m3u8 資源(Master Playlist)路徑; 我們先簡單介紹下 m3u8 文件媒體片段的表示方法:
m3u8 文件中,媒體片段可以采用全路徑表示。如下所示: #EXTINF:10.0, http://example.com/movie1/fileSequenceA.ts 這樣,獲取資源片段的路徑就是 m3u8 文件內(nèi)指定的路徑,即:http://example.com/movie1/fileSequenceA.ts
m3u8 文件中,媒體片段還可以使用相對路徑表示。如下所示: #EXTINF:10.0, fileSequenceA.ts 這表示片段文件的路徑是相對于 m3u8 文件路徑的,即假設(shè)當(dāng)前 m3u8 的路徑為:https://127.0.0.1/hls/m3u8,那么,片段文件 fileSequenceA.ts 的路徑即為:https://127.0.0.1/hls/fileSequenceA.ts
盡管可以在 m3u8 文件中使用絕對路徑指定媒體片段資源路徑,但是更好的選擇是使用相對路徑。相對路徑相較于絕對路徑更輕便,同時是相對于 m3u8 文件的 URL。相比之下,絕對路徑增加了 m3u8 文件內(nèi)容(更多字符),增大了文件內(nèi)容,同時也增大了網(wǎng)絡(luò)傳輸量。
其余一些注意事項 有兩種請求 m3u8 播放列表的方法:一是通過 m3u8 的 URI 進(jìn)行請求,則該文件必須以 .m3u8 或 .m3u 結(jié)尾; 二是通過 HTTP 進(jìn)行請求,則請求頭Content-Type必須設(shè)置為 application/vnd.apple.mpegurl或者audio/mpegurl。
空行和注釋行在解析時都忽略。
媒體播放列表(Media Playlist)的流資源總時長就是各切片資源的時長之和。
每個切片的碼率(bit rate)就是切片的大小除以它對應(yīng)的時長(EXTINF 指定的時長)。
一個標(biāo)簽的屬性列表的同一個屬性AttributeName只能出現(xiàn)一次。
EXT-X-TARGETDURATION 指定的時長絕對不能進(jìn)行更改。通常該值指定的時長為 10 秒。
對于指定了 EXT-X-I-FRAMES-ONLY 且 第一個媒體片段(或者第一個尾隨 EXT-X-DISCONTINUITY 的片段)其資源沒有立即攜帶媒體初始化塊的切片,應(yīng)當(dāng)增加使用標(biāo)簽 EXT-X-MAP 指定媒體初始化塊獲取途徑。
使用 EXT-X-MAP 標(biāo)簽內(nèi)含標(biāo)簽 EXT-X-I-FRAMES-ONLY 要求的兼容版本號 EXT-X-VERSION 要大于等于 5;只使用 EXT-X-MAP 要求的兼容版本號要大于等于 6。
由標(biāo)簽 EXT-X-MAP 聲明的媒體初始化塊可使用 AES-128 方法進(jìn)行加密,此時,作用于 EXT-X-MAP 標(biāo)簽的 EXT-X-KEY 標(biāo)簽必須設(shè)置 IV 屬性。
帶有屬性 END-ON-NEXT=YES 的標(biāo)簽 EXT-X-DATERANGE 必須攜帶 CLASS 屬性,但不能攜帶 DURATION 和 END-DATE 屬性。其余帶有相同 CLASS 的標(biāo)簽 EXT-X-DATERANGE 不能指定重疊的日期范圍。
日期范圍如果未指明 DURATION,END_DATE,END-ON-NEXT=YES 屬性時,則其時長(duration)未知,即使其設(shè)置了 PLANNED-DURATION 屬性。
如果播放列表設(shè)置了 EXT-X-DATERANGE 標(biāo)簽,則必須同時設(shè)置 EXT-X-PROGRAM-DATE-TIME 標(biāo)簽。
如果播放列表設(shè)置了擁有相同 ID 屬性值的兩個 EXT-X-DATERANGE 標(biāo)簽,則對于相同的屬性名,在這兩個 EXT-X-DATERANGE 中對應(yīng)的值必須一致。
如果 EXT-X-DATERANGE 同時設(shè)置了 DURATION 和 END-DATE 屬性,則 END-DATE 屬性值必須等于 START-DATE 屬性值加上 DURATION 屬性值。
EXT-X-MEDIA-SEQUENCE 標(biāo)簽必須出現(xiàn)在播放列表第一個切片之前。
EXT-X-DISCONTINUITY-DEQUENCE 標(biāo)簽必須出現(xiàn)在播放列表第一個切片之前。
EXT-X-DISCONTINUITY-DEQUENCE 標(biāo)簽必須出現(xiàn)在任意 EXT-X-DISCONTINUITY 標(biāo)簽之前。
m3u8 文件如果沒有設(shè)置 EXT-X-PLAYLIST-TYPE 標(biāo)簽,那么播放列表可以隨時進(jìn)行更改。比如,可以更新或刪除播放列表中的媒體片段。
每個 EXT-X-I-FRAME-STREAM-INF 標(biāo)簽必須包含一個 BANDWIDTH 和 URI 屬性。
每個 EXT-X-SESSION-DATA 標(biāo)簽都必須包含一個 VALUE 或 URI 屬性,但不能同時包含兩者。
一個播放列表可以包含多個攜帶相同 DATA-ID 屬性的 EXT-X-SESSION-DATA 標(biāo)簽。但是不能包含多個攜帶相同 DATA-ID 和相同 LANGUAGE 屬性的 EXT-X-SESSION-DATA 標(biāo)簽。
如果設(shè)置了 EXT-X-SESSION-KEY,那么其 METHOD,KEYFORMAT 和 KEYFORMATVERSIONS 屬性值必須與任意相同 URI 的 EXT-X-KEY 標(biāo)簽值相同。
如果多份備用流或者多語言流使用相同的加密密鑰和格式,則應(yīng)當(dāng)設(shè)置 EXT-X-SESSION-KEY 標(biāo)簽。
主播放列表必須不能設(shè)置多個具有相同 METHOD,URI,IV,KEYFORMAT 和 KEYFORMATVERSIONS 屬性值得 EXT-X-SESSION-KEY 標(biāo)簽。
以上是“m3u8文件格式的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!