天天看點

m3u8 檔案格式簡解m3u8 檔案格式詳解M3U8 檔案簡介一些注意事項

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 的 URI 進行請求,則該檔案必須以 .m3u8 或 .m3u 結尾;

    二是通過 HTTP 進行請求,則請求頭

    Content-Type

    必須設定為

    application/vnd.apple.mpegurl

    或者

    audio/mpegurl

  • 空行和注釋行在解析時都忽略。
  • 媒體播放清單(Media Playlist)的流資源總時長就是各切片資源的時長之和。
  • 每個切片的碼率(bit rate)就是切片的大小除以它對應的時長(EXTINF 指定的時長)。
  • 一個标簽的屬性清單的同一個屬性

    AttributeName

    隻能出現一次。
  • EXT-X-TARGETDURATION 指定的時長絕對不能進行更改。通常該值指定的時長為 10 秒。
  • 對于指定了 EXT-X-I-FRAMES-ONLY 且 第一個媒體片段(或者第一個尾随 EXT-X-DISCONTINUITY 的片段)其資源沒有立即攜帶媒體初始化塊的切片,應當增加使用标簽 EXT-X-MAP 指定媒體初始化塊擷取途徑。
  • 使用 EXT-X-MAP 标簽内含标簽 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 标簽必須出現在播放清單第一個切片之前。
  • EXT-X-DISCONTINUITY-DEQUENCE 标簽必須出現在播放清單第一個切片之前。
  • EXT-X-DISCONTINUITY-DEQUENCE 标簽必須出現在任意 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 标簽。