m3u8簡介
M3U8 是Unicode 版本的 M3U,用UTF-8 編碼。 "M3U" 和"M3U8" 檔案都是蘋果公司使用的HTTP Live Streaming(HLS) 協定格式的基礎,這種協定格式可以在iPhone 和Macbook 等裝置播放。
上述文字定義來自於維基百科。可以看到,m3u8 檔案其實是HTTP Live Streaming(縮寫為HLS) 協定的部分內容,而HLS 是一個由蘋果提出的基於HTTP 的串流網路傳輸協定。
HLS 的工作原理是把整個流分成一個個小的基於HTTP 的檔案來下載,每次只下載一些。當媒體串流正在播放時,用戶端可以選擇從許多不同的備用來源以不同的速率下載相同的資源,讓串流媒體會話適應不同的資料速率。在開始一個串流媒體會話時,用戶端會下載一個包含元資料的extended M3U (m3u8) playlist文件,用於尋找可用的媒體串流。
HLS 只要求基本的HTTP 封包,與即時傳輸協定(RTP)不同,HLS 可以穿過任何允許HTTP 資料通過的防火牆或代理伺服器。它也很容易使用內容分發網路來傳輸媒體串流。
簡而言之,HLS 是新一代串流媒體傳輸協議,其基本實現原理為將一個大的媒體檔案進行分片,將該分片檔案資源路徑記錄於m3u8 檔案(即playlist)內,其中附帶一些額外描述(例如該資源的多頻寬資訊···)用於提供給客戶端。客戶端依據該m3u8 檔案即可取得對應的媒體資源,進行播放。
因此,客戶端取得HLS 流文件,主要是對m3u8 文件進行解析操作。
那麼,以下就簡單介紹下m3u8 檔。
M3U8 文件簡介
m3u8 檔案實質是一個播放清單(playlist),可能是媒體播放清單(Media Playlist),或是一個主清單(Master Playlist)。但無論是哪種播放列表,其內部文字使用的都是utf-8 編碼。
當m3u8 檔案作為媒體播放清單(Meida Playlist)時,其內部資訊記錄的是一系列媒體片段資源,順序播放該片段資源,即可完整展示多媒體資源。其格式如下所示:
#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 文件,看下是否有新的片段資料需要進行下載並播放。
當m3u8 作為主播放清單(Master Playlist)時,其內部提供的是同一份媒體資源的多份串流清單資源(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
這個備用流資源指定了多種不同碼率,不同格式的媒體播放列表,並且,該備用流資源也可同時提供不同版本的資源內容,比如不同語言的音頻文件,不同角度拍攝的視屏文件等等。客戶可以根據不同的網路狀態選取合適碼流的資源,並且最好根據使用者喜好選擇合適的資源內容。
以上,就是m3u8 檔案的大概內容。下面,我們就對m3u8 內容格式進行講解。
m3u8 檔案格式
m3u8 的文件格式主要包含三方面內容:
文件播放清單格式定義:播放清單(Playlist,也是m3u8 檔案) 內容需嚴格滿足規範定義所要求。下面羅列一些主要遵循的條件:
m3u8 檔案必須以utf-8 編碼,不能使用Byte Order Mark(BOM)位元組序, 不能包含utf-8 控製字元(U+0000 ~ U_001F 和U+007F ~ u+009F)。
m3u8 檔案的每一行要嘛是URI,要嘛是空行,要嘛就是以# 開頭的字串。不能出現空白字符,除了顯示聲明的元素。
m3u8 檔案中以# 開頭的字串要不是註釋,就是標籤。標籤以#EXT 開頭,大小寫敏感。
屬性清單(Attribute Lists):某些特定的標籤的值為屬性清單。標籤後面的屬性清單以逗號作為分隔符,分離出多組不帶空格的屬性/值對。
屬性/值對的語法格式如下:
AttributeName=AttributeValue
其中:
屬性AttributeName是由[A..Z],[0..9] 和- 組成的不含引號的字串。因此,屬性AttributeName只能使用大寫字母,不能使用小寫字母,且AttributeName和=中間不能有空格,同理,=和AttributeValue之間也不能有空格。
值AttributeValue的只能取以下類型:
十進位整型(decimal-interger):由[0..9] 之間組成的十進位不帶引號的字串,範圍為~ (18446744073709551615),字元長度為1 ~ 20 之間。
十六進位序列:由[0..9] 和[A..F] 且前綴為0x 或0X 組合成的不含引號的字串。其序列的最大長度取決於他的屬性名稱AttributeNames。
帶符號十進制浮點型(signed-decimal-floating-point):由[0..9],-和.組合成的不帶引號的字串。
字串(quoted-string):由雙引號包裹表示的字串。其中,0xA,0xD 和雙引號"不能出現在該字串中。此字串區分大小寫。
可枚舉字串(enumerated-string):由AttributeName顯示定義的一系列不帶引號的字串。此字串不能包含雙引號",逗號,和空白字元。
decimal-resolution:由字元x進行隔離的兩個十進制整數數。第一個整數表示水平寬度大小,第二個整數數表示垂直方向高度大小(單位:像素)。
標籤:標籤用於指定m3u8 檔案的全域參數或在其後面的切片檔案/媒體播放清單的一些資訊。
標籤的類型可分為五種類型:基礎標籤(Basic Tags),媒體片段類型標籤(Media Segment Tags),媒體播放清單類型標籤,主播放清單類型標籤和播放清單類型標籤。其具體內容如下圖所示:
基礎標籤(Basic Tags):可同時適用於媒體播放清單(Media Playlist)和主播放清單(Master Playlist)。具體標籤如下:
EXTM3U:表示該檔案是一個m3u8 檔案。每個M3U 檔案必須將該標籤放置在第一行。
EXT-X-VERSION:表示HLS 的協定版本號,該標籤與串流媒體的兼容性有關。此標籤為全域作用域,使能整個m3u8 檔案;每個m3u8 檔案內最多只能出現一個該標籤定義。如果m3u8 檔案不包含該標籤,則預設為協定的第一個版本。
媒體片段類型標籤(Media Segment Tags):每個切片URI 前面都有一系列媒體片段標籤對其進行描述。有些片段標籤只對其後切片資源有效;有些片段標籤對其後所有切片都有效,直到後續遇到另一個該標籤描述。媒體片段類型標籤不能出現在主播放清單(Master Playlist)中。具體標籤如下:
EXTINF:表示其後URL 指定的媒體片段時長(單位為秒)。每個URL 媒體片段之前必須指定該標籤。該標籤的使用格式為:
#EXTINF:,[]<br>
其中:</p>
<p>duration:可以為十進位的整數或浮點型,其值必須小於或等於EXT-X-TARGETDURATION 指定的值。<br>
注意:建議始終使用浮點型指定時長,這可以讓客戶端在定位流時,減少四捨五入錯誤。但是如果相容版本號EXT-X-VERSION 小於3,那麼就必須使用整數。<br>
EXT-X-BYTERANGE:此標籤表示接下來的切片資源是其後URI 指定的媒體片段資源的局部範圍(即截取URI 媒體資源部分內容為下一個切片)。該標籤只對其後一個URI 起作用。其格式為:</p>
<p>#EXT-X-BYTERANGE:<n>[@<o>]<br>
其中:</p>
<p>n是一個十進制整型,表示截取片段大小(單位:位元組)。<br>
可選參數o也是一個十進制整型,指示截取起始位置(以位元組表示,在URI 指定的資源開頭移動該位元組位置後進行截取)。<br>
如果o未指定,則截取起始位置從上一個該標籤截取完成的下一個位元組(即上一個n+o+1)開始截取。<br>
如果沒有指定該標籤,則表示的切分範圍為整個URI 資源片段。<br>
註:使用EXT-X-BYTERANGE 標籤要求相容版本號EXT-X-VERSION 大於等於4。<br>
EXT-X-DISCONTINUITY:此標籤表示其前一個切片與下一個切片之間有中斷。其格式為:</p>
<p>#EXT-X-DISCONTINUITY<br>
當下列任一情況發生變化時,必須使用該標籤:</p>
<p>文件格式(file format)<br>
數字(number),類型(type),媒體識別碼(identifiers of tracks)<br>
時間戳序列(timestamp sequence)<br>
當下列任一情況變更時,應使用該標籤:</p>
<p>編碼參數(encoding parameters)<br>
編碼序列(encoding sequence)<br>
附註:EXT-X-DISCONTINUITY 的一個經典使用場景就是在視螢幕流中插入廣告,由於視螢幕串流與廣告視螢幕串流不是同一份資源,因此在這兩種串流切換時使用EXT-X-DISCONTINUITY 進行指明,客戶端看到該標籤後,就會處理這種切換中斷問題,讓體驗更佳。<br>
更多詳細內容,請查看:Incorporating Ads into a Playlist</p>
<p>EXT-X-KEY:媒體片段可以進行加密,而該標籤可以指定解密方法。<br>
該標籤對所有媒體片段和由標籤EXT-X-MAP 聲明的圍繞其間的所有媒體初始化區塊(Meida Initialization Section) 都起作用,直到遇到下一個EXT-X-KEY(若m3u8 檔案只有一個EXT-X-KEY 標籤,則其作用於所有媒體片段)。<br>
多個EXT-X-KEY 標籤如果最終產生的是相同的秘鑰,則他們都可作用於同一個媒體片段。<br>
該標籤使用格式為:</p>
<p>#EXT-X-KEY:<attribute-list><br>
屬性列表可以包含以下幾個鍵:</p>
<p>METHOD:該值是一個可列舉的字串,指定了加密方法。<br>
此鍵是必須參數。其值可為NONE,AES-128,SAMPLE-AES當中的一個。<br>
其中:<br>
NONE:表示切片未進行加密(此時其他屬性不能出現);<br>
AES-128:表示表示使用AES-128 進行加密。<br>
SAMPLE-AES:意味著媒體片段當中包含樣本媒體,例如音訊或視頻,它們使用AES-128 進行加密。這種情況下IV 屬性可以出現也可以不出現。</p>
<p>URI:指定金鑰路徑。<br>
該密鑰是一個16 位元組的資料。<br>
此鍵是必須參數,除非METHOD 為NONE。</p>
<p>IV:該值是一個128 位元的十六進位數值。<br>
AES-128 要求使用相同的16位元組IV 值進行加密和解密。使用不同的IV 值可以增強密碼強度。<br>
如果屬性清單出現IV,則使用該值;如果未出現,則預設使用媒體片段序號(即EXT-X-MEDIA-SEQUENCE)作為其IV 值,使用大端字節序,往左填充0 直到序號滿足16 位元組(128 位元)。</p>
<p>KEYFORMAT:由雙引號包裹的字串,標識密鑰在密鑰檔案中的儲存方式(密鑰檔案中的AES-128 密鑰是以二進位方式儲存的16個位元組的密鑰)。<br>
此屬性為可選參數,其預設值為"identity"。<br>
使用此屬性要求相容版本號EXT-X-VERSION 大於等於5。</p>
<p>KEYFORMATVERSIONS:由一個或多個被/分割的正整數數值構成的帶引號的字串(例如:"1","1/2","1/2/5")。<br>
如果有一個或多特定的KEYFORMT 版本被定義了,則可使用該屬性指示特定版本進行編譯。<br>
此屬性為可選參數,其預設值為"1"。<br>
使用此屬性要求相容版本號EXT-X-VERSION 大於等於5。</p>
<p>EXT-X-MAP:此標籤指明了取得媒體初始化區塊(Meida Initialization Section)的方法。<br>
該標籤對其後所有媒體片段生效,直至遇到另一個EXT-X-MAP 標籤。<br>
其格式為:</p>
<p>#EXT-X-MAP:<attribute-list><br>
其屬性清單取值範圍如下:</p>
<p>URI:由引號包裹的字串,指定了包含媒體初始化區塊的資源的路徑。此屬性為必選參數。</p>
<p>BYTERANGE:由引號包裹的字串,指定了媒體初始化區塊在URI 指定的資源的位置(片段)。<br>
此屬性指定的範圍應只包含媒體初始化區塊。<br>
此屬性為可選參數,如果未指定,則表示URI 指定的資源就是全部的媒體初始化區塊。</p>
<p>EXT-X-PROGRAM-DATE-TIME:此標籤使用一個絕對日期/時間來表示第一個樣本片段的取樣時間。<br>
其格式為:</p>
<p>#EXT-X-PROGRAM-DATE-TIME:<date-time-msec><br>
其中,date-time-msec是一個 <a href="https://uzbox.com/zh/tag/iso" class="st_tag internal_tag" rel="tag" title="iso">ISO</a>/IEC 8601:2004 規定的日期格式,形如:YYYY-MM-DDThh:mm:ss.SSSZ。</p>
<p>EXT-X-DATERANGE:此標籤定義了一系列由屬性/值對組成的日期範圍。<br>
其格式為:</p>
<p>#EXT-X-DATERANGE:<attribute-list><br>
其屬性清單取值如下:</p>
<p>ID:雙引號包裹的唯一指明日期範圍的識別。<br>
此屬性為必選參數。</p>
<p>CLASS:雙引號包裹的由客戶定義的一系列屬性與與之對應的語義值。<br>
所有擁有相同CLASS 屬性的日期範圍必須遵守對應的語意。<br>
此屬性為可選參數。</p>
<p>START-DATE:雙引號包裹的日期範圍起始值。<br>
此屬性為必選參數。</p>
<p>END-DATE:雙引號包裹的日期範圍結束值。<br>
此屬性值必須大於或等於START-DATE。<br>
此屬性為可選參數。</p>
<p>DURATION:日期範圍的持續時間是一個十進制浮點型數值類型(單位:秒)。<br>
該屬性值不能為負數。<br>
當表達立即時間時,將該屬性值設為0 即可。<br>
此屬性為可選參數。</p>
<p>PLANNED-DURATION:此屬性為日期範圍的期望持續時長。<br>
其值為一個十進制浮點數值類型(單位:秒)。<br>
該屬性值不能為負數。<br>
在預先無法得知真實持續時長的情況下,可使用該屬性作為日期範圍的期望預估時長。<br>
此屬性為可選參數。</p>
<p>X-<client-attribute>:X-前綴是預留給客戶端自訂屬性的命名空間。<br>
客戶端自訂屬性名時,應使用反向 <a href="https://uzbox.com/zh/tag/dns" class="st_tag internal_tag" rel="tag" title="DNS">DNS</a>(reverse-DNS)語法來避免衝突。<br>
自訂屬性值必須是使用雙引號包裹的字串,或是十六進位序列,或是十進位浮點數,例如:X-COM-EXAMPLE-AD-ID="XYZ123"。<br>
此屬性為可選參數。</p>
<p>SCTE35-CMD, SCTE35-OUT, SCTE35-IN:用於攜帶SCET-35 資料。<br>
此屬性為可選參數。</p>
<p>END-ON-NEXT:此屬性值為一個可枚舉字串,其值必須為YES。<br>
此屬性顯示達到該範圍末尾,也即等於後續範圍的起始位置START-DATE。後續範圍是指具有相同CLASS 的,在該標籤START-DATE 之後的具有最早START-DATE 值的日期範圍。<br>
此屬性時可選參數。</p>
<p>媒體播放清單類型標籤:媒體播放清單標籤為m3u8 檔案的全域參數資訊。<br>
這些標籤只能在m3u8 檔案中至多出現一次。<br>
媒體播放清單(Media Playlist)標籤不能出現在主播放清單(Master Playlist)中。<br>
媒體播放清單具體標籤如下所示:</p>
<p>EXT-X-TARGETDURATION:表示每個影片分段最大的時長(單位秒)。<br>
該標籤為必選標籤。<br>
其格式為:</p>
<p>#EXT-X-TARGETDURATION:<s><br>
其中:參數s表示目標時長(單位:秒)。</p>
<p>EXT-X-MEDIA-SEQUENCE:表示播放清單第一個URL 片段檔案的序號。<br>
每個媒體片段URL 都擁有一個獨特的整數序號。<br>
每個媒體片段序號依出現順序依序加1。<br>
如果該標籤未指定,則預設序號從0 開始。<br>
媒體片段序號與片段檔名無關。<br>
其格式為:</p>
<p>#EXT-X-MEDIA-SEQUENCE:<number><br>
其中:參數number即為切片序號。</p>
<p>EXT-X-DISCONTINUITY-SEQUENCE:此標籤可讓同步相同流的不同Rendition 和具備EXT-X-DISCONTINUITY 標籤的不同備援流。<br>
其格式為:</p>
<p>#EXT-X-DISCONTINUITY-SEQUENCE:<number><br>
其中:參數number為一個十進制整數數值。<br>
如果播放清單未設定EXT-X-DISCONTINUITY-SEQUENCE 標籤,那麼對於第一個切片的中斷序號應為0。</p>
<p>EXT-X-ENDLIST:表示m3u8 檔案的結束。<br>
此標籤可出現在m3u8 檔案任意位置,一般是結尾。<br>
其格式為:</p>
<p>#EXT-X-ENDLIST<br>
EXT-X-PLAYLIST-TYPE:表明串流媒體類型。全域生效。<br>
此標籤為可選標籤。<br>
其格式為:</p>
<p>#EXT-X-PLAYLIST-TYPE:<type-enum><br>
其中:type-enum可選值如下:</p>
<p>VOD:即Video on Demand,表示此視螢幕流為點播來源,因此<a href="https://uzbox.com/zh/tag/fuwuqi" class="st_tag internal_tag" rel="tag" title="伺服器">伺服器</a>不能更改該m3u8 檔案;</p>
<p>EVENT:表示該視訊串流為<a href="https://uzbox.com/zh/tag/zhiboyuan" class="st_tag internal_tag" rel="tag" title="直播來源">直播來源</a>,因此伺服器不能更改或刪除該文件任意部分內容(但是可以在文件末尾添加新內容)。<br>
注意:VOD 檔案通常帶有EXT-X-ENDLIST 標籤,因為其為點播來源,不會改變;而EVEVT 檔案初始化時一般不會有EXT-X-ENDLIST 標籤,暗示有新的檔案會新增到播放清單結尾,因此也需要客戶端定時取得該m3u8 檔案,以取得新的檔案標籤</p>
<p>EXT-XI-FRAMES-ONLY:此標籤表示每個媒體片段都是一個I-frame。 I-frames 幀視屏編碼不依賴其他幀數,因此可以透過I-frame 進行快速播放,急速翻轉等操作。<br>
該標籤全域生效。<br>
其格式為:</p>
<p>#EXT-XI-FRAMES-ONLY<br>
如果播放清單設定了EXT-XI-FRAMES-ONLY,那麼切片的時長(EXTINF 標籤的值)即為當前切片I-frame 幀開始到下一個I-frame 幀出現的時長。<br>
媒體資源如果包含I-frame 切片,那麼必須提供媒體初始化區塊或透過EXT-X-MAP 標籤提供媒體初始化區塊的取得途徑,以便用戶端就能透過這些I-frame 切片以任意順序進行載入和解碼。<br>
如果I-frame 切片設定了EXT-BYTERANGE,那麼就絕對不能提供媒體初始化區塊。<br>
使用EXT-XI-FRAMES-ONLY 要求的相容版本號EXT-X-VERSION 大於等於4。</p>
<p>主播放清單類型標籤:主播放清單(Master Playlist)定義了備份流,多語言翻譯流和其他全域參數。<br>
主播放清單標籤絕對不能出現在媒體播放清單(Media Playlist)中。<br>
其具體標籤如下:</p>
<p>EXT-X-MEDIA:用於指定相同內容的可替換的多語言翻譯播放媒體清單資源。<br>
例如,透過三個EXT-X-MEIDA 標籤,可以提供包含英文,法語和西班牙語版本的相同內容的音訊資源,或透過兩個EXT-X-MEDIA 提供兩個不同拍攝角度的螢幕資源。<br>
其格式為:</p>
<p>#EXT-X-MEDIA:<attribute-list><br>
其中,屬性清單取值範圍如下:</p>
<p>TYPE:此屬性值為一個可枚舉字串。<br>
其數值有以下四種:AUDIO,VIDEO,SUBTITLES,CLOSED-CAPTIONS。<br>
通常使用的都是CLOSED-CAPTIONS。<br>
此屬性為必選參數。</p>
<p>URI:雙引號包裹的媒體資源播放清單路徑。<br>
如果TYPE 屬性值為CLOSED-CAPTIONS,那麼則不能提供URI。<br>
此屬性為可選參數。</p>
<p>GROUP-ID:雙引號包裹的字串,表示多語言翻譯流所屬群組。<br>
此屬性為必選參數。</p>
<p>LANGUAGE:雙引號包裹的字串,用於指定串流主要使用的語言。<br>
此屬性為可選參數。</p>
<p>ASSOC-LANGUAGE:雙引號包裹的字串,其內包含一個語言標籤,用於提供多語言流的其中一種語言版本。<br>
此參數為可選參數。</p>
<p>NAME:雙引號包裹的字串,用於為翻譯流提供可讀的描述資訊。<br>
如果設定了LANGUAGE 屬性,那麼也應設定NAME 屬性。<br>
此屬性為必選參數。</p>
<p>DEFAULT:此屬性值為一個可枚舉字串。<br>
可選值為YES和NO。<br>
該屬性未指定時預設值為NO。<br>
如果該屬性設為YES,那麼客戶端在缺乏其他可選資訊時應播放該翻譯流。<br>
此屬性為可選參數。</p>
<p>AUTOSELECT:此屬性值為一個可枚舉字串。<br>
其有效值為YES或NO。<br>
未指定時,預設設為NO。<br>
如果該屬性設定YES,那麼客戶端在使用者沒有顯示進行設定時,可以選擇播放該翻譯串流,因為其能配置目前播放環境,例如係統語言選擇。<br>
如果設定了該屬性,那麼當DEFAULT 設定YES時,該屬性也必須設定為YES。<br>
此屬性為可選參數。</p>
<p>FORCED:該屬性值為一個可枚舉字串。<br>
其有效值為YES或NO。<br>
未指定時,預設設為NO。<br>
只有在設定了TYPE 為SUBTITLES 時,才可以設定該屬性。<br>
當此屬性設為YES時,則暗示此翻譯流包含重要內容。當設定了該屬性,用戶端應選擇播放符合目前播放環境最佳的翻譯串流。<br>
當此屬性設為NO時,則表示該翻譯流內容意圖用於回覆使用者顯示進行請求。<br>
此屬性為可選參數。</p>
<p>INSTREAM-ID:由雙引號包裹的字串,用於指示切片的語言(Rendition)版本。<br>
當TYPE 設為CLOSED-CAPTIONS 時,必須設定該屬性。<br>
其可選值為:"CC1", "CC2", "CC3", "CC4" 和"SERVICEn"(n的值為1~63)。<br>
對於其他TYPE 值,該屬性絕不能進行設定。</p>
<p>CHARACTERISTICS:由雙引號包裹的由一個或多個由逗號分隔的UTI 構成的字串。<br>
每個UTI 表示一種翻譯流的特徵。<br>
該屬性可包含私有UTI。<br>
此屬性為可選參數。</p>
<p>CHANNELS:由雙引號包裹的有序,由反斜線/分隔的參數清單組成的字串。<br>
所有音訊EXT-X-MEDIA 標籤應設定CHANNELS 屬性。<br>
如果主播放清單包含兩個相同編碼但是具有不同數目channed 的翻譯流,則必須設定CHANNELS 屬性;否則,CHANNELS 屬性為可選參數。</p>
<p>EXT-X-STREAM-INF:此屬性指定了一個備份來源。此屬性值提供了該備份來源的相關資訊。<br>
其格式為:</p>
<p>#EXT-X-STREAM-INF:<attribute-list><br>
<uri><br>
其中:</p>
<p>URI 指定的媒體播放清單攜帶了該標籤指定的翻譯備份來源。<br>
URI 為必選參數。</p>
<p>EXT-X-STREAM-INF 標籤的參數屬性清單有以下選項:</p>
<p>BANDWIDTH:此屬性為每秒傳輸的位元數,也即頻寬。代表該備份流的巔峰速率。<br>
此屬性為必選參數。</p>
<p>AVERAGE-BANDWIDTH:此屬性為備份流的平均切片傳輸速率。<br>
此屬性為可選參數。</p>
<p>CODECS:雙引號包裹的包含由逗號分隔的格式清單組成的字串。<br>
每個EXT-X-STREAM-INF 標籤都應當攜帶CODECS 屬性。</p>
<p>RESOLUTION:此屬性描述備份流視螢幕來源的最佳像素方案。<br>
此屬性為可選參數,但對於包含視屏來源的備份流建議增加此屬性設定。</p>
<p>FRAME-RATE:此屬性以一個十進位浮點型數值作為描述備份流所有視螢幕最大幀率。<br>
對於備份流中任意視屏來源幀數超過每秒30 幀的,應增加此屬性設定。<br>
此屬性為可選參數,但對於包含視屏來源的備份流建議增加此屬性設定。</p>
<p>HDCP-LEVEL:此屬性值為一個可枚舉字串。<br>
其有效值為TYPE-0或NONE。<br>
值為TYPE-0表示此備份流可能會播放失敗,除非輸出被高頻寬數位內容保護(HDCP)。<br>
值為NONE表示流內容無需輸出拷貝保護。<br>
使用不同程度的HDCP 加密備份流應使用不同的媒體加密金鑰。<br>
此屬性為可選參數。在缺乏HDCP 可能存在播放失敗的情況下,應提供該屬性。</p>
<p>AUDIO:屬性值由雙引號包裹,其值必須與定義在主播放清單某處的設定了TYPE 屬性值為AUDIO 的EXT-X-MEDIA 標籤的GROUP-ID 屬性值相符。<br>
此屬性為可選參數。</p>
<p>VIDEO:屬性值由雙引號包裹,其值必須與定義在主播放清單某處的設定了TYPE 屬性值為VIDEO 的EXT-X-MEDIA 標籤的GROUP-ID 屬性值相符。<br>
此屬性為可選參數。</p>
<p>SUBTITLES:屬性值由雙引號包裹,其值必須與定義在主播放清單某處的設定了TYPE 屬性值為SUBTITLES 的EXT-X-MEDIA 標籤的GROUP-ID 屬性值相符。<br>
此屬性為可選參數。</p>
<p>CLOSED-CAPTIONS:此屬性值可以是一個雙引號包裹的字串或NONE。<br>
如果其值為一個字串,則必須與定義在主播放清單某處的設定了TYPE 屬性值為CLOSED-CAPTIONS 的EXT-X-MEDIA 標籤的GROUP-ID 屬性值相符。<br>
如果其值為NONE,則所有的ext-x-stream-inf 標籤必須同樣將此屬性設定NONE,表示主播放清單備份流均沒有關閉的標題。對於某個備份流具備關閉標題,另一個備份流不具備關閉標題可能會觸發播放中斷。<br>
此屬性為可選參數。</p>
<p>EXT-XI-FRAME-STREAM-INF:此標籤表示媒體播放清單檔案包含多種媒體資源的I-frame 訊框。<br>
其格式為:</p>
<p>#EXT-XI-FRAME-STREAM-INF:<attribute-list><br>
此標籤的屬性清單包含了EXT-XI-FRAME-STREAM-INF 標籤相同的屬性清單選項,除了FRAME-RATE,AUDIO,SUBTITLES 和CLOSED-CAPTIONS。除此之外,其他的屬性還有:</p>
<p>URI:此屬性值由雙引號包裹的字串,指示了I-frame 媒體播放清單檔案的路徑,該媒體播放清單檔案必須包含EXT-XI-FRAMES-ONLY 標籤。<br>
EXT-X-SESSION-DATA:此標籤允許主播放清單攜帶任意session 資料。<br>
此標籤為可選參數。<br>
其格式為:</p>
<p>#EXT-X-SESSION-DATA:<attribute-list><br>
其中,其參數屬性清單值如下可選項:</p>
<p>DATA-ID:由雙引號包裹的字串,代表一個特定的資料值。<br>
此屬性應使用反向DNS 進行命名,如"com.example.movie.title"。然而,由於沒有中央註冊機構,所以可能會出現衝突情況。<br>
此屬性為必選參數。</p>
<p>VALUE:此屬性值為一個雙引號包裹的字串,其包含DATA-ID 指定的值。<br>
如果設定了LANGUAGE,則VALUE 應包含一個用該語言書寫的可讀字串。</p>
<p>URI:雙引號包裹的URI 字串。由該URI 指示的資源必選使用JSON 格式,否則,用戶端可能會解析失敗。</p>
<p>LANGUAGE:由雙引號包裹的,包含一個語言標籤的字串。指示了VALUE 所使用的語言。</p>
<p>EXT-X-SESSION-KEY:此標籤允許主播放清單(Master Playlist)指定媒體播放清單(Meida Playlist)的加密金鑰。這使得客戶端可以預先載入這些金鑰,而無需從媒體播放清單中取得。<br>
此標籤為可選參數。<br>
其格式為:<br>
#EXT-X-SESSION-KEY:<attribute-list><br>
其屬性清單與EXT-X-KEY 相同,除了METHOD 屬性的值必須不為NONE。<br>
播放清單類型標籤:以下標籤可同時設定於主播放清單(Master Playlist)和媒體播放清單(Media Playlist)中。<br>
但是對於在主播放清單中設定了的標籤,不應再次設定在主播放清單所指向的媒體播放清單中。<br>
同時出現在兩者播放清單的相同標籤必須具備相同的值。這些標籤在播放清單中不能出現多次(只能使用一次)。具體標籤如下圖所示:</p>
<p>EXT-X-INDEPENDENT-SEGMENTS:此標籤表示對於一個媒體片段中的所有媒體樣本均可獨立進行解碼,而無須依賴其他媒體片段資訊。<br>
此標籤對清單內所有媒體片段均有效。<br>
其格式為:</p>
<p>#EXT-X-INDEPENDENT-SEGMENTS<br>
如果該標籤出現在主播放清單中,則其對所有媒體播放清單的所有媒體片段都生效。</p>
<p>EXT-X-START:此標籤表示播放清單播放起始位置。<br>
預設情況下,用戶端開啟一個播放會話時,應使用該標籤指定的位置進行播放。<br>
此標籤為可選標籤。<br>
其格式為:</p>
<p>#EXT-X-START:<attribute-list><br>
其參數屬性清單的取值範圍如下:</p>
<p>TIME-OFFSET:此屬性值為一個帶符號十進位浮點數(單位:秒)。<br>
一個正數表示以播放清單起始位置開始的時間偏移。<br>
一個負數表示播放清單上一個媒體片段最後位置往前的時間偏移。<br>
此屬性的絕對值應不超過播放清單的時長。如果超過,則表示到達檔案結尾(數值為正數),或達到檔案起始(數值為負數)。<br>
如果播放清單不包含EXT-X-ENDLIST 標籤,那麼TIME-OFFSET 屬性值不應在播放檔案末端三個切片時長之內。</p>
<p>PRECISE:該值為一個可枚舉字串。<br>
有效的取值為YES 或NO。<br>
如果值為YES,用戶端應播放包含TIME-OFFSET 的媒體片段,但不要渲染該區塊內優先於TIME-OFFSET 的樣本區塊。<br>
如果值為NO,客戶端應嘗試渲染在媒體片段內的所有樣本區塊。<br>
此屬性為可選參數,未指定則認為NO。</p>
<p>到此,m3u8 相關的標籤我們已經完全介紹完畢。</p>
<p>下面我們再簡單介紹下資源檔案的取得具體操作。</p>
<p>上文提到,m3u8 檔案不是媒體播放清單(Meida Playlist),就是主播放清單(Master Playlist)。但無論是哪一種列表,其有效內容均由兩部分結構組成:</p>
<p>以#EXT 開頭的為標籤訊息,作為媒體資源的進一步描述;<br>
剩餘的為資源訊息,要麼是片段資源(Media Playlist)路徑,要麼是m3u8 資源(Master Playlist)路徑;<br>
我們先簡單介紹下m3u8 檔案媒體片段的表示方法:</p>
<p>m3u8 檔案中,媒體片段可以採用全路徑表示。如下圖所示:<br>
#EXTINF:10.0,<br>
<a href="http://example.com/movie1/fileSequenceA.ts" rel="nofollow">http://example.com/movie1/fileSequenceA.ts</a><br>
這樣,取得資源片段的路徑就是m3u8 檔案內指定的路徑,即:http://example.com/movie1/fileSequenceA.ts</p>
<p>m3u8 檔案中,媒體片段也可以使用相對路徑表示。如下圖所示:<br>
#EXTINF:10.0,<br>
fileSequenceA.ts<br>
這表示片段檔案的路徑是相對於m3u8 檔案路徑的,即假設目前m3u8 的路徑為:https://127.0.0.1/hls/m3u8,那麼,片段檔案fileSequenceA.ts 的路徑即為:https://127.0.0.1/hls/SefilequenceA.ts</p>
<p>儘管可以在m3u8 檔案中使用絕對路徑指定媒體片段資源路徑,但更好的選擇是使用相對路徑。相對路徑相較於絕對路徑更輕,同時是相對於m3u8 檔案的URL。相較之下,絕對路徑增加了m3u8 檔案內容(更多字元),增大了檔案內容,同時也增大了網路傳輸量。</p>
<p>其餘一些注意事項<br>
有兩種請求m3u8 播放清單的方法:一是透過m3u8 的URI 進行請求,則該檔案必須以.m3u8 或.m3u 結尾;<br>
二是透過HTTP 進行請求,則請求頭<a href="https://uzbox.com/zh/tag/content" class="st_tag internal_tag" rel="tag" title="content">Content</a>-Type必須設定為application/vnd.apple.mpegurl或audio/mpegurl。</p>
<p>空行和註解行在解析時都忽略。</p>
<p>媒體播放清單(Media Playlist)的串流資源總時長就是各切片資源的長度總和。</p>
<p>每個切片的碼率(bit rate)就是切片的大小除以它對應的時長(EXTINF 指定的時長)。</p>
<p>一個標籤的屬性清單的同一個屬性AttributeName只能出現一次。</p>
<p>EXT-X-TARGETDURATION 指定的時長絕對不能進行更改。通常該值指定的時長為10 秒。</p>
<p>對於指定了EXT-XI-FRAMES-ONLY 且第一個媒體片段(或第一個尾隨EXT-X-DISCONTINUITY 的片段)其資源沒有立即攜帶媒體初始化區塊的切片,應增加使用標籤EXT-X-MAP 指定媒體初始化區塊獲取途徑。</p>
<p>使用EXT-X-MAP 標籤內含標籤EXT-XI-FRAMES-ONLY 要求的相容版本號EXT-X-VERSION 則大於等於5;只使用EXT-X-MAP 要求的相容版本號要大於等於6。</p>
<p>由標籤EXT-X-MAP 宣告的媒體初始化區塊可使用AES-128 方法進行加密,此時,作用於EXT-X-MAP 標籤的EXT-X-KEY 標籤必須設定IV 屬性。</p>
<p>屬性END-ON-NEXT=YES 的標籤EXT-X-DATERANGE 必須攜帶CLASS 屬性,但不能攜帶DURATION 和END-DATE 屬性。其餘帶有相同CLASS 的標籤EXT-X-DATERANGE 則不能指定重疊的日期範圍。</p>
<p>日期範圍若未指明DURATION,END_DATE,END-ON-NEXT=YES 屬性時,則其長度(duration)未知,即使其設定了PLANNED-DURATION 屬性。</p>
<p>如果播放清單設定了EXT-X-DATERANGE 標籤,則必須同時設定EXT-X-PROGRAM-DATE-TIME 標籤。</p>
<p>如果播放清單設定了兩個擁有相同ID 屬性值的EXT-X-DATERANGE 標籤,則對於相同的屬性名,在這兩個EXT-X-DATERANGE 中對應的值必須一致。</p>
<p>如果EXT-X-DATERANGE 同時設定了DURATION 和END-DATE 屬性,則END-DATE 屬性值必須等於START-DATE 屬性值加上DURATION 屬性值。</p>
<p>EXT-X-MEDIA-SEQUENCE 標籤必須出現在播放清單第一個切片之前。</p>
<p>EXT-X-DISCONTINUITY-DEQUENCE 標籤必須出現在播放清單第一個切片之前。</p>
<p>EXT-X-DISCONTINUITY-DEQUENCE 標籤必須出現在任何EXT-X-DISCONTINUITY 標籤之前。</p>
<p>m3u8 檔案如果沒有設定EXT-X-PLAYLIST-TYPE 標籤,那麼播放清單可以隨時進行變更。例如,可以更新或刪除播放清單中的媒體片段。</p>
<p>每個EXT-XI-FRAME-STREAM-INF 標籤必須包含一個BANDWIDTH 和URI 屬性。</p>
<p>每個EXT-X-SESSION-DATA 標籤都必須包含一個VALUE 或URI 屬性,但不能同時包含兩者。</p>
<p>一個播放清單可以包含多個攜帶相同DATA-ID 屬性的EXT-X-SESSION-DATA 標籤。但不能包含多個攜帶相同DATA-ID 和相同LANGUAGE 屬性的EXT-X-SESSION-DATA 標籤。</p>
<p>如果設定了EXT-X-SESSION-KEY,那麼其METHOD,KEYFORMAT 和KEYFORMATVERSIONS 屬性值必須與任意相同URI 的EXT-X-KEY 標籤值相同。</p>
<p>如果多份備用流或多語言流使用相同的加密金鑰和格式,則應設定EXT-X-SESSION-KEY 標籤。</p>
<p>主播放清單必須不能設定多個具有相同METHOD,URI,IV,KEYFORMAT 和KEYFORMATVERSIONS 屬性值得EXT-X-SESSION-KEY 標籤。</p>
<h3 class="typography-headline"><span id="HTTP"><a href="https://developer.apple.com/streaming/"><span>了解什麼是HTTP 即時串流傳輸</span></a></span></h3><div class="kk-star-ratings kksr-auto kksr-align-center kksr-valign-bottom" data-payload="{"align":"center","id":"9800","slug":"default","valign":"bottom","ignore":"","reference":"auto","class":"","count":"0","legendonly":"","readonly":"","score":"0","starsonly":"","best":"5","gap":"5","greet":"评分","legend":"0\5 - (0 votes)","size":"24","title":"m3u8 格式是什么文件?","width":"0","_legend":"{score}\{best} ({count} {votes})","font_factor":"1.25"}">
<div class="kksr-stars">
<div class="kksr-stars-inactive">
<div class="kksr-star" data-star="1" style="padding-right: 5px"><div class="kksr-icon" style="width: 24px; height: 24px;"></div>
</div>
<div class="kksr-star" data-star="2" style="padding-right: 5px"><div class="kksr-icon" style="width: 24px; height: 24px;"></div>
</div>
<div class="kksr-star" data-star="3" style="padding-right: 5px"><div class="kksr-icon" style="width: 24px; height: 24px;"></div>
</div>
<div class="kksr-star" data-star="4" style="padding-right: 5px"><div class="kksr-icon" style="width: 24px; height: 24px;"></div>
</div>
<div class="kksr-star" data-star="5" style="padding-right: 5px"><div class="kksr-icon" style="width: 24px; height: 24px;"></div>
</div>
</div>
<div class="kksr-stars-active" style="width: 0px;">
<div class="kksr-star" style="padding-right: 5px"><div class="kksr-icon" style="width: 24px; height: 24px;"></div>
</div>
<div class="kksr-star" style="padding-right: 5px"><div class="kksr-icon" style="width: 24px; height: 24px;"></div>
</div>
<div class="kksr-star" style="padding-right: 5px"><div class="kksr-icon" style="width: 24px; height: 24px;"></div>
</div>
<div class="kksr-star" style="padding-right: 5px"><div class="kksr-icon" style="width: 24px; height: 24px;"></div>
</div>
<div class="kksr-star" style="padding-right: 5px"><div class="kksr-icon" style="width: 24px; height: 24px;"></div>
</div>
</div>
</div><div class="kksr-legend" style="font-size: 19.2px;">
<span class="kksr-muted">評分</span>
</div>
</div>