溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

m3u8文件格式的示例分析

發(fā)布時間:2021-11-17 11:53:48 來源:億速云 閱讀:312 作者:小新 欄目:大數(shù)據(jù)

這篇文章主要為大家展示了“m3u8文件格式的示例分析”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學習一下“m3u8文件格式的示例分析”這篇文章吧。

m3u8 文件格式詳解

M3U8 是 Unicode 版本的 M3U,用 UTF-8 編碼。"M3U" 和 "M3U8" 文件都是蘋果公司使用的 HTTP Live Streaming(HLS) 協(xié)議格式的基礎(chǔ),這種協(xié)議格式可以在 iPhone 和 Macbook 等設備播放。

上述文字定義來自于維基百科。可以看到,m3u8 文件其實是 HTTP Live Streaming(縮寫為 HLS) 協(xié)議的部分內(nèi)容,而 HLS 是一個由蘋果公司提出的基于 HTTP 的流媒體網(wǎng)絡傳輸協(xié)議。

HLS 的工作原理是把整個流分成一個個小的基于 HTTP 的文件來下載,每次只下載一些。當媒體流正在播放時,客戶端可以選擇從許多不同的備用源中以不同的速率下載同樣的資源,允許流媒體會話適應不同的數(shù)據(jù)速率。在開始一個流媒體會話時,客戶端會下載一個包含元數(shù)據(jù)的 extended M3U (m3u8) playlist文件,用于尋找可用的媒體流。 HLS 只請求基本的 HTTP 報文,與實時傳輸協(xié)議(RTP)不同,HLS 可以穿過任何允許 HTTP 數(shù)據(jù)通過的防火墻或者代理服務器。它也很容易使用內(nèi)容分發(fā)網(wǎng)絡來傳輸媒體流。

簡而言之,HLS 是新一代流媒體傳輸協(xié)議,其基本實現(xiàn)原理為將一個大的媒體文件進行分片,將該分片文件資源路徑記錄于 m3u8 文件(即 playlist)內(nèi),其中附帶一些額外描述(比如該資源的多帶寬信息···)用于提供給客戶端。客戶端依據(jù)該 m3u8 文件即可獲取對應的媒體資源,進行播放。

因此,客戶端獲取 HLS 流文件,主要就是對 m3u8 文件進行解析操作。

那么,下面就簡單介紹下 m3u8 文件。

M3U8 文件簡介 m3u8 文件實質(zhì)是一個播放列表(playlist),其可能是一個媒體播放列表(Media Playlist),或者是一個主列表(Master Playlist)。但無論是哪種播放列表,其內(nèi)部文字使用的都是 utf-8 編碼。

當 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 對于點播來說,客戶端只需按順序下載上述片段資源,依次進行播放即可。而對于直播來說,客戶端需要 定時重新請求 該 m3u8 文件,看下是否有新的片段數(shù)據(jù)需要進行下載并播放。

當 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)絡狀態(tài)選取合適碼流的資源,并且最好根據(jù)用戶喜好選擇合適的資源內(nèi)容。

更多詳細內(nèi)容,可查看:

Creating a Master Playlist Adding Alternate Media to a Playlist 以上,就是 m3u8 文件的大概內(nèi)容。下面,我們就對 m3u8 內(nèi)容格式進行講解。

m3u8 文件格式簡解 m3u8 的文件格式主要包含三方面內(nèi)容:

文件播放列表格式定義:播放列表(Playlist,也即 m3u8 文件) 內(nèi)容需嚴格滿足規(guī)范定義所提要求。下面羅列一些主要遵循的條件: m3u8 文件必須以 utf-8 進行編碼,不能使用 Byte Order Mark(BOM)字節(jié)序, 不能包含 utf-8 控制字符(U+0000 ~ U_001F 和 U+007F ~ u+009F)。

m3u8 文件的每一行要么是一個 URI,要么是空行,要么就是以 # 開頭的字符串。不能出現(xiàn)空白字符,除了顯示聲明的元素。

m3u8 文件中以 # 開頭的字符串要么是注釋,要么就是標簽。標簽以 #EXT 開頭,大小寫敏感。

屬性列表(Attribute Lists):某些特定的標簽的值為屬性列表。標簽后面的屬性列表以 逗號 作為分隔符,分離出多組不帶空格的 屬性/值 對。 屬性/值 對的語法格式如下: AttributeName=AttributeValue 其中:

屬性AttributeName是由 [A..Z],[0..9] 和 - 組成的不帶引號的字符串。因此,屬性AttributeName只能使用大寫字母,不能使用小寫字母,并且AttributeName和=中間不能有空格,同理,=和AttributeValue之間也不能有空格。

值A(chǔ)ttributeValue的只能取以下類型:

十進制整型(decimal-interger):由 [0..9] 之間組成的十進制不帶引號的字符串,范圍為 0 ~ 2^{64}(18446744073709551615),字符長度為 1 ~ 20 之間。 十六進制序列:由 [0..9] 和 [A..F] 且前綴為 0x 或 0X 組合成的不帶引號的字符串。其序列的最大長度取決于他的屬性名AttributeNames。 帶符號十進制浮點型(signed-decimal-floating-point):由 [0..9],-和.組合成的不帶引號的字符串。 字符串(quoted-string):由雙引號包裹表示的字符串。其中,0xA,0xD 和 雙引號"不能出現(xiàn)在該字符串中。該字符串區(qū)分大小寫。 可枚舉字符串(enumerated-string):由AttributeName顯示定義的一系列不帶引號的字符串。該字符串不能包含雙引號",逗號,和空白字符。 decimal-resolution:由字符x進行隔離的兩個十進制整型數(shù)。第一個整型表示水平寬度大小,第二個整型數(shù)表示垂直方向高度大?。▎挝唬合袼兀?標簽:標簽用于指定 m3u8 文件的全局參數(shù)或在其后面的切片文件/媒體播放列表的一些信息。 標簽的類型可分為五種類型:基礎(chǔ)標簽(Basic Tags),媒體片段類型標簽(Media Segment Tags),媒體播放列表類型標簽,主播放列表類型標簽 和 播放列表類型標簽。其具體內(nèi)容如下所示:

基礎(chǔ)標簽(Basic Tags):可同時適用于媒體播放列表(Media Playlist)和主播放列表(Master Playlist)。具體標簽如下:

EXTM3U:表明該文件是一個 m3u8 文件。每個 M3U 文件必須將該標簽放置在第一行。 EXT-X-VERSION:表示 HLS 的協(xié)議版本號,該標簽與流媒體的兼容性相關(guān)。該標簽為全局作用域,使能整個 m3u8 文件;每個 m3u8 文件內(nèi)最多只能出現(xiàn)一個該標簽定義。如果 m3u8 文件不包含該標簽,則默認為協(xié)議的第一個版本。 媒體片段類型標簽(Media Segment Tags):每個切片 URI 前面都有一系列媒體片段標簽對其進行描述。有些片段標簽只對其后切片資源有效;有些片段標簽對其后所有切片都有效,直到后續(xù)遇到另一個該標簽描述。媒體片段類型標簽不能出現(xiàn)在主播放列表(Master Playlist)中。具體標簽如下:

EXTINF:表示其后 URL 指定的媒體片段時長(單位為秒)。每個 URL 媒體片段之前必須指定該標簽。該標簽的使用格式為:

#EXTINF:<duration>,[<title>] 其中:

duration:可以為十進制的整型或者浮點型,其值必須小于或等于 EXT-X-TARGETDURATION 指定的值。 注:建議始終使用浮點型指定時長,這可以讓客戶端在定位流時,減少四舍五入錯誤。但是如果兼容版本號 EXT-X-VERSION 小于 3,那么必須使用整型。 EXT-X-BYTERANGE:該標簽表示接下來的切片資源是其后 URI 指定的媒體片段資源的局部范圍(即截取 URI 媒體資源部分內(nèi)容作為下一個切片)。該標簽只對其后一個 URI 起作用。其格式為:

#EXT-X-BYTERANGE:<n>[@<o>] 其中:

n是一個十進制整型,表示截取片段大?。▎挝唬鹤止?jié))。 可選參數(shù)o也是一個十進制整型,指示截取起始位置(以字節(jié)表示,在 URI 指定的資源開頭移動該字節(jié)位置后進行截取)。 如果o未指定,則截取起始位置從上一個該標簽截取完成的下一個字節(jié)(即上一個n+o+1)開始截取。 如果沒有指定該標簽,則表明的切分范圍為整個 URI 資源片段。 注:使用 EXT-X-BYTERANGE 標簽要求兼容版本號 EXT-X-VERSION 大于等于 4。 EXT-X-DISCONTINUITY:該標簽表明其前一個切片與下一個切片之間存在中斷。其格式為:

#EXT-X-DISCONTINUITY 當以下任一情況變化時,必須使用該標簽:

文件格式(file format) 數(shù)字(number),類型(type),媒體標識符(identifiers of tracks) 時間戳序列(timestamp sequence) 當以下任一情況變化時,應當使用該標簽:

編碼參數(shù)(encoding parameters) 編碼序列(encoding sequence) 注:EXT-X-DISCONTINUITY 的一個經(jīng)典使用場景就是在視屏流中插入廣告,由于視屏流與廣告視屏流不是同一份資源,因此在這兩種流切換時使用 EXT-X-DISCONTINUITY 進行指明,客戶端看到該標簽后,就會處理這種切換中斷問題,讓體驗更佳。 更多詳細內(nèi)容,請查看:Incorporating Ads into a Playlist

EXT-X-KEY:媒體片段可以進行加密,而該標簽可以指定解密方法。 該標簽對所有 媒體片段 和 由標簽 EXT-X-MAP 聲明的圍繞其間的所有 媒體初始化塊(Meida Initialization Section) 都起作用,直到遇到下一個 EXT-X-KEY(若 m3u8 文件只有一個 EXT-X-KEY 標簽,則其作用于所有媒體片段)。 多個 EXT-X-KEY 標簽如果最終生成的是同樣的秘鑰,則他們都可作用于同一個媒體片段。 該標簽使用格式為:

#EXT-X-KEY:<attribute-list> 屬性列表可以包含如下幾個鍵:

METHOD:該值是一個可枚舉的字符串,指定了加密方法。 該鍵是必須參數(shù)。其值可為NONE,AES-128,SAMPLE-AES當中的一個。 其中: NONE:表示切片未進行加密(此時其他屬性不能出現(xiàn)); AES-128:表示表示使用 AES-128 進行加密。 SAMPLE-AES:意味著媒體片段當中包含樣本媒體,比如音頻或視頻,它們使用 AES-128 進行加密。這種情況下 IV 屬性可以出現(xiàn)也可以不出現(xiàn)。

URI:指定密鑰路徑。 該密鑰是一個 16 字節(jié)的數(shù)據(jù)。 該鍵是必須參數(shù),除非 METHOD 為NONE。

IV:該值是一個 128 位的十六進制數(shù)值。 AES-128 要求使用相同的 16字節(jié) IV 值進行加密和解密。使用不同的 IV 值可以增強密碼強度。 如果屬性列表出現(xiàn) IV,則使用該值;如果未出現(xiàn),則默認使用媒體片段序列號(即 EXT-X-MEDIA-SEQUENCE)作為其 IV 值,使用大端字節(jié)序,往左填充 0 直到序列號滿足 16 字節(jié)(128 位)。

KEYFORMAT:由雙引號包裹的字符串,標識密鑰在密鑰文件中的存儲方式(密鑰文件中的 AES-128 密鑰是以二進制方式存儲的16個字節(jié)的密鑰)。 該屬性為可選參數(shù),其默認值為"identity"。 使用該屬性要求兼容版本號 EXT-X-VERSION 大于等于 5。

KEYFORMATVERSIONS:由一個或多個被/分割的正整型數(shù)值構(gòu)成的帶引號的字符串(比如:"1","1/2","1/2/5")。 如果有一個或多特定的 KEYFORMT 版本被定義了,則可使用該屬性指示具體版本進行編譯。 該屬性為可選參數(shù),其默認值為"1"。 使用該屬性要求兼容版本號 EXT-X-VERSION 大于等于 5。

EXT-X-MAP:該標簽指明了獲取媒體初始化塊(Meida Initialization Section)的方法。 該標簽對其后所有媒體片段生效,直至遇到另一個 EXT-X-MAP 標簽。 其格式為:

#EXT-X-MAP:<attribute-list> 其屬性列表取值范圍如下:

URI:由引號包裹的字符串,指定了包含媒體初始化塊的資源的路徑。該屬性為必選參數(shù)。

BYTERANGE:由引號包裹的字符串,指定了媒體初始化塊在 URI 指定的資源的位置(片段)。 該屬性指定的范圍應當只包含媒體初始化塊。 該屬性為可選參數(shù),如果未指定,則表示 URI 指定的資源就是全部的媒體初始化塊。

EXT-X-PROGRAM-DATE-TIME:該標簽使用一個絕對日期/時間表明第一個樣本片段的取樣時間。 其格式為:

#EXT-X-PROGRAM-DATE-TIME:<date-time-msec> 其中,date-time-msec是一個 ISO/IEC 8601:2004 規(guī)定的日期格式,形如:YYYY-MM-DDThh:mm:ss.SSSZ。

EXT-X-DATERANGE:該標簽定義了一系列由屬性/值對組成的日期范圍。 其格式為:

#EXT-X-DATERANGE:<attribute-list> 其屬性列表取值如下:

ID:雙引號包裹的唯一指明日期范圍的標識。 該屬性為必選參數(shù)。

CLASS:雙引號包裹的由客戶定義的一系列屬性與與之對應的語意值。 所有擁有同一 CLASS 屬性的日期范圍必須遵守對應的語意。 該屬性為可選參數(shù)。

START-DATE:雙引號包裹的日期范圍起始值。 該屬性為必選參數(shù)。

END-DATE:雙引號包裹的日期范圍結(jié)束值。 該屬性值必須大于或等于 START-DATE。 該屬性為可選參數(shù)。

DURATION:日期范圍的持續(xù)時間是一個十進制浮點型數(shù)值類型(單位:秒)。 該屬性值不能為負數(shù)。 當表達立即時間時,將該屬性值設為 0 即可。 該屬性為可選參數(shù)。

PLANNED-DURATION:該屬性為日期范圍的期望持續(xù)時長。 其值為一個十進制浮點數(shù)值類型(單位:秒)。 該屬性值不能為負數(shù)。 在預先無法得知真實持續(xù)時長的情況下,可使用該屬性作為日期范圍的期望預估時長。 該屬性為可選參數(shù)。

X-<client-attribute>:X-前綴是預留給客戶端自定義屬性的命名空間。 客戶端自定義屬性名時,應當使用反向 DNS(reverse-DNS)語法來避免沖突。 自定義屬性值必須是使用雙引號包裹的字符串,或者是十六進制序列,或者是十進制浮點數(shù),比如:X-COM-EXAMPLE-AD-ID="XYZ123"。 該屬性為可選參數(shù)。

SCTE35-CMD, SCTE35-OUT, SCTE35-IN:用于攜帶 SCET-35 數(shù)據(jù)。 該屬性為可選參數(shù)。

END-ON-NEXT:該屬性值為一個可枚舉字符串,其值必須為YES。 該屬性表明達到該范圍末尾,也即等于后續(xù)范圍的起始位置 START-DATE。后續(xù)范圍是指具有相同 CLASS 的,在該標簽 START-DATE 之后的具有最早 START-DATE 值的日期范圍。 該屬性時可選參數(shù)。

媒體播放列表類型標簽:媒體播放列表標簽為 m3u8 文件的全局參數(shù)信息。 這些標簽只能在 m3u8 文件中至多出現(xiàn)一次。 媒體播放列表(Media Playlist)標簽不能出現(xiàn)在主播放列表(Master Playlist)中。 媒體播放列表具體標簽如下所示:

EXT-X-TARGETDURATION:表示每個視頻分段最大的時長(單位秒)。 該標簽為必選標簽。 其格式為:

#EXT-X-TARGETDURATION:<s> 其中:參數(shù)s表示目標時長(單位:秒)。

EXT-X-MEDIA-SEQUENCE:表示播放列表第一個 URL 片段文件的序列號。 每個媒體片段 URL 都擁有一個唯一的整型序列號。 每個媒體片段序列號按出現(xiàn)順序依次加 1。 如果該標簽未指定,則默認序列號從 0 開始。 媒體片段序列號與片段文件名無關(guān)。 其格式為:

#EXT-X-MEDIA-SEQUENCE:<number> 其中:參數(shù)number即為切片序列號。

EXT-X-DISCONTINUITY-SEQUENCE:該標簽使能同步相同流的不同 Rendition 和 具備 EXT-X-DISCONTINUITY 標簽的不同備份流。 其格式為:

#EXT-X-DISCONTINUITY-SEQUENCE:<number> 其中:參數(shù)number為一個十進制整型數(shù)值。 如果播放列表未設置 EXT-X-DISCONTINUITY-SEQUENCE 標簽,那么對于第一個切片的中斷序列號應當為 0。

EXT-X-ENDLIST:表明 m3u8 文件的結(jié)束。 該標簽可出現(xiàn)在 m3u8 文件任意位置,一般是結(jié)尾。 其格式為:

#EXT-X-ENDLIST EXT-X-PLAYLIST-TYPE:表明流媒體類型。全局生效。 該標簽為可選標簽。 其格式為:

#EXT-X-PLAYLIST-TYPE:<type-enum> 其中:type-enum可選值如下:

VOD:即 Video on Demand,表示該視屏流為點播源,因此服務器不能更改該 m3u8 文件;

EVENT:表示該視頻流為直播源,因此服務器不能更改或刪除該文件任意部分內(nèi)容(但是可以在文件末尾添加新內(nèi)容)。 注:VOD 文件通常帶有 EXT-X-ENDLIST 標簽,因為其為點播源,不會改變;而 EVEVT 文件初始化時一般不會有 EXT-X-ENDLIST 標簽,暗示有新的文件會添加到播放列表末尾,因此也需要客戶端定時獲取該 m3u8 文件,以獲取新的媒體片段資源,直到訪問到 EXT-X-ENDLIST 標簽才停止)。

EXT-X-I-FRAMES-ONLY:該標簽表示每個媒體片段都是一個 I-frame。I-frames 幀視屏編碼不依賴于其他幀數(shù),因此可以通過 I-frame 進行快速播放,急速翻轉(zhuǎn)等操作。 該標簽全局生效。 其格式為:

#EXT-X-I-FRAMES-ONLY 如果播放列表設置了 EXT-X-I-FRAMES-ONLY,那么切片的時長(EXTINF 標簽的值)即為當前切片 I-frame 幀開始到下一個 I-frame 幀出現(xiàn)的時長。 媒體資源如果包含 I-frame 切片,那么必須提供媒體初始化塊或者通過 EXT-X-MAP 標簽提供媒體初始化塊的獲取途徑,這樣客戶端就能通過這些 I-frame 切片以任意順序進行加載和解碼。 如果 I-frame 切片設置了 EXT-BYTERANGE,那么就絕對不能提供媒體初始化塊。 使用 EXT-X-I-FRAMES-ONLY 要求的兼容版本號 EXT-X-VERSION 大于等于 4。

主播放列表類型標簽:主播放列表(Master Playlist)定義了備份流,多語言翻譯流和其他全局參數(shù)。 主播放列表標簽絕不能出現(xiàn)在媒體播放列表(Media Playlist)中。 其具體標簽如下:

EXT-X-MEDIA:用于指定相同內(nèi)容的可替換的多語言翻譯播放媒體列表資源。 比如,通過三個 EXT-X-MEIDA 標簽,可以提供包含英文,法語和西班牙語版本的相同內(nèi)容的音頻資源,或者通過兩個 EXT-X-MEDIA 提供兩個不同拍攝角度的視屏資源。 其格式為:

#EXT-X-MEDIA:<attribute-list> 其中,屬性列表取值范圍如下:

TYPE:該屬性值為一個可枚舉字符串。 其值有如下四種:AUDIO,VIDEO,SUBTITLES,CLOSED-CAPTIONS。 通常使用的都是CLOSED-CAPTIONS。 該屬性為必選參數(shù)。

URI:雙引號包裹的媒體資源播放列表路徑。 如果 TYPE 屬性值為 CLOSED-CAPTIONS,那么則不能提供 URI。 該屬性為可選參數(shù)。

GROUP-ID:雙引號包裹的字符串,表示多語言翻譯流所屬組。 該屬性為必選參數(shù)。

LANGUAGE:雙引號包裹的字符串,用于指定流主要使用的語言。 該屬性為可選參數(shù)。

ASSOC-LANGUAGE:雙引號包裹的字符串,其內(nèi)包含一個語言標簽,用于提供多語言流的其中一種語言版本。 該參數(shù)為可選參數(shù)。

NAME:雙引號包裹的字符串,用于為翻譯流提供可讀的描述信息。 如果設置了 LANGUAGE 屬性,那么也應當設置 NAME 屬性。 該屬性為必選參數(shù)。

DEFAULT:該屬性值為一個可枚舉字符串。 可選值為YES和NO。 該屬性未指定時默認值為NO。 如果該屬性設為YES,那么客戶端在缺乏其他可選信息時應當播放該翻譯流。 該屬性為可選參數(shù)。

AUTOSELECT:該屬性值為一個可枚舉字符串。 其有效值為YES或NO。 未指定時,默認設為NO。 如果該屬性設置YES,那么客戶端在用戶沒有顯示進行設置時,可以選擇播放該翻譯流,因為其能配置當前播放環(huán)境,比如系統(tǒng)語言選擇。 如果設置了該屬性,那么當 DEFAULT 設置YES時,該屬性也必須設置為YES。 該屬性為可選參數(shù)。

FORCED:該屬性值為一個可枚舉字符串。 其有效值為YES或NO。 未指定時,默認設為NO。 只有在設置了 TYPE 為 SUBTITLES 時,才可以設置該屬性。 當該屬性設為YES時,則暗示該翻譯流包含重要內(nèi)容。當設置了該屬性,客戶端應當選擇播放匹配當前播放環(huán)境最佳的翻譯流。 當該屬性設為NO時,則表示該翻譯流內(nèi)容意圖用于回復用戶顯示進行請求。 該屬性為可選參數(shù)。

INSTREAM-ID:由雙引號包裹的字符串,用于指示切片的語言(Rendition)版本。 當 TYPE 設為 CLOSED-CAPTIONS 時,必須設置該屬性。 其可選值為:"CC1", "CC2", "CC3", "CC4" 和 "SERVICEn"(n的值為 1~63)。 對于其他 TYPE 值,該屬性絕不能進行設置。

CHARACTERISTICS:由雙引號包裹的由一個或多個由逗號分隔的 UTI 構(gòu)成的字符串。 每個 UTI 表示一種翻譯流的特征。 該屬性可包含私有 UTI。 該屬性為可選參數(shù)。

CHANNELS:由雙引號包裹的有序,由反斜杠/分隔的參數(shù)列表組成的字符串。 所有音頻 EXT-X-MEDIA 標簽應當都設置 CHANNELS 屬性。 如果主播放列表包含兩個相同編碼但是具有不同數(shù)目 channed 的翻譯流,則必須設置 CHANNELS 屬性;否則,CHANNELS 屬性為可選參數(shù)。

EXT-X-STREAM-INF:該屬性指定了一個備份源。該屬性值提供了該備份源的相關(guān)信息。 其格式為:

#EXT-X-STREAM-INF:<attribute-list> <URI> 其中:

URI 指定的媒體播放列表攜帶了該標簽指定的翻譯備份源。 URI 為必選參數(shù)。

EXT-X-STREAM-INF 標簽的參數(shù)屬性列表有如下選項:

BANDWIDTH:該屬性為每秒傳輸?shù)谋忍財?shù),也即帶寬。代表該備份流的巔峰速率。 該屬性為必選參數(shù)。

AVERAGE-BANDWIDTH:該屬性為備份流的平均切片傳輸速率。 該屬性為可選參數(shù)。

CODECS:雙引號包裹的包含由逗號分隔的格式列表組成的字符串。 每個 EXT-X-STREAM-INF 標簽都應當攜帶 CODECS 屬性。

RESOLUTION:該屬性描述備份流視屏源的最佳像素方案。 該屬性為可選參數(shù),但對于包含視屏源的備份流建議增加該屬性設置。

FRAME-RATE:該屬性用一個十進制浮點型數(shù)值作為描述備份流所有視屏最大幀率。 對于備份流中任意視屏源幀數(shù)超過每秒 30 幀的,應當增加該屬性設置。 該屬性為可選參數(shù),但對于包含視屏源的備份流建議增加該屬性設置。

HDCP-LEVEL:該屬性值為一個可枚舉字符串。 其有效值為TYPE-0或NONE。 值為TYPE-0表示該備份流可能會播放失敗,除非輸出被高帶寬數(shù)字內(nèi)容保護(HDCP)。 值為NONE表示流內(nèi)容無需輸出拷貝保護。 使用不同程度的 HDCP 加密備份流應當使用不同的媒體加密密鑰。 該屬性為可選參數(shù)。在缺乏 HDCP 可能存在播放失敗的情況下,應當提供該屬性。

AUDIO:屬性值由雙引號包裹,其值必須與定義在主播放列表某處的設置了 TYPE 屬性值為 AUDIO 的 EXT-X-MEDIA 標簽的 GROUP-ID 屬性值相匹配。 該屬性為可選參數(shù)。

VIDEO:屬性值由雙引號包裹,其值必須與定義在主播放列表某處的設置了 TYPE 屬性值為 VIDEO 的 EXT-X-MEDIA 標簽的 GROUP-ID 屬性值相匹配。 該屬性為可選參數(shù)。

SUBTITLES:屬性值由雙引號包裹,其值必須與定義在主播放列表某處的設置了 TYPE 屬性值為 SUBTITLES 的 EXT-X-MEDIA 標簽的 GROUP-ID 屬性值相匹配。 該屬性為可選參數(shù)。

CLOSED-CAPTIONS:該屬性值可以是一個雙引號包裹的字符串或NONE。 如果其值為一個字符串,則必須與定義在主播放列表某處的設置了 TYPE 屬性值為 CLOSED-CAPTIONS 的 EXT-X-MEDIA 標簽的 GROUP-ID 屬性值相匹配。 如果其值為NONE,則所有的 ext-x-stream-inf 標簽必須同樣將該屬性設置NONE,表示主播放列表備份流均沒有關(guān)閉的標題。對于某個備份流具備關(guān)閉標題,另一個備份流不具備關(guān)閉標題可能會觸發(fā)播放中斷。 該屬性為可選參數(shù)。

EXT-X-I-FRAME-STREAM-INF:該標簽表明媒體播放列表文件包含多種媒體資源的 I-frame 幀。 其格式為:

#EXT-X-I-FRAME-STREAM-INF:<attribute-list> 該標簽的屬性列表包含了 EXT-X-I-FRAME-STREAM-INF 標簽同樣的屬性列表選項,除了 FRAME-RATE,AUDIO,SUBTITLES 和 CLOSED-CAPTIONS。除此之外,其他的屬性還有:

URI:該屬性值由雙引號包裹的字符串,指示了 I-frame 媒體播放列表文件的路徑,該媒體播放列表文件必須包含 EXT-X-I-FRAMES-ONLY 標簽。 EXT-X-SESSION-DATA:該標簽允許主播放列表攜帶任意 session 數(shù)據(jù)。 該標簽為可選參數(shù)。 其格式為:

#EXT-X-SESSION-DATA:<attribute-list> 其中,其參數(shù)屬性列表值如下可選項:

DATA-ID:由雙引號包裹的字符串,代表一個特定的數(shù)據(jù)值。 該屬性應當使用反向 DNS 進行命名,如"com.example.movie.title"。然而,由于沒有中央注冊機構(gòu),所以可能出現(xiàn)沖突情況。 該屬性為必選參數(shù)。

VALUE:該屬性值為一個雙引號包裹的字符串,其包含 DATA-ID 指定的值。 如果設置了 LANGUAGE,則 VALUE 應當包含一個用該語言書寫的可讀字符串。

URI:由雙引號包裹的 URI 字符串。由該 URI 指示的資源必選使用 JSON 格式,否則,客戶端可能會解析失敗。

LANGUAGE:由雙引號包裹的,包含一個語言標簽的字符串。指示了 VALUE 所使用的語言。

EXT-X-SESSION-KEY:該標簽允許主播放列表(Master Playlist)指定媒體播放列表(Meida Playlist)的加密密鑰。這使得客戶端可以預先加載這些密鑰,而無需從媒體播放列表中獲取。 該標簽為可選參數(shù)。 其格式為: #EXT-X-SESSION-KEY:<attribute-list> 其屬性列表與 EXT-X-KEY 相同,除了 METHOD 屬性的值必須不為NONE。 播放列表類型標簽:以下標簽可同時設置于主播放列表(Master Playlist)和媒體播放列表(Media Playlist)中。 但是對于在主播放列表中設置了的標簽,不應當再次設置在主播放列表指向的媒體播放列表中。 同時出現(xiàn)在兩者播放列表的相同標簽必須具備相同的值。這些標簽在播放列表中不能出現(xiàn)多次(只能使用一次)。具體標簽如下所示:

EXT-X-INDEPENDENT-SEGMENTS:該標簽表明對于一個媒體片段中的所有媒體樣本均可獨立進行解碼,而無須依賴其他媒體片段信息。 該標簽對列表內(nèi)所有媒體片段均有效。 其格式為:

#EXT-X-INDEPENDENT-SEGMENTS 如果該標簽出現(xiàn)在主播放列表中,則其對所有媒體播放列表的所有媒體片段都生效。

EXT-X-START:該標簽表示播放列表播放起始位置。 默認情況下,客戶端開啟一個播放會話時,應當使用該標簽指定的位置進行播放。 該標簽為可選標簽。 其格式為:

#EXT-X-START:<attribute-list> 其參數(shù)屬性列表的取值范圍如下:

TIME-OFFSET:該屬性值為一個帶符號十進制浮點數(shù)(單位:秒)。 一個正數(shù)表示以播放列表起始位置開始的時間偏移量。 一個負數(shù)表示播放列表上一個媒體片段最后位置往前的時間偏移量。 該屬性的絕對值應當不超過播放列表的時長。如果超過,則表示到達文件結(jié)尾(數(shù)值為正數(shù)),或者達到文件起始(數(shù)值為負數(shù))。 如果播放列表不包含 EXT-X-ENDLIST 標簽,那么 TIME-OFFSET 屬性值不應當在播放文件末尾三個切片時長之內(nèi)。

PRECISE:該值為一個可枚舉字符串。 有效的取值為YES 或 NO。 如果值為YES,客戶端應當播放包含 TIME-OFFSET 的媒體片段,但不要渲染該塊內(nèi)優(yōu)先于 TIME-OFFSET 的樣本塊。 如果值為NO,客戶端應當嘗試渲染在媒體片段內(nèi)的所有樣本塊。 該屬性為可選參數(shù),未指定則認為NO。

到此,m3u8 相關(guān)的標簽我們已經(jīng)完全介紹完畢。

下面我們再簡單介紹下資源文件的獲取具體操作。

上文提到,m3u8 文件要么是媒體播放列表(Meida Playlist),要么是主播放列表(Master Playlist)。但無論是哪種列表,其有效內(nèi)容均由兩部分結(jié)構(gòu)組成:

以 #EXT 開頭的為標簽信息,作為對媒體資源的進一步描述; 剩余的為資源信息,要么是片段資源(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 文件路徑的,即假設當前 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)絡傳輸量。

其余一些注意事項 有兩種請求 m3u8 播放列表的方法:一是通過 m3u8 的 URI 進行請求,則該文件必須以 .m3u8 或 .m3u 結(jié)尾; 二是通過 HTTP 進行請求,則請求頭Content-Type必須設置為 application/vnd.apple.mpegurl或者audio/mpegurl。

空行和注釋行在解析時都忽略。

媒體播放列表(Media Playlist)的流資源總時長就是各切片資源的時長之和。

每個切片的碼率(bit rate)就是切片的大小除以它對應的時長(EXTINF 指定的時長)。

一個標簽的屬性列表的同一個屬性AttributeName只能出現(xiàn)一次。

EXT-X-TARGETDURATION 指定的時長絕對不能進行更改。通常該值指定的時長為 10 秒。

對于指定了 EXT-X-I-FRAMES-ONLY 且 第一個媒體片段(或者第一個尾隨 EXT-X-DISCONTINUITY 的片段)其資源沒有立即攜帶媒體初始化塊的切片,應當增加使用標簽 EXT-X-MAP 指定媒體初始化塊獲取途徑。

使用 EXT-X-MAP 標簽內(nèi)含標簽 EXT-X-I-FRAMES-ONLY 要求的兼容版本號 EXT-X-VERSION 要大于等于 5;只使用 EXT-X-MAP 要求的兼容版本號要大于等于 6。

由標簽 EXT-X-MAP 聲明的媒體初始化塊可使用 AES-128 方法進行加密,此時,作用于 EXT-X-MAP 標簽的 EXT-X-KEY 標簽必須設置 IV 屬性。

帶有屬性 END-ON-NEXT=YES 的標簽 EXT-X-DATERANGE 必須攜帶 CLASS 屬性,但不能攜帶 DURATION 和 END-DATE 屬性。其余帶有相同 CLASS 的標簽 EXT-X-DATERANGE 不能指定重疊的日期范圍。

日期范圍如果未指明 DURATION,END_DATE,END-ON-NEXT=YES 屬性時,則其時長(duration)未知,即使其設置了 PLANNED-DURATION 屬性。

如果播放列表設置了 EXT-X-DATERANGE 標簽,則必須同時設置 EXT-X-PROGRAM-DATE-TIME 標簽。

如果播放列表設置了擁有相同 ID 屬性值的兩個 EXT-X-DATERANGE 標簽,則對于相同的屬性名,在這兩個 EXT-X-DATERANGE 中對應的值必須一致。

如果 EXT-X-DATERANGE 同時設置了 DURATION 和 END-DATE 屬性,則 END-DATE 屬性值必須等于 START-DATE 屬性值加上 DURATION 屬性值。

EXT-X-MEDIA-SEQUENCE 標簽必須出現(xiàn)在播放列表第一個切片之前。

EXT-X-DISCONTINUITY-DEQUENCE 標簽必須出現(xiàn)在播放列表第一個切片之前。

EXT-X-DISCONTINUITY-DEQUENCE 標簽必須出現(xiàn)在任意 EXT-X-DISCONTINUITY 標簽之前。

m3u8 文件如果沒有設置 EXT-X-PLAYLIST-TYPE 標簽,那么播放列表可以隨時進行更改。比如,可以更新或刪除播放列表中的媒體片段。

每個 EXT-X-I-FRAME-STREAM-INF 標簽必須包含一個 BANDWIDTH 和 URI 屬性。

每個 EXT-X-SESSION-DATA 標簽都必須包含一個 VALUE 或 URI 屬性,但不能同時包含兩者。

一個播放列表可以包含多個攜帶相同 DATA-ID 屬性的 EXT-X-SESSION-DATA 標簽。但是不能包含多個攜帶相同 DATA-ID 和相同 LANGUAGE 屬性的 EXT-X-SESSION-DATA 標簽。

如果設置了 EXT-X-SESSION-KEY,那么其 METHOD,KEYFORMAT 和 KEYFORMATVERSIONS 屬性值必須與任意相同 URI 的 EXT-X-KEY 標簽值相同。

如果多份備用流或者多語言流使用相同的加密密鑰和格式,則應當設置 EXT-X-SESSION-KEY 標簽。

主播放列表必須不能設置多個具有相同 METHOD,URI,IV,KEYFORMAT 和 KEYFORMATVERSIONS 屬性值得 EXT-X-SESSION-KEY 標簽。

以上是“m3u8文件格式的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學習更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI