M3U8 格式詳解

1. M3U 協(xié)議解析

??M3U8文件是指UTF-8編碼格式的M3U文件涧至。M3U文件是記錄了一個(gè)索引純文本文件,打開它時(shí)播放軟件并不是播放它桑包,而是根據(jù)它的索引找到對(duì)應(yīng)的音視頻文件的網(wǎng)絡(luò)地址進(jìn)行在線播放南蓬。

??M3U8是一種常見的流媒體格式,主要以文件列表的形式存在哑了,既支持直播又支持點(diǎn)播赘方,尤其在Android、iOS等平臺(tái)最為常用弱左。


#EXTM3U

#EXT-X-VERSION:3

#EXT-X-MEDIA-SEQUENCE:0

#EXT-X-ALLOW-CACHE:YES

#EXT-X-TARGETDURATION:3

#EXTINF:1.969

https://test.com/test0.ts

#EXTINF:1.972

https://test.com/test1.ts

#EXTINF:1.109

https://test.com/test2.ts

#EXT-X-DISCONTINUITY

#EXTINF:2.969

https://test.com/test3.ts

#EXT-X-ENDLIST

tag說明

下面我們說明一下比較常用和關(guān)鍵的幾個(gè)字段:
  ? EXTM3U:這個(gè)是M3U8文件必須包含的標(biāo)簽窄陡,并且必須在文件的第一行,所有的M3U8文件中必須包含這個(gè)標(biāo)簽拆火。
  ? EXT-X-VERSION:M3U8文件的版本跳夭,常見的是3(目前最高版本應(yīng)該是7)。
  ?EXT-X-TARGETDURATION:該標(biāo)簽指定了單個(gè)媒體文件持續(xù)時(shí)間的最大值们镜,播放文件列表中的媒體文件在EXTINF標(biāo)簽中定義的持續(xù)時(shí)間必須小于或者等于該標(biāo)簽指定的持續(xù)時(shí)間币叹。該標(biāo)簽在播放列表文件中必須出現(xiàn)一次。
  ?EXT-X-MEDIA-SEQUENCE:M3U8直播是的直播切換序列憎账,當(dāng)播放打開M3U8時(shí)套硼,以這個(gè)標(biāo)簽的值作為參考,播放對(duì)應(yīng)的序列號(hào)的切片胞皱。
  ?EXTINF:EXTINF為M3U8列表中每一個(gè)分片的duration邪意,如上面例子輸出信息中的第一片的duration為2.969秒。在EXTINF標(biāo)簽中反砌,除了duration值雾鬼,還可以包含可選的描述信息,主要為標(biāo)注切片信息宴树,使用逗號(hào)分隔開策菜。
  ?EXT-X-DISCONTINUITY:需要特別說明的就是這個(gè)tag了,表示前一片分片和后一片分片有不連續(xù)。
  ?EXT-X-ENDLIST:若出現(xiàn)EXT-X-ENDLIST標(biāo)簽又憨,則表明M3U8文件不會(huì)再產(chǎn)生更多的切片翠霍,可以理解為該M3U8已停止更新,并且播放分片到這個(gè)標(biāo)簽后結(jié)束蠢莺。M3U8不僅僅是可以作為直播寒匙,也可以作為點(diǎn)播存在,在M3U8文件中保存所有切片信息最后使用EXT-X-ENDLIST結(jié)尾躏将,這個(gè)M3U8即為點(diǎn)播M3U8锄弱。EXT-X-ENDLIST標(biāo)簽可能會(huì)出現(xiàn)在播放列表文件的任何地方,但是不能出現(xiàn)兩次或以上祸憋。
  ?EXT-X-STREAM-INF:EXT-X-STREAM-INF標(biāo)簽出現(xiàn)在M3U8時(shí)会宪,主要是出現(xiàn)在多級(jí)M3U8文件中時(shí),例如M3U8中包含子M3U8列表蚯窥,或者主M3U8中包含多碼率M3U8時(shí)掸鹅;該標(biāo)簽后需要跟一些屬性,下面就來逐一說明一下這些屬性:
????BANDWIDTH:BANDWIDTH的值為最高碼率值沟沙,當(dāng)播放EXT-X-STREAM-INF下對(duì)應(yīng)的M3U8時(shí)占用的最大碼率(必要參數(shù))河劝。
????AVERAGE-BANDWIDTH:AVERAGE-BANDWIDTH的值為平均碼率值壁榕,當(dāng)播放EXT-X-STREAM-INF下對(duì)應(yīng)的M3U8時(shí)占用的平均碼率矛紫。(可選參數(shù))。
????CODECS:CODECS的值用于聲明EXT-X-STREAM-INF下面對(duì)應(yīng)M3U8里面的音視頻編碼牌里、視頻編碼的信息(可選參數(shù))颊咬。
????RESOLUTION:M3U8中視頻的寬高信息描述(可選參數(shù))。
????FRAME-RATE:子M3U8中的視頻幀率(可選參數(shù))牡辽。
  ?#EXT-X-KEY:表示怎么對(duì)media segments進(jìn)行解碼喳篇。其作用范圍是下次該tag出現(xiàn)前的所有media URI,格式如下:
????#EXT-X-KEY:<attribute-list>:NONE 或者 AES-128态辛。如果是NONE麸澜,則URI以及IV屬性必須不存在,如果是AES-128(Advanced EncryptionStandard)奏黑,則URI必須存在炊邦,IV可以不存在。
????對(duì)于AES-128的情況熟史,keytag和URI屬性共同表示了一個(gè)key文件馁害,通過URI可以獲得這個(gè)key,如果沒有 IV(Initialization Vector),則使用序列號(hào)作為IV進(jìn)行編解碼蹂匹,將序列號(hào)的高位賦到16個(gè)字節(jié)的buffer中碘菜,左邊補(bǔ)0;如果 有IV,則將改值當(dāng)成16個(gè)字節(jié)的16進(jìn)制數(shù)忍啸。
  ?#EXT-X-PROGRAM-DATE-TIME:將一個(gè)絕對(duì)時(shí)間或是日期和一個(gè)媒體段中的第一個(gè)sample相關(guān)聯(lián)仰坦,只對(duì)下一個(gè)meida URI有效,格式如下:
????#EXT-X-PROGRAM-DATE-TIME:<YYYY-MM-DDThh:mm:ssZ>
????For example:
????#EXT-X-PROGRAM-DATE-TIME:2010-02-19T14:54:23.031+08:00
  ?#EXT-X-ALLOW-CACHE:是否允許做cache计雌,這個(gè)可以在PlayList文件中任意地方出現(xiàn)缎岗,并且最多出現(xiàn)一次,作用效果是所有的媒體段白粉。格式如下:
????#EXT-X-ALLOW-CACHE:<YES|NO>
  ?#EXT-X-PLAYLIST-TYPE: 提供關(guān)于PlayList的可變性的信息传泊, 這個(gè)對(duì)整個(gè)PlayList文件有效,是可選的鸭巴,格式如下:
????#EXT-X-PLAYLIST-TYPE:<EVENT|VOD> :如果是VOD眷细,則服務(wù)器不能改變PlayList 文件;如果是EVENT鹃祖,則
服務(wù)器不能改變或是刪除PlayList文件中的任何部分溪椎,但是可以向該文件中增加新的一行內(nèi)容。

2. HLS 與 M3U8

??HLS(全稱:Http Live Streaming)是由Apple公司定義的用于實(shí)時(shí)流傳輸?shù)膮f(xié)議恬口,HLS基于HTTP協(xié)議實(shí)現(xiàn)校读,傳輸內(nèi)容包括兩部分,一是M3U8描述文件祖能,二是TS媒體文件歉秫。

??HLS的優(yōu)勢(shì)為:自適應(yīng)碼率流播(adaptive streaming)。效果就是客戶端會(huì)根據(jù)網(wǎng)絡(luò)狀況自動(dòng)選擇不同碼率的視頻流养铸,條件允許的情況下使用高碼率雁芙,網(wǎng)絡(luò)繁忙的時(shí)候使用低碼率,并且能夠自動(dòng)在二者之間隨意切換钞螟。這對(duì)移動(dòng)設(shè)備網(wǎng)絡(luò)狀況不穩(wěn)定的情況下保障流暢播放非常有幫助兔甘。實(shí)現(xiàn)方法是服務(wù)器端提供多碼率視頻流,并且在列表文件中注明鳞滨,播放器根據(jù)播放進(jìn)度和下載速度進(jìn)行自動(dòng)調(diào)整洞焙。

??為什么要用 TS 而不是 MP4?這是因?yàn)閮蓚€(gè) TS 片段可以無縫拼接獨(dú)立解碼拯啦,播放器能連續(xù)播放雕什,而 MP4 文件由于編碼方式的原因洼裤,兩段 MP4 不能無縫拼接,播放器連續(xù)播放兩個(gè) MP4 文件會(huì)出現(xiàn)破音和畫面間斷,影響用戶體驗(yàn)渺杉。而且如果要在一段長達(dá)一小時(shí)的視頻中跳轉(zhuǎn)音半,如果使用單個(gè) MP4 格式的視頻文件琴儿,并且也是用 HTTP 協(xié)議孕索,那么需要代理服務(wù)器支持 HTTP range request 獲取大文件中的一部分夯巷。這樣的話,對(duì)于代理服務(wù)器的性能來說要求較高哀墓。而 HTTP Live Streaming 則只需要根據(jù)列表文件中的時(shí)間軸找出對(duì)應(yīng)的 TS 片段下載即可趁餐,不需要 range request,對(duì)代理服務(wù)器的要求小很多篮绰。所有代理服務(wù)器都支持小文件的高效緩存后雷。

mp4格式轉(zhuǎn)換為ts格式

如果是mp4格式,則可以通過ffmpeg轉(zhuǎn)換為ts格式吠各,命令如下所示:


ffmpeg -i output20.mp4 -codec copy  -hls_list_size 0  -hls_wrap 0 -strict -2  -vbsf h264_mp4toannexb -absf aac_adtstoasc -f hls -hls_base_url https://test.com/ test.m3u8

命令參數(shù)說明:
  ? -hls_time n: 設(shè)置每片的長度臀突,默認(rèn)值為2。單位為秒贾漏。即EXTINF tag對(duì)應(yīng)的值候学。hls_time設(shè)置后效果不一定準(zhǔn)確,會(huì)受到關(guān)鍵幀大小及其他因素影響纵散。如果需要相對(duì)非常準(zhǔn)確的切片梳码,可以添加hls_flags的子參數(shù)split_by_time來保證生成的切片能夠與hls_time設(shè)置的切片時(shí)長差不多。split_by_time參數(shù)必須與hls_time配合使用伍掀,并且使用split_by_time參數(shù)有可能會(huì)影響首畫面體驗(yàn)掰茶,例如花屏或者首畫面顯示慢的問題,因?yàn)橐曨l的第一幀不一定是關(guān)鍵幀蜜笤。
  ? -hls_list_size n:設(shè)置播放列表保存的最多條目濒蒋,設(shè)置為0會(huì)保存有所片信息,默認(rèn)值為5瘩例。為了解決這個(gè)問題啊胶,需要指定參數(shù)-hls_list_size 0甸各,這樣就能包含所有的片段垛贤。
  ? -hls_wrap n:設(shè)置多少片之后開始覆蓋,如果設(shè)置為0則不會(huì)覆蓋趣倾,默認(rèn)值為0.這個(gè)選項(xiàng)能夠避免在磁盤上存儲(chǔ)過多的 片聘惦,而且能夠限制寫入磁盤的最多的片的數(shù)量。
  ? -hls_start_number n:設(shè)置播放列表中sequence number的值為number儒恋,默認(rèn)值為0善绎。注意:播放列表的sequence number 對(duì)每個(gè)segment來說都必須是唯一的,而且它不能和片的文件名(當(dāng)使用wrap選項(xiàng)時(shí)诫尽,文件名有可能會(huì)重復(fù)使用)混淆禀酱。
  ?h264_mp4toannexb: h264有兩種封裝,一種是annexb模式牧嫉,傳統(tǒng)模式剂跟,有startcode减途,SPS和PPS是在ES中,vlc里打開編碼器信息中顯示h264曹洽;一種是mp4模式鳍置,一般mp4 ,mkv會(huì)有送淆,沒有startcode税产,SPS和PPS以及其它信息被封裝在container中,每一個(gè)frame前面是這個(gè)frame的長度,vlc里打開編碼器信息中顯示avc1偷崩。很多解碼器只支持annexb這種模式辟拷,因此需要將mp4做轉(zhuǎn)換。
  ?aac_adtstoasc:將AAC編碼器編碼后的原始碼流(ADTS頭 + ES流)封裝為MP4或者FLV或者M(jìn)OV等格式時(shí)阐斜,需要先將ADTS頭轉(zhuǎn)換為MPEG-4 AudioSpecficConfig (將音頻相關(guān)編解碼參數(shù)提取出來)梧兼,并將原始碼流中的ADTS頭去掉(只剩下ES流);相反智听,從MP4或者FLV或者M(jìn)OV等格式文件中解封裝出AAC碼流(只有ES流)時(shí)羽杰,需要在解析出的AAC碼流前添加ADTS頭(含音頻相關(guān)編解碼參數(shù))。
  ?hls_base_url 參數(shù)用于為M3U8列表的文件路徑設(shè)置前置基本路徑參數(shù)到推,因?yàn)樵贔Fmpeg中生成M3U8時(shí)寫入的TS切片路徑默認(rèn)為M3U8生成的路徑相同考赛,但是實(shí)際上TS所存儲(chǔ)的路徑既可以為本地絕對(duì)路徑,也可以為相對(duì)路徑莉测,還可以為網(wǎng)絡(luò)路徑颜骤,因此使用hls_base_url參數(shù)可以達(dá)到該效果。

ts格式拼接命令


ffmpeg -i 1.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 1.ts
ffmpeg -i 2.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 2.ts
ffmpeg -i "concat:1.ts|2.ts" -acodec copy -vcodec copy -absf aac_adtstoasc output.mp4

歡迎關(guān)注公眾號(hào)“音視頻開發(fā)之旅”捣卤,一起學(xué)習(xí)成長忍抽。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市董朝,隨后出現(xiàn)的幾起案子鸠项,更是在濱河造成了極大的恐慌,老刑警劉巖子姜,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件祟绊,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡哥捕,警方通過查閱死者的電腦和手機(jī)牧抽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來遥赚,“玉大人扬舒,你說我怎么就攤上這事≠旆穑” “怎么了讲坎?”我有些...
    開封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵泽腮,是天一觀的道長。 經(jīng)常有香客問我衣赶,道長诊赊,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任府瞄,我火速辦了婚禮碧磅,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘遵馆。我一直安慰自己鲸郊,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開白布货邓。 她就那樣靜靜地躺著秆撮,像睡著了一般。 火紅的嫁衣襯著肌膚如雪换况。 梳的紋絲不亂的頭發(fā)上职辨,一...
    開封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音戈二,去河邊找鬼舒裤。 笑死,一個(gè)胖子當(dāng)著我的面吹牛觉吭,可吹牛的內(nèi)容都是我干的腾供。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼鲜滩,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼伴鳖!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起徙硅,我...
    開封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤榜聂,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后闷游,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體峻汉,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年脐往,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片扳埂。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡业簿,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出阳懂,到底是詐尸還是另有隱情梅尤,我是刑警寧澤柜思,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站巷燥,受9級(jí)特大地震影響赡盘,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜缰揪,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一陨享、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧钝腺,春花似錦抛姑、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至毫目,卻和暖如春蔬啡,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背镀虐。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來泰國打工星爪, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人粉私。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓顽腾,卻偏偏與公主長得像,于是被迫代替她去往敵國和親诺核。 傳聞我的和親對(duì)象是個(gè)殘疾皇子抄肖,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

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