m3u8 文件格式詳解

簡(jiǎn)介

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

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

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

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

因此,客戶(hù)端獲取 HLS 流文件,主要就是對(duì) m3u8 文件進(jìn)行解析操作。

那么,下面就簡(jiǎn)單介紹下 m3u8 文件。

M3U8 文件簡(jiǎn)介

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

當(dāng) m3u8 文件作為媒體播放列表(Meida Playlist)時(shí),其內(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

對(duì)于點(diǎn)播來(lái)說(shuō),客戶(hù)端只需按順序下載上述片段資源,依次進(jìn)行播放即可。而對(duì)于直播來(lái)說(shuō),客戶(hù)端需要 定時(shí)重新請(qǐng)求 該 m3u8 文件,看下是否有新的片段數(shù)據(jù)需要進(jìn)行下載并播放。

當(dāng) m3u8 作為主播放列表(Master Playlist)時(shí),其內(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

該備用流資源指定了多種不同碼率,不同格式的媒體播放列表,并且,該備用流資源也可同時(shí)提供不同版本的資源內(nèi)容,比如不同語(yǔ)言的音頻文件,不同角度拍攝的視屏文件等等。客戶(hù)可以根據(jù)不同的網(wǎng)絡(luò)狀態(tài)選取合適碼流的資源,并且最好根據(jù)用戶(hù)喜好選擇合適的資源內(nèi)容。

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

以上,就是 m3u8 文件的大概內(nèi)容。下面,我們就對(duì) m3u8 內(nèi)容格式進(jìn)行講解。

m3u8 文件格式簡(jiǎn)解

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

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

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

  • m3u8 文件中以 # 開(kāi)頭的字符串要么是注釋?zhuān)淳褪菢?biāo)簽。標(biāo)簽以 #EXT 開(kāi)頭,大小寫(xiě)敏感。

  1. 屬性列表(Attribute Lists):某些特定的標(biāo)簽的值為屬性列表。標(biāo)簽后面的屬性列表以 逗號(hào) 作為分隔符,分離出多組不帶空格的 屬性/值 對(duì)。
    屬性/值 對(duì)的語(yǔ)法格式如下:
AttributeName=AttributeValue

其中:

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

  • AttributeValue的只能取以下類(lèi)型:

    • 十進(jìn)制整型(decimal-interger):由 [0..9] 之間組成的十進(jìn)制不帶引號(hào)的字符串,范圍為 0 ~ 2^{64}(18446744073709551615),字符長(zhǎng)度為 1 ~ 20 之間。
    • 十六進(jìn)制序列:由 [0..9] 和 [A..F] 且前綴為 0x 或 0X 組合成的不帶引號(hào)的字符串。其序列的最大長(zhǎng)度取決于他的屬性名AttributeNames
    • 帶符號(hào)十進(jìn)制浮點(diǎn)型(signed-decimal-floating-point):由 [0..9],-.組合成的不帶引號(hào)的字符串。
    • 字符串(quoted-string):由雙引號(hào)包裹表示的字符串。其中,0xA,0xD 和 雙引號(hào)"不能出現(xiàn)在該字符串中。該字符串區(qū)分大小寫(xiě)。
    • 可枚舉字符串(enumerated-string):由AttributeName顯示定義的一系列不帶引號(hào)的字符串。該字符串不能包含雙引號(hào)",逗號(hào),和空白字符。
    • decimal-resolution:由字符x進(jìn)行隔離的兩個(gè)十進(jìn)制整型數(shù)。第一個(gè)整型表示水平寬度大小,第二個(gè)整型數(shù)表示垂直方向高度大小(單位:像素)。
  1. 標(biāo)簽:標(biāo)簽用于指定 m3u8 文件的全局參數(shù)或在其后面的切片文件/媒體播放列表的一些信息。

標(biāo)簽的類(lèi)型可分為五種類(lèi)型:基礎(chǔ)標(biāo)簽(Basic Tags)媒體片段類(lèi)型標(biāo)簽(Media Segment Tags)媒體播放列表類(lèi)型標(biāo)簽主播放列表類(lèi)型標(biāo)簽播放列表類(lèi)型標(biāo)簽。其具體內(nèi)容如下所示:

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

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

    • EXTINF:表示其后 URL 指定的媒體片段時(shí)長(zhǎng)(單位為秒)。每個(gè) URL 媒體片段之前必須指定該標(biāo)簽。該標(biāo)簽的使用格式為:

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

      其中:

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

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

      其中:

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

      #EXT-X-DISCONTINUITY
      

      當(dāng)以下任一情況變化時(shí),必須使用該標(biāo)簽:

      • 文件格式(file format)
      • 數(shù)字(number),類(lèi)型(type),媒體標(biāo)識(shí)符(identifiers of tracks)
      • 時(shí)間戳序列(timestamp sequence)

      當(dāng)以下任一情況變化時(shí),應(yīng)當(dāng)使用該標(biāo)簽:

      • 編碼參數(shù)(encoding parameters)
      • 編碼序列(encoding sequence)

      注:EXT-X-DISCONTINUITY 的一個(gè)經(jīng)典使用場(chǎng)景就是在視屏流中插入廣告,由于視屏流與廣告視屏流不是同一份資源,因此在這兩種流切換時(shí)使用 EXT-X-DISCONTINUITY 進(jìn)行指明,客戶(hù)端看到該標(biāo)簽后,就會(huì)處理這種切換中斷問(wèn)題,讓體驗(yàn)更佳。
      更多詳細(xì)內(nèi)容,請(qǐng)查看:Incorporating Ads into a Playlist

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

      #EXT-X-KEY:<attribute-list>
      

      屬性列表可以包含如下幾個(gè)鍵:

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

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

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

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

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

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

      #EXT-X-MAP:<attribute-list>
      

      其屬性列表取值范圍如下:

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

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

    • EXT-X-PROGRAM-DATE-TIME:該標(biāo)簽使用一個(gè)絕對(duì)日期/時(shí)間表明第一個(gè)樣本片段的取樣時(shí)間。
      其格式為:

      #EXT-X-PROGRAM-DATE-TIME:<date-time-msec>
      

      其中,date-time-msec是一個(gè) ISO/IEC 8601:2004 規(guī)定的日期格式,形如:YYYY-MM-DDThh:mm:ss.SSSZ。

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

      #EXT-X-DATERANGE:<attribute-list>
      

      其屬性列表取值如下:

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

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

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

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

      • DURATION:日期范圍的持續(xù)時(shí)間是一個(gè)十進(jìn)制浮點(diǎn)型數(shù)值類(lèi)型(單位:秒)。
        該屬性值不能為負(fù)數(shù)。
        當(dāng)表達(dá)立即時(shí)間時(shí),將該屬性值設(shè)為 0 即可。
        該屬性為可選參數(shù)。

      • PLANNED-DURATION:該屬性為日期范圍的期望持續(xù)時(shí)長(zhǎng)。
        其值為一個(gè)十進(jìn)制浮點(diǎn)數(shù)值類(lèi)型(單位:秒)。
        該屬性值不能為負(fù)數(shù)。
        在預(yù)先無(wú)法得知真實(shí)持續(xù)時(shí)長(zhǎng)的情況下,可使用該屬性作為日期范圍的期望預(yù)估時(shí)長(zhǎng)。
        該屬性為可選參數(shù)。

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

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

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

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

    • EXT-X-TARGETDURATION:表示每個(gè)視頻分段最大的時(shí)長(zhǎng)(單位秒)。
      該標(biāo)簽為必選標(biāo)簽。
      其格式為:

      #EXT-X-TARGETDURATION:<s>
      

      其中:參數(shù)s表示目標(biāo)時(shí)長(zhǎng)(單位:秒)。

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

      #EXT-X-MEDIA-SEQUENCE:<number>
      

      其中:參數(shù)number即為切片序列號(hào)。

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

      #EXT-X-DISCONTINUITY-SEQUENCE:<number>
      

      其中:參數(shù)number為一個(gè)十進(jìn)制整型數(shù)值。
      如果播放列表未設(shè)置 EXT-X-DISCONTINUITY-SEQUENCE 標(biāo)簽,那么對(duì)于第一個(gè)切片的中斷序列號(hào)應(yīng)當(dāng)為 0。

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

      #EXT-X-ENDLIST
      
    • EXT-X-PLAYLIST-TYPE:表明流媒體類(lèi)型。全局生效。
      該標(biāo)簽為可選標(biāo)簽。
      其格式為:

      #EXT-X-PLAYLIST-TYPE:<type-enum>
      

      其中:type-enum可選值如下:

      • VOD:即 Video on Demand,表示該視屏流為點(diǎn)播源,因此服務(wù)器不能更改該 m3u8 文件;

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

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

      #EXT-X-I-FRAMES-ONLY
      

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

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

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

      #EXT-X-MEDIA:<attribute-list>
      

      其中,屬性列表取值范圍如下:

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

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

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

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

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

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

      • DEFAULT:該屬性值為一個(gè)可枚舉字符串。
        可選值為YESNO
        該屬性未指定時(shí)默認(rèn)值為NO
        如果該屬性設(shè)為YES,那么客戶(hù)端在缺乏其他可選信息時(shí)應(yīng)當(dāng)播放該翻譯流。
        該屬性為可選參數(shù)。

      • AUTOSELECT:該屬性值為一個(gè)可枚舉字符串。
        其有效值為YESNO
        未指定時(shí),默認(rèn)設(shè)為NO
        如果該屬性設(shè)置YES,那么客戶(hù)端在用戶(hù)沒(méi)有顯示進(jìn)行設(shè)置時(shí),可以選擇播放該翻譯流,因?yàn)槠淠芘渲卯?dāng)前播放環(huán)境,比如系統(tǒng)語(yǔ)言選擇。
        如果設(shè)置了該屬性,那么當(dāng) DEFAULT 設(shè)置YES時(shí),該屬性也必須設(shè)置為YES
        該屬性為可選參數(shù)。

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

      • INSTREAM-ID:由雙引號(hào)包裹的字符串,用于指示切片的語(yǔ)言(Rendition)版本。
        當(dāng) TYPE 設(shè)為 CLOSED-CAPTIONS 時(shí),必須設(shè)置該屬性。
        其可選值為:"CC1", "CC2", "CC3", "CC4""SERVICEn"n的值為 1~63)。
        對(duì)于其他 TYPE 值,該屬性絕不能進(jìn)行設(shè)置。

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

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

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

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

      其中:

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

      • EXT-X-STREAM-INF 標(biāo)簽的參數(shù)屬性列表有如下選項(xiàng):

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

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

        • CODECS:雙引號(hào)包裹的包含由逗號(hào)分隔的格式列表組成的字符串。
          每個(gè) EXT-X-STREAM-INF 標(biāo)簽都應(yīng)當(dāng)攜帶 CODECS 屬性。

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

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

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

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

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

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

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

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

      #EXT-X-I-FRAME-STREAM-INF:<attribute-list>
      

      該標(biāo)簽的屬性列表包含了 EXT-X-I-FRAME-STREAM-INF 標(biāo)簽同樣的屬性列表選項(xiàng),除了 FRAME-RATEAUDIOSUBTITLESCLOSED-CAPTIONS。除此之外,其他的屬性還有:

      • URI:該屬性值由雙引號(hào)包裹的字符串,指示了 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:<attribute-list>
      

      其中,其參數(shù)屬性列表值如下可選項(xiàng):

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

      • VALUE:該屬性值為一個(gè)雙引號(hào)包裹的字符串,其包含 DATA-ID 指定的值。
        如果設(shè)置了 LANGUAGE,則 VALUE 應(yīng)當(dāng)包含一個(gè)用該語(yǔ)言書(shū)寫(xiě)的可讀字符串。

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

      • LANGUAGE:由雙引號(hào)包裹的,包含一個(gè)語(yǔ)言標(biāo)簽的字符串。指示了 VALUE 所使用的語(yǔ)言。

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

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

      #EXT-X-INDEPENDENT-SEGMENTS
      

      如果該標(biāo)簽出現(xiàn)在主播放列表中,則其對(duì)所有媒體播放列表的所有媒體片段都生效。

    • EXT-X-START:該標(biāo)簽表示播放列表播放起始位置。
      默認(rèn)情況下,客戶(hù)端開(kāi)啟一個(gè)播放會(huì)話時(shí),應(yīng)當(dāng)使用該標(biāo)簽指定的位置進(jìn)行播放。
      該標(biāo)簽為可選標(biāo)簽。
      其格式為:

      #EXT-X-START:<attribute-list>
      

      其參數(shù)屬性列表的取值范圍如下:

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

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

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

下面我們?cè)俸?jiǎn)單介紹下資源文件的獲取具體操作。

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

  • #EXT 開(kāi)頭的為標(biāo)簽信息,作為對(duì)媒體資源的進(jìn)一步描述;
  • 剩余的為資源信息,要么是片段資源(Media Playlist)路徑,要么是 m3u8 資源(Master Playlist)路徑;

我們先簡(jiǎn)單介紹下 m3u8 文件媒體片段的表示方法:

  • m3u8 文件中,媒體片段可以采用全路徑表示。如下所示:
#EXTINF:10.0,
http://example.com/movie1/fileSequenceA.ts

這樣,獲取資源片段的路徑就是 m3u8 文件內(nèi)指定的路徑,即:http://example.com/movie1/fileSequenceA.ts

  • m3u8 文件中,媒體片段還可以使用相對(duì)路徑表示。如下所示:
#EXTINF:10.0,
fileSequenceA.ts

這表示片段文件的路徑是相對(duì)于 m3u8 文件路徑的,即假設(shè)當(dāng)前 m3u8 的路徑為:https://127.0.0.1/hls/m3u8,那么,片段文件 fileSequenceA.ts 的路徑即為:https://127.0.0.1/hls/fileSequenceA.ts

盡管可以在 m3u8 文件中使用絕對(duì)路徑指定媒體片段資源路徑,但是更好的選擇是使用相對(duì)路徑。相對(duì)路徑相較于絕對(duì)路徑更輕便,同時(shí)是相對(duì)于 m3u8 文件的 URL。相比之下,絕對(duì)路徑增加了 m3u8 文件內(nèi)容(更多字符),增大了文件內(nèi)容,同時(shí)也增大了網(wǎng)絡(luò)傳輸量。

其余一些注意事項(xiàng)

  • 有兩種請(qǐng)求 m3u8 播放列表的方法:一是通過(guò) m3u8 的 URI 進(jìn)行請(qǐng)求,則該文件必須以 .m3u8 或 .m3u 結(jié)尾;
    二是通過(guò) HTTP 進(jìn)行請(qǐng)求,則請(qǐng)求頭Content-Type必須設(shè)置為 application/vnd.apple.mpegurl或者audio/mpegurl

  • 空行和注釋行在解析時(shí)都忽略。

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

  • 每個(gè)切片的碼率(bit rate)就是切片的大小除以它對(duì)應(yīng)的時(shí)長(zhǎng)(EXTINF 指定的時(shí)長(zhǎng))。

  • 一個(gè)標(biāo)簽的屬性列表的同一個(gè)屬性AttributeName只能出現(xiàn)一次。

  • EXT-X-TARGETDURATION 指定的時(shí)長(zhǎng)絕對(duì)不能進(jìn)行更改。通常該值指定的時(shí)長(zhǎng)為 10 秒。

  • 對(duì)于指定了 EXT-X-I-FRAMES-ONLY 且 第一個(gè)媒體片段(或者第一個(gè)尾隨 EXT-X-DISCONTINUITY 的片段)其資源沒(méi)有立即攜帶媒體初始化塊的切片,應(yīng)當(dāng)增加使用標(biāo)簽 EXT-X-MAP 指定媒體初始化塊獲取途徑。

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

  • 由標(biāo)簽 EXT-X-MAP 聲明的媒體初始化塊可使用 AES-128 方法進(jìn)行加密,此時(shí),作用于 EXT-X-MAP 標(biāo)簽的 EXT-X-KEY 標(biāo)簽必須設(shè)置 IV 屬性。

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

  • 日期范圍如果未指明 DURATIONEND_DATE,END-ON-NEXT=YES 屬性時(shí),則其時(shí)長(zhǎng)(duration)未知,即使其設(shè)置了 PLANNED-DURATION 屬性。

  • 如果播放列表設(shè)置了 EXT-X-DATERANGE 標(biāo)簽,則必須同時(shí)設(shè)置 EXT-X-PROGRAM-DATE-TIME 標(biāo)簽。

  • 如果播放列表設(shè)置了擁有相同 ID 屬性值的兩個(gè) EXT-X-DATERANGE 標(biāo)簽,則對(duì)于相同的屬性名,在這兩個(gè) EXT-X-DATERANGE 中對(duì)應(yīng)的值必須一致。

  • 如果 EXT-X-DATERANGE 同時(shí)設(shè)置了 DURATIONEND-DATE 屬性,則 END-DATE 屬性值必須等于 START-DATE 屬性值加上 DURATION 屬性值。

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

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

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

  • m3u8 文件如果沒(méi)有設(shè)置 EXT-X-PLAYLIST-TYPE 標(biāo)簽,那么播放列表可以隨時(shí)進(jìn)行更改。比如,可以更新或刪除播放列表中的媒體片段。

  • 每個(gè) EXT-X-I-FRAME-STREAM-INF 標(biāo)簽必須包含一個(gè) BANDWIDTHURI 屬性。

  • 每個(gè) EXT-X-SESSION-DATA 標(biāo)簽都必須包含一個(gè) VALUEURI 屬性,但不能同時(shí)包含兩者。

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

  • 如果設(shè)置了 EXT-X-SESSION-KEY,那么其 METHODKEYFORMATKEYFORMATVERSIONS 屬性值必須與任意相同 URIEXT-X-KEY 標(biāo)簽值相同。

  • 如果多份備用流或者多語(yǔ)言流使用相同的加密密鑰和格式,則應(yīng)當(dāng)設(shè)置 EXT-X-SESSION-KEY 標(biāo)簽。

  • 主播放列表必須不能設(shè)置多個(gè)具有相同 METHODURIIVKEYFORMATKEYFORMATVERSIONS 屬性值得 EXT-X-SESSION-KEY 標(biāo)簽。

附錄

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容