M3U8 視頻文件

這篇文章只是 M3U、M3U8、HLS、TS 相關的一些基礎概念

"M3U" 和 "M3U8" 文件都是蘋果公司使用的 HTTP Live Streaming(HLS) 協議格式的基礎,這種協議格式可以在 iPhone 和 Macbook 等設備播放。

HLS 解決方案

HLS(HTTP Live Streaming) 是由Apple公司定義的用於實時流傳輸的協議,HLS基於HTTP協議實現,傳輸內容包括兩部分,一是M3U8描述文件,二是TS媒體文件。

1. HLS的優勢為:自適應碼率流播(adaptive streaming)。

效果就是客戶端會根據網絡狀況自動選擇不同碼率的視頻流,條件允許的情況下使用高碼率,網絡繁忙的時候使用低碼率,並且能夠自動在二者之間隨意切換。這對移動設備網絡狀況不穩定的情況下保障流暢播放非常有幫助。實現方法是服務器端提供多碼率視頻流,並且在列表文件中註明,播放器根據播放進度和下載速度進行自動調整。

2. 為什麼要用 TS 而不是 MP4

這是因為兩個 TS 片段可以無縫拼接,播放器能連續播放,而 MP4 文件由於編碼方式的原因,兩段 MP4 不能無縫拼接,播放器連續播放兩個 MP4 文件會出現破音和畫面間斷,影響用戶體驗。而且如果要在一段長達一小時的視頻中跳轉,如果使用單個 MP4 格式的視頻文件,並且也是用 HTTP 協議,那麼需要代理服務器支持 HTTP range request 獲取大文件中的一部分。這樣的話,對於代理服務器的性能來說要求較高。而 HTTP Live Streaming 則只需要根據列表文件中的時間軸找出對應的 TS 片段下載即可,不需要 range request,對代理服務器的要求小很多。所有代理服務器都支持小文件的高效緩存。

3. 可以使用FFmpeg轉MP4為HLS(M3U8)文件。

4. hsl處理方案

M3U8 視頻文件

核心,在於對於 m3u8 的文件解析和 通過 XHR 去完成對分片內容二進制文件的獲取,然後使用 MSE 的 appendBuffer 去進行 buffer 的封裝,然後自己完成合流的工作。

M3U8

M3U 文件是記錄了一個索引純文本文件,可以指定一個或多個多媒體文件的位置,其文件擴展名是“M3U”或者“m3u”。打開它時播放軟件並不是播放它,而是根據它的索引找到對應的音視頻文件的網絡地址進行在線播放。M3U文件的作用通常是創建指向在線流媒體的播放列表,創建的文件可以輕鬆訪問流媒體。

M3U8 是Unicode版本的 M3U ,用UTF-8編碼。

m3u8 文件實質是一個播放列表(playlist),其可能是一個媒體播放列表(Media Playlist),或者是一個主列表(Master Playlist)。

當 m3u8 文件作為媒體播放列表(Meida Playlist)時,其內部信息記錄的是一系列媒體片段資源,順序播放該片段資源,即可完整展示多媒體資源。對於點播來說,客戶端只需按順序下載片段資源,依次進行播放即可。而對於直播來說,客戶端需要定時重新請求該 m3u8 文件,看下是否有新的片段數據需要進行下載並播放。

當 m3u8 作為主播放列表(Master Playlist)時,其內部提供的是同一份媒體資源的多份流列表資源(Variant Strean)。客戶可以根據不同的網絡狀態選取合適碼流的資源,並且最好根據用戶喜好選擇合適的資源內容。

m3u8 文件要麼是媒體播放列表,要麼是主播放列表。但無論是哪種列表,其有效組成均由兩部分構成:

  • 以 #EXT 開頭的為標籤信息,作為對媒體資源的進一步描述;
  • 剩餘的為資源信息,要麼是片段資源(Media Playlist)路徑,要麼是 m3u8 資源(Master Playlist)路徑;

m3u8文件遵循的條件:

  • m3u8 文件必須以 utf-8 進行編碼,不能使用 Byte Order Mark(BOM)字節序, 不能包含 utf-8 控制字符(U+0000 ~ U_001F 和 U+007F ~ u+009F)。
  • 3u8 文件的每一行要麼是一個 URI,要麼是空行,要麼就是以 # 開頭的字符串。不能出現空白字符,除了顯示聲明的元素。
  • m3u8 文件中以 # 開頭的字符串要麼是註釋,要麼就是標籤。標籤以 #EXT 開頭,大小寫敏感。

m3u8 標籤

標籤用於指定 m3u8 文件的全局參數或在其後面的切片文件/媒體播放列表的一些信息。

#EXTM3U // 表明該文件是一個 m3u8 文件,必須在文件的第一行#EXT-X-VERSION:3   //  HLS 的協議版本號#EXT-X-ALLOW-CACHE:NO#EXT-X-MEDIA-SEQUENCE:1572999465  // M3U8直播時的直播切換序列,當播放打開M3U8時,以這個標籤的值作為參考,播放對應的序列號的切片#EXT-X-TARGETDURATION:6 // 該標籤指定了媒體文件持續時間的最大值,,播放文件列表中的媒體文件在EXTINF標籤中定義的持續時間必須小於或者等於該標籤指定的持續時間。該標籤在播放列表文件中必須出現一次。#EXT-QQHLS-PIC-WIDTH:0#EXT-QQHLS-PIC-HEIGHT:0#EXT-QQHLS-CK:CRC_16#EXT-QQHLS-BN:8#EXT-QQHLS-SEGMENT-TYPE:0#EXT-QQHLS-SEGMENT_RANGE:1572999448-1572999472#EXT-X-PROGRAM-DATE-TIME:2019-11-06T10:11:57+08:00 // 片段取樣時間#EXT-QQHLS-MACHINEID:56448#EXT-QQHLS-START-TIME:1573006317#EXT-SID:1572999465#EXT-SC:SZ=254364&CK=e633#EXT-BC:SZ=31744&CK=782e#EXT-BC:SZ=31744&CK=256a#EXT-BC:SZ=31744&CK=7b04#EXT-BC:SZ=31744&CK=30dd#EXT-BC:SZ=31744&CK=6d89#EXT-BC:SZ=31744&CK=46d#EXT-BC:SZ=31744&CK=8f4#EXT-BC:SZ=32156&CK=71b5#EXTINF:5.000,100204101-1572999465.ts?cdncode=/18907E7BE0798990/&HLSP2P=1&buname=qqlive&sdtfrom=10002212&vkey=F1FE87B5E6D84B6FEFBB683D7C2558C08C8CF7B6E752E05C689F1117D651C359E4C7460F44AF4CA4D54188D17A34DB8F3D1E1A9B03F5F5509AFFC93EEA5B90B835EB1E096C8EA81447313AD2761912137D4F692E8AEC2D52E0E3ACD02E09272F82A1FC8573388BDE57FBE56A424E01BA// EXTINF為M3U8列表中每一個分片的duration,描述信息#EXT-X-PROGRAM-DATE-TIME:2019-11-06T10:12:02+08:00#EXT-QQHLS-MACHINEID:56448#EXT-QQHLS-START-TIME:1573006322#EXT-SID:1572999466#EXT-SC:SZ=287264&CK=6abc#EXT-BC:SZ=35840&CK=aa34#EXT-BC:SZ=35840&CK=42f1#EXT-BC:SZ=35840&CK=46f#EXT-BC:SZ=35840&CK=3fd#EXT-BC:SZ=35840&CK=75b2#EXT-BC:SZ=35840&CK=af4f#EXT-BC:SZ=35840&CK=52a1#EXT-BC:SZ=36384&CK=86ed#EXTINF:5.000,100204101-1572999466.ts?cdncode=/18907E7BE0798990/&HLSP2P=1&buname=qqlive&sdtfrom=10002212&vkey=F1FE87B5E6D84B6FEFBB683D7C2558C08C8CF7B6E752E05C689F1117D651C359E4C7460F44AF4CA4D54188D17A34DB8F3D1E1A9B03F5F5509AFFC93EEA5B90B835EB1E096C8EA81447313AD2761912137D4F692E8AEC2D52E0E3ACD02E09272F82A1FC8573388BDE57FBE56A424E01BA#EXT-X-PROGRAM-DATE-TIME:2019-11-06T10:12:07+08:00#EXT-QQHLS-MACHINEID:56448#EXT-QQHLS-START-TIME:1573006327#EXT-SID:1572999467#EXT-SC:SZ=289708&CK=749f#EXT-BC:SZ=35840&CK=a209#EXT-BC:SZ=35840&CK=abb9#EXT-BC:SZ=35840&CK=13ab#EXT-BC:SZ=35840&CK=40b7#EXT-BC:SZ=35840&CK=2e10#EXT-BC:SZ=35840&CK=3a00#EXT-BC:SZ=35840&CK=62ae#EXT-BC:SZ=38828&CK=65e5#EXTINF:5.000,100204101-1572999467.ts?cdncode=/18907E7BE0798990/&HLSP2P=1&buname=qqlive&sdtfrom=10002212&vkey=F1FE87B5E6D84B6FEFBB683D7C2558C08C8CF7B6E752E05C689F1117D651C359E4C7460F44AF4CA4D54188D17A34DB8F3D1E1A9B03F5F5509AFFC93EEA5B90B835EB1E096C8EA81447313AD2761912137D4F692E8AEC2D52E0E3ACD02E09272F82A1FC8573388BDE57FBE56A424E01BA#EXT-X-PROGRAM-DATE-TIME:2019-11-06T10:12:11+08:00#EXT-QQHLS-MACHINEID:56448#EXT-QQHLS-START-TIME:1573006331#EXT-SID:1572999468#EXT-SC:SZ=523016&CK=97c#EXT-BC:SZ=64512&CK=a072#EXT-BC:SZ=64512&CK=b80e#EXT-BC:SZ=64512&CK=13ee#EXT-BC:SZ=64512&CK=2c70#EXT-BC:SZ=64512&CK=992c#EXT-BC:SZ=64512&CK=3c51#EXT-BC:SZ=64512&CK=a079#EXT-BC:SZ=71432&CK=a66#EXTINF:5.000,100204101-1572999468.ts?cdncode=/18907E7BE0798990/&HLSP2P=1&buname=qqlive&sdtfrom=10002212&vkey=F1FE87B5E6D84B6FEFBB683D7C2558C08C8CF7B6E752E05C689F1117D651C359E4C7460F44AF4CA4D54188D17A34DB8F3D1E1A9B03F5F5509AFFC93EEA5B90B835EB1E096C8EA81447313AD2761912137D4F692E8AEC2D52E0E3ACD02E09272F82A1FC8573388BDE57FBE56A424E01BA#EXT-X-PROGRAM-DATE-TIME:2019-11-06T10:12:16+08:00#EXT-QQHLS-MACHINEID:56448#EXT-QQHLS-START-TIME:1573006336#EXT-SID:1572999469#EXT-SC:SZ=670032&CK=6479#EXT-BC:SZ=82944&CK=dc72#EXT-BC:SZ=82944&CK=e970#EXT-BC:SZ=82944&CK=4ca4#EXT-BC:SZ=82944&CK=3d1b#EXT-BC:SZ=82944&CK=fa9b#EXT-BC:SZ=82944&CK=e9d3#EXT-BC:SZ=82944&CK=ee0b#EXT-BC:SZ=89424&CK=b998#EXTINF:5.000,100204101-1572999469.ts?cdncode=/18907E7BE0798990/&HLSP2P=1&buname=qqlive&sdtfrom=10002212&vkey=F1FE87B5E6D84B6FEFBB683D7C2558C08C8CF7B6E752E05C689F1117D651C359E4C7460F44AF4CA4D54188D17A34DB8F3D1E1A9B03F5F5509AFFC93EEA5B90B835EB1E096C8EA81447313AD2761912137D4F692E8AEC2D52E0E3ACD02E09272F82A1FC8573388BDE57FBE56A424E01BA#EXT-X-PROGRAM-DATE-TIME:2019-11-06T10:12:21+08:00#EXT-QQHLS-MACHINEID:56448#EXT-QQHLS-START-TIME:1573006341#EXT-SID:1572999470#EXT-SC:SZ=777756&CK=a13c#EXT-BC:SZ=96256&CK=e95e#EXT-BC:SZ=96256&CK=f459#EXT-BC:SZ=96256&CK=33a6#EXT-BC:SZ=96256&CK=bb7c#EXT-BC:SZ=96256&CK=f3e4#EXT-BC:SZ=96256&CK=635d#EXT-BC:SZ=96256&CK=67e9#EXT-BC:SZ=103964&CK=b938#EXTINF:5.000,100204101-1572999470.ts?cdncode=/18907E7BE0798990/&HLSP2P=1&buname=qqlive&sdtfrom=10002212&vkey=F1FE87B5E6D84B6FEFBB683D7C2558C08C8CF7B6E752E05C689F1117D651C359E4C7460F44AF4CA4D54188D17A34DB8F3D1E1A9B03F5F5509AFFC93EEA5B90B835EB1E096C8EA81447313AD2761912137D4F692E8AEC2D52E0E3ACD02E09272F82A1FC8573388BDE57FBE56A424E01BA#EXT-X-PROGRAM-DATE-TIME:2019-11-06T10:12:27+08:00#EXT-QQHLS-MACHINEID:56448#EXT-QQHLS-START-TIME:1573006347#EXT-SID:1572999471#EXT-SC:SZ=479212&CK=c493#EXT-BC:SZ=59392&CK=dec8#EXT-BC:SZ=59392&CK=1ee8#EXT-BC:SZ=59392&CK=b9bf#EXT-BC:SZ=59392&CK=8b9c#EXT-BC:SZ=59392&CK=29fe#EXT-BC:SZ=59392&CK=493#EXT-BC:SZ=59392&CK=ae5f#EXT-BC:SZ=63468&CK=630#EXTINF:5.000,100204101-1572999471.ts?cdncode=/18907E7BE0798990/&HLSP2P=1&buname=qqlive&sdtfrom=10002212&vkey=F1FE87B5E6D84B6FEFBB683D7C2558C08C8CF7B6E752E05C689F1117D651C359E4C7460F44AF4CA4D54188D17A34DB8F3D1E1A9B03F5F5509AFFC93EEA5B90B835EB1E096C8EA81447313AD2761912137D4F692E8AEC2D52E0E3ACD02E09272F82A1FC8573388BDE57FBE56A424E01BA#EXT-X-PROGRAM-DATE-TIME:2019-11-06T10:12:32+08:00#EXT-QQHLS-MACHINEID:56448#EXT-QQHLS-START-TIME:1573006352#EXT-SID:1572999472#EXT-SC:SZ=266396&CK=648#EXT-BC:SZ=32768&CK=a085#EXT-BC:SZ=32768&CK=8233#EXT-BC:SZ=32768&CK=1831#EXT-BC:SZ=32768&CK=4042#EXT-BC:SZ=32768&CK=f0eb#EXT-BC:SZ=32768&CK=cd3a#EXT-BC:SZ=32768&CK=e245#EXT-BC:SZ=37020&CK=f6e3#EXTINF:5.000,100204101-1572999472.ts?cdncode=/18907E7BE0798990/&HLSP2P=1&buname=qqlive&sdtfrom=10002212&vkey=F1FE87B5E6D84B6FEFBB683D7C2558C08C8CF7B6E752E05C689F1117D651C359E4C7460F44AF4CA4D54188D17A34DB8F3D1E1A9B03F5F5509AFFC93EEA5B90B835EB1E096C8EA81447313AD2761912137D4F692E8AEC2D52E0E3ACD02E09272F82A1FC8573388BDE57FBE56A424E01BA複製代碼

其他的一些常用標籤:

  • EXT-X-DISCONTINUITY 該標籤表明其前一個切片與下一個切片之間存在中斷。 EXT-X-DISCONTINUITY 的一個經典使用場景就是在視屏流中插入廣告,由於視屏流與廣告視屏流不是同一份資源,因此在這兩種流切換時使用 EXT-X-DISCONTINUITY 進行指明,客戶端看到該標籤後,就會處理這種切換中斷問題,讓體驗更佳。
  • EXT-X-KEY 媒體片段可以進行加密,而該標籤可以指定解密方法。
  • EXT-X-PLAYLIST-TYPE :表明流媒體類型。全局生效。該標籤為可選標籤。 可選值如下:VOD EVENT

注:VOD 文件通常帶有 EXT-X-ENDLIST 標籤,因為其為點播源,不會改變;而 EVEVT 文件初始化時一般不會有 EXT-X-ENDLIST 標籤,暗示有新的文件會添加到播放列表末尾,因此也需要客戶端定時獲取該 m3u8 文件,以獲取新的媒體片段資源,直到訪問到 EXT-X-ENDLIST 標籤才停止。

  • EXT-X-PROGRAM-DATE-TIME 該標籤使用一個絕對日期/時間表明第一個樣本片段的取樣時間。
  • EXT-X-MEDIA-SEQUENCE :表示播放列表第一個 URL 片段文件的序列號,每個媒體片段 URL 都擁有一個唯一的整型序列號。 每個媒體片段序列號按出現順序依次加 1。媒體片段序列號與片段文件名無關。如果該標籤未指定,則默認序列號從 0 開始。
  • EXT-X-ENDLIST 若出現 EXT-X-ENDLIST 標籤,則表明M3U8文件不會再產生更多的切片,可以理解為該M3U8已停止更新,並且播放分片到這個標籤後結束。M3U8不僅僅是可以作為直播,也可以作為點播存在,在M3U8文件中保存所有切片信息最後使用 EXT-X-ENDLIST 結尾,這個M3U8即為點播M3U8。 EXT-X-ENDLIST 標籤可能會出現在播放列表文件的任何地方,但是不能出現兩次或以上。
  • EXT-X-STREAM-INF EXT-X-STREAM-INF 標籤出現在M3U8時,主要是出現在多級M3U8文件中時,例如M3U8中包含子M3U8列表,或者主M3U8中包含多碼率M3U8時;該標籤後需要跟一些屬性,下面就來逐一說明一下這些屬性:BANDWIDTH : BANDWIDTH 的值為最高碼率值,當播 放EXT-X-STREAM-INF 下對應的M3U8時佔用的最大碼率(必要參數)。AVERAGE-BANDWIDTH : AVERAGE-BANDWIDTH 的值為平均碼率值,當播放 EXT-X-STREAM-INF 下對應的M3U8時佔用的平均碼率(可選參數)。CODECS :CODECS的值用於聲明 EXT-X-STREAM-INF 下面對應M3U8裡面的音視頻編碼、視頻編碼的信息(可選參數)。RESOLUTION :M3U8中視頻的寬高信息描述(可選參數)。FRAME-RATE :子M3U8中的視頻幀率(可選參數)。

客戶端播放M3U8的一些標準:

EXT-X-ENDLISTX-DISCONTINUTY

注意事項

  • 有兩種請求 m3u8 播放列表的方法:一是通過 m3u8 的 URI 進行請求,則該文件必須以 .m3u8 或 .m3u 結尾;二是通過 HTTP 進行請求,則請求頭 Content-Type 必須設置為 application/vnd.apple.mpegurl 或者 audio/mpegurl 。
  • 空行和註釋行在解析時都忽略。
  • 媒體播放列表(Media Playlist)的流資源總時長就是各切片資源的時長之和。

TS文件

TS(Transport Stream)是一種音視頻封裝格式,全稱MPEG2-TS。MPEG-TS主要應用於實時傳送的節目,比如實時廣播的電視節目。

TS文件(流)可以分為三層:TS層(Transport Stream)、PES層(Packet Elemental Stream)、ES層(Elementary Stream)。

ES層就是音視頻數據,PES層是在音視頻數據上加了時間戳等對數據幀的說明信息,TS層是在PES層上加入了數據流識別和傳輸的必要信息。TS文件(碼流)由多個TS Packet組成的。

TS文件(碼流)的分層結構圖

M3U8 視頻文件

TS流生成流程

  1. 將原始音視頻數據壓縮之後,壓縮結果組成一個基本碼流(ES)。
  2. 對ES(基本碼流)進行打包形成PES。
  3. 在PES包中加入時間戳信息(PTS/DTS)。
  4. 將PES包內容分配到一系列固定長度的傳輸包(TS Packet)中。
  5. 在傳輸包中加入定時信息(PCR)。
  6. 在傳輸包中加入節目專用信息(PSI) 。
  7. 連續輸出傳輸包形成具有恆定比特率的MPEG-TS流。

TS流解析流程

  1. 複用的MPEG-TS流中解析出TS包;
  2. 從TS包中獲取PAT及對應的PMT;
  3. 從而獲取特定節目的音視頻PID;
  4. 通過PID篩選出特定音視頻相關的TS包,並解析出PES;
  5. 從PES中讀取到PTS/DTS,並從PES中解析出基本碼流ES;
  6. 將ES交給解碼器,獲得壓縮前的原始音視頻數據。


分享到:


相關文章: