這篇文章只是 M3U、M3U八、HLS、TS 相關的一些基礎概念html
"M3U" 和 "M3U8" 文件都是蘋果公司使用的 HTTP Live Streaming(HLS) 協議格式的基礎,這種協議格式能夠在 iPhone 和 Macbook 等設備播放。緩存
HLS(HTTP Live Streaming) 是由Apple公司定義的用於實時流傳輸的協議,HLS基於HTTP協議實現,傳輸內容包括兩部分,一是M3U8描述文件,二是TS媒體文件。服務器
效果就是客戶端會根據網絡情況自動選擇不一樣碼率的視頻流,條件容許的狀況下使用高碼率,網絡繁忙的時候使用低碼率,而且可以自動在兩者之間隨意切換。這對移動設備網絡情況不穩定的狀況下保障流暢播放很是有幫助。實現方法是服務器端提供多碼率視頻流,而且在列表文件中註明,播放器根據播放進度和下載速度進行自動調整。網絡
這是由於兩個 TS 片斷能夠無縫拼接,播放器能連續播放,而 MP4 文件因爲編碼方式的緣由,兩段 MP4 不能無縫拼接,播放器連續播放兩個 MP4 文件會出現破音和畫面間斷,影響用戶體驗。並且若是要在一段長達一小時的視頻中跳轉,若是使用單個 MP4 格式的視頻文件,而且也是用 HTTP 協議,那麼須要代理服務器支持 HTTP range request 獲取大文件中的一部分。這樣的話,對於代理服務器的性能來講要求較高。而 HTTP Live Streaming 則只須要根據列表文件中的時間軸找出對應的 TS 片斷下載便可,不須要 range request,對代理服務器的要求小不少。全部代理服務器都支持小文件的高效緩存。app
核心,在於對於 m3u8 的文件解析和 經過 XHR 去完成對分片內容二進制文件的獲取,而後使用 MSE 的 appendBuffer 去進行 buffer 的封裝,而後本身完成合流的工做。ide
M3U
文件是記錄了一個索引純文本文件,能夠指定一個或多個多媒體文件的位置,其文件擴展名是「M3U」或者「m3u」。打開它時播放軟件並非播放它,而是根據它的索引找到對應的音視頻文件的網絡地址進行在線播放。M3U文件的做用一般是建立指向在線流媒體的播放列表,建立的文件能夠輕鬆訪問流媒體。性能
M3U8
是Unicode版本的M3U
,用UTF-8編碼。ui
m3u8 文件實質是一個播放列表(playlist),其多是一個媒體播放列表(Media Playlist),或者是一個主列表(Master Playlist)。編碼
當 m3u8 文件做爲媒體播放列表(Meida Playlist)時,其內部信息記錄的是一系列媒體片斷資源,順序播放該片斷資源,便可完整展現多媒體資源。對於點播來講,客戶端只需按順序下載片斷資源,依次進行播放便可。而對於直播來講,客戶端須要定時從新請求該 m3u8 文件,看下是否有新的片斷數據須要進行下載並播放。加密
當 m3u8 做爲主播放列表(Master Playlist)時,其內部提供的是同一份媒體資源的多份流列表資源(Variant Strean)。客戶能夠根據不一樣的網絡狀態選取合適碼流的資源,而且最好根據用戶喜愛選擇合適的資源內容。
m3u8 文件要麼是媒體播放列表,要麼是主播放列表。但不管是哪一種列表,其有效組成均由兩部分構成:
m3u8 文件必須以 utf-8 進行編碼,不能使用 Byte Order Mark(BOM)字節序, 不能包含 utf-8 控制字符(U+0000 ~ U_001F 和 U+007F ~ u+009F)。
3u8 文件的每一行要麼是一個 URI,要麼是空行,要麼就是以 # 開頭的字符串。不能出現空白字符,除了顯示聲明的元素。
m3u8 文件中以 # 開頭的字符串要麼是註釋,要麼就是標籤。標籤以 #EXT 開頭,大小寫敏感。
標籤用於指定 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
即 Video on Demand,表示該視屏流爲點播源,所以服務器不能更改該 m3u8 文件;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中的視頻幀率(可選參數)。EXT-X-ENDLIST
標籤時,不管這個M3U8列表中有多少個分片,播放分片都是從倒數第三片開始播放,若是不滿3片則不該該播放。固然若是有些播放器作了特別定製了,則能夠不遵守這個原則。X-DISCONTINUTY
標籤來解決這個錯誤。有兩種請求 m3u8 播放列表的方法:一是經過 m3u8 的 URI 進行請求,則該文件必須以 .m3u8
或 .m3u
結尾;二是經過 HTTP 進行請求,則請求頭 Content-Type
必須設置爲 application/vnd.apple.mpegurl
或者 audio/mpegurl
。
空行和註釋行在解析時都忽略。
媒體播放列表(Media Playlist)的流資源總時長就是各切片資源的時長之和。
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文件(碼流)的分層結構圖
加密後的ts文件不能直接合並或播放,須要使用key對每一個ts文件解密。
參考資料: