原文:https://blog.csdn.net/uyy203/article/details/79283087
視頻封裝格式是指視頻數(shù)據(jù)如何存儲的殃姓,視頻編碼格式是指原始視頻數(shù)據(jù)如何編碼為二進(jìn)制數(shù)據(jù)碼流。編碼后的視頻數(shù)據(jù)最終通過視頻封裝格式存儲為視頻文件碘饼。
本文對視頻封裝格式MP4做一些介紹。主要介紹了Atom結(jié)構(gòu)和Atom中數(shù)據(jù)的意義。
一、MP4封裝格式
ISO/IEC 14496-12(MPEG-4 Part 12 ISO base media file format)定義了一種通用的數(shù)字媒體文件格式標(biāo)準(zhǔn),其基礎(chǔ)是2001年版的Apple QuickTime文件格式趁冈。
ISO/IEC 14496-14標(biāo)準(zhǔn)中定義了ISO/IEC 14496-12的一種多媒體容器格式實現(xiàn),即我們現(xiàn)在熟知的MP4(MPEG-4 Part 14)唐础,它屬于MPEG-4的一部分箱歧。
MP4文件由若干稱為Atom(或稱為box)的數(shù)據(jù)對象組成矾飞,每個Atom的起首為四個字節(jié)的數(shù)據(jù)長度(Big Endian)和四個字節(jié)的類型標(biāo)識一膨,數(shù)據(jù)長度和類型標(biāo)志都可以擴(kuò)展。Atom可以嵌套洒沦,即其數(shù)據(jù)域可以由若干其它Atom組成豹绪,從而實現(xiàn)結(jié)構(gòu)化的數(shù)據(jù)。
MP4是一種描述較為全面的容器格式申眼,被認(rèn)為可以在其中嵌入任何形式的數(shù)據(jù)瞒津,包括各種編碼的視頻、音頻括尸,我們常見的大部分的MP4文件存放的AVC(H.264)或MPEG-4(Part 2)編碼的視頻和AAC編碼的音頻巷蚪。
MP4格式的官方文件后綴名是“.mp4”,還有其他的以mp4為基礎(chǔ)進(jìn)行的擴(kuò)展或者是縮水版本的格式濒翻,包括:M4V, 3GP, F4V等啦膜。
說明:
QuickTime影片格式是Apple公司開發(fā)的一種音頻、視頻文件格式淌喻,用于存儲常用數(shù)字媒體類型僧家。其擴(kuò)展名為.mov。
二裸删、MP4文件結(jié)構(gòu)
MP4是由Atom嵌套來存放媒體信息八拱。Atom的基本結(jié)構(gòu)是:
[4bytes atom length] [4bytes atom name] [8bytes largesize, if size ==1] [contents of the atom, if any]
結(jié)構(gòu)如圖:
SIZE表示整個Atom所占用的大小,包括header部分涯塔。如果Atom很大肌稻,超過了uint32的最大數(shù)值(例如存放具體視頻數(shù)據(jù)的mdat),size就被設(shè)置為1匕荸,并用接下來的LARGESIZE來存放數(shù)據(jù)大小灯萍。
TYPE表示這個Atom的類型,主要有ftyp每聪、moov旦棉、mdat等。
LARGESIZE药薯,如果SIZE==1绑洛,則使用8bytes uint64來存儲該Atom大小。
DATA是實際的數(shù)據(jù)童本。
MP4文件含有很多Atom真屯,主要的Atom和嵌套結(jié)構(gòu)如圖。
三穷娱、一個典型的MP4文件實例
MP4文件需要有ftyp绑蔫、moov、mdat泵额,它們都是頂級Atom配深,不能被其他Atom嵌套。
ftyp標(biāo)示了MP4文件嫁盲,必須出現(xiàn)在第一個篓叶。
moov保存了視頻的基本信息,mdat保存視頻和音頻數(shù)據(jù)羞秤。這兩個Atom順序不固定缸托。
一個moov在mdat之后的MP4文件的Atom結(jié)構(gòu):
由于moov中保存了視頻數(shù)據(jù)的索引,對于在線播放的場景瘾蛋,需要moov在mdat之前俐镐,才能流式讀取視頻數(shù)據(jù)。
部分?jǐn)z像設(shè)備生成的MP4文件中哺哼,moov在mdat之前佩抹,兩者之間可能還存在一個Atom free奇唤,即moov-free-mdat。
free中為全0匹摇,只是用于占位咬扇。
一個moov在mdat之前的MP4文件的Atom結(jié)構(gòu):
四、ATOM說明
1廊勃、FTYP
ftyp是整個文件的第一個Atom懈贺,通過判斷該Atom來確定文件的類型。該Atom有且只有1個坡垫,并且只能被包含在文件層梭灿,而不能被其他Atom包含。該Atom應(yīng)該被放在文件的最開始冰悠,指示文件的相關(guān)信息堡妒。
文件的最開始的四個字節(jié)就是“ftyp”Atom的大小,然后是該Atom的類型溉卓。 “ftyp”的body依次包括1個32位的major brand(4個字符)皮迟,1個32位的minor version(整數(shù))和1個以32位(4個字符)為單位元素的數(shù)組compatible brands。這些都是用來指示文件應(yīng)用級別的信息桑寨。以一個MP4文件的“ftyp”Atom為例伏尼,如下所示:
0000000: 0000 0018 6674 7970 6d70 3432 0000 0000 ....ftypmp42....
0000010: 6d70 3432 6d70 3431 0528 834f 6d64 6174 mp42mp41.(.Omdat
其中,
(1)0x00 00 00 18是“ftyp”Atom的大小尉尾,為24個字節(jié)爆阶,這在一般情況下為一個固定值。
(2)0x66 74 79 70是“ftyp”四個字符的ASCII值沙咏,也就是該Atom的類型辨图。
(3)0x6D 70 34 32是major brand,這里為“mp42”肢藐,對于不同的文件故河,該值可能是不一樣的。
(4)0x00 00 00 00是minor version窖壕。
(5)0x6D 70 34 32和0x6D 70 34 31是compatible brands忧勿,”mp42”和“mp41”
FTYP到底是什么呢杉女?
ftyp就是一個由四個字符組成的碼字瞻讽,用來標(biāo)識編碼類型、兼容性或者媒體文件的用途熏挎。它存在于MP4文件和MOV文件中速勇,當(dāng)然,也存在于3GP文件中坎拐。
雖然MP4文件烦磁、MOV文件和3GP文件采用了相同的封裝標(biāo)準(zhǔn)养匈,但由于是由不同的廠商合成,因此還是存在差別的都伪。即使是同一種媒體文件呕乎,比如MP4文件,由不同developers開發(fā)的MP4也是存在差別的陨晶。ftyp簡單的說就是為了標(biāo)識它的developer是誰猬仁,兼容哪些標(biāo)準(zhǔn)等。
比如上面的例子先誉,“mp42”表示它的major brand是MP4 v2 [ISO 14496-14]湿刽,而“mp42”和“mp41”則表示它的compatible brands是MP4 v2 [ISO 14496-14]和MP4 v1 [ISO 14496-1:ch13]。
2褐耳、FREE
free是可選的诈闺,如果存在,則通常出現(xiàn)在moov與mdat之間铃芦,即moov-free-mdat雅镊。
free中的數(shù)據(jù)通常為全0,其作用相當(dāng)于占位符刃滓,在實時拍攝視頻漓穿,moov數(shù)據(jù)增多時分配給moov使用。
因為設(shè)備錄制視頻時并不能預(yù)先知道視頻數(shù)據(jù)大小注盈,如果moov在mdat之前晃危,隨著拍攝mdat的數(shù)據(jù)會增加,moov數(shù)據(jù)也會增多老客,如果沒有free預(yù)留的空間僚饭,則要不停的向后移動mdat數(shù)據(jù)以騰出moov空間。
3胧砰、MOOV
moov中主要保存了媒體的時間信息鳍鸵、trak信息和媒體索引等。
3.1 媒體時間信息
moov-mvhd中有一個time scale尉间,以1/n秒的形式給出一個總的時間粒度偿乖,moov-trak-tkhd中以此時間粒度給出各個track的duration;
3.2 trak信息
moov中通常包含兩個trak哲嘲,一個視頻索引贪薪,一個音頻索引。
3.2.1 trak類型
trak的類型在moov-trak-mdia-hdlr中給出眠副,包括’vide’, ‘soun’和’hint’三種画切。
3.2.2 trak的時間
moov-trak-mdia-mdhd中以1/n秒的形式給出各個媒體的時間粒度以及以此時間粒度為單位的duration。
moov-trak-mdia-minf-stbl-stts中有媒體幀之間的時間間隔囱怕,單位是moov-trak-tkhd中的時間粒度霍弹。
3.2.3 索引信息
moov-trak-mdia-minf-stbl比較重要毫别,其中保存了解碼器需要的信息和索引信息,以下Atom都是stbl Atom的孩子典格。
stsd中保存了解碼器需要的媒體描述信息岛宦。
stss, Sync Sample Atom
標(biāo)識了媒體流中的關(guān)鍵幀,提供了隨機(jī)訪問點耍缴。每個entry標(biāo)識了一個關(guān)鍵幀恋博。
關(guān)鍵幀號是按照增長順序排列的。如果該Atom不存在私恬,表示所有幀都是關(guān)鍵幀债沮。
Sync Sample Table的布局
stts, Time-To-Sample Atoms
stts給出每個數(shù)據(jù)幀之間的時間間隔,單位是moov-trak-tkhd中的時間粒度本鸣。
Atom的每個entry給出了具有相同時間間隔的連續(xù)幀的個數(shù)疫衩,這些幀的時間間隔值,結(jié)構(gòu)如圖荣德。
Time-To-Sample的table entry布局
如果連續(xù)的幀有相同的時長闷煤,他們會被放在同一個entry中。如果所有的幀具有相同的時長涮瞻,那么Atom中就只有一個entry鲤拿。
stts實例
下圖通過3個entries來描述9個幀。需要說明的是署咽,這里的entry和chunk不是對應(yīng)的近顷。例如,4宁否、5窒升、6幀可以在同一個chunk中,但是慕匠,由于它們的時長不同饱须,4幀的時長為3,而5台谊、6幀的時長為1蓉媳,因此,保存在不同的entry中锅铅。
stco/co64, Chunk Offset Atom
stco/co64給出每個數(shù)據(jù)Chunk在文件中的偏移酪呻。Chunk Offset Atom的每個entry給出了每個chunk在文件中的偏移。
如果Chunk Offset Atom的類型為stco狠角,則保存的偏移量是32位号杠;如果是co64,則保存的偏移量是64位的丰歌。布局如圖姨蟋。
chunk offset table的布局
需要注意的是,該Atom中只給出了每個chunk的偏移量立帖,并沒有給出每個sample的偏移量眼溶。因此,如果要獲得每個sample的偏移量晓勇,還需要用到Sample Size Table和Sample-To-Chunk Table堂飞。
stsc, Sample-To-Chunk Atom
stsc給出各個數(shù)據(jù)Chunk中包含的數(shù)據(jù)幀。一個chunk可能會包含一個或者幾個幀绑咱。每個chunk會有不同的size绰筛,每個chunk中的幀也會有不同的size。
entry中保存了第一個chunk號描融、每個chunk包含的幀數(shù)铝噩、幀描述ID。
Sample-To-Chunk Atom的table entry布局
每個entry包含一組chunk窿克,其中每個chunk的幀數(shù)相同骏庸。而且,這些chunk中的每個幀都必須使用相同的幀描述年叮。
如果chunk中的幀數(shù)或者幀描述改變具被,必須創(chuàng)建一個新的entry。
如果所有的chunk包含的幀數(shù)和幀描述相同只损,那么只有一個entry一姿。
stsc實例
圖中表示至少有5個chunk,第1跃惫、2個chunk分別包含3個幀啸蜜,幀描述ID是23;第3辈挂、4個chunk分別包含1個幀衬横,幀描述ID是23;第5個及以后的chunk终蒂,包含1個幀蜂林,幀描述ID是24。
對于最后一個entry需要特殊的處理拇泣,因為無法判斷什么時候結(jié)束噪叙。
stsz, Sample Size Atom
sample size table的布局
3.3 用戶定義數(shù)據(jù)
udta中保存了用戶定義數(shù)據(jù),例如iTune使用的meta數(shù)據(jù)就保存在udta中霉翔。
3.4 用戶擴(kuò)展數(shù)據(jù)
Atom的擴(kuò)展通過uuid實現(xiàn)睁蕾。用戶可以使用類型為’uuid’的Atom,以16個特定的字節(jié)作為標(biāo)識,定義自己的數(shù)據(jù)格式子眶。
4瀑凝、MDAT
所有媒體數(shù)據(jù)統(tǒng)一存放在mdat中,沒有同步字臭杰,沒有分隔符粤咪,只能根據(jù)索引進(jìn)行訪問。
mdat的位置比較靈活渴杆,可以位于moov之前寥枝,也可以位于moov之后,但必須和stbl中的信息保持一致磁奖。
另外囊拜,在寫mp4文件的時候,對于mdat這個Atom比搭,一般是先將Atom size填寫0冠跷,待數(shù)據(jù)寫完之后,再回過來填入具體大小敢辩。
5蔽莱、其他ATOM
5.1、THMB
Atom moov @ 13840405 of size: 355190, ends @ 14195595
…….
Atom udta @ 14146330 of size: 49265, ends @ 14195595
Atom thmb @ 14146338 of size: 49197, ends @ 14195535
Atom cprt [zho] @ 14195535 of size: 30, ends @ 14195565
Atom perf [zho] @ 14195565 of size: 30, ends @ 14195595
thmb 結(jié)構(gòu):
atom size (49197)
atom type (thmb)
thmb size (0)
thmb type (jpeg)
thmb data
五戚长、實際應(yīng)用場景
1盗冷、把文件尾部的moov移到文件頭
對于流媒體播放,如果mdat的位置在moov之前同廉,通過流的方式播放文件會出現(xiàn)問題仪糖,因為沒有辦法在一開始就獲得文件的媒體信息和索引。
這種情況需要對視頻做預(yù)處理迫肖,把moov移動到文件頭锅劝。通過遍歷Atom可以很容易找到moov Atom。
需要注意的是蟆湖,移動moov到文件頭故爵,同時需要修改moov中的stco/co64。因為這里保存了chunk數(shù)據(jù)的偏移量隅津,移動moov后诬垂,需要根據(jù)moov的新位置更新stco/co64 。
stco/co64的結(jié)構(gòu)如下:
可參考 python開源庫 qtfaststart伦仍。
2结窘、分割MP4文件
在視頻點播服務(wù)中,需要將MP4文件分割為多個分片充蓝,此時需要獲取關(guān)鍵幀隧枫、切割時間軸喉磁、更新moov和生成各個分片文件。
可參考 http://www.cnblogs.com/haibindev/archive/2011/10/17/2214518.html
附 查看Atom相關(guān)工具
Windows:mp4info官脓,解析和用樹形顯示文件的atom
Linux:AtomicParsley协怒,C++編寫,解析文件的atom
附錄: ISO/IEC 14496 MPEG的協(xié)議標(biāo)準(zhǔn)
ISO/IEC 14496是MPEG專家組制定的MPEG-4標(biāo)準(zhǔn)于1998年10月公布第1版确买,1999年1月成為國際標(biāo)準(zhǔn)斤讥,1999年12月公布了第2版纱皆,2000年初成為國際標(biāo)準(zhǔn)湾趾。
全文分為27個部分:
(1)ISO/IEC 14496-1系統(tǒng)部分,描述視頻和音頻數(shù)據(jù)流的控制派草、同步以及混合方式(即混流 Multiplexing搀缠,簡寫為MUX)。
(2)ISO/IEC 14496-2視頻部分近迁,定義了一個對各種視覺信息(包括自然視頻艺普、靜止紋理、計算機(jī)合成圖形等等)的編解碼器鉴竭。(例如XviD編碼就屬于MPEG-4 Part 2)歧譬。
(3)ISO/IEC 14496-3音頻部分,定義了一個對各種音頻信號進(jìn)行編碼的編解碼器的集合搏存。包括高級音頻編碼(Advanced Audio Coding瑰步,縮寫為AAC)的若干變形和其他一些音頻/語音編碼工具。
(4)ISO/IEC 14496-4一致性部分璧眠,定義了比特流和設(shè)備的一致性條件缩焦,用來測試MPEG-4的實現(xiàn)。
(5)ISO/IEC 14496-5參考軟件责静,提供了用于演示功能和說明本標(biāo)準(zhǔn)其他部分功能的軟件袁滥。
(6)ISO/IEC 14496-6多媒體傳送整體框架DMIF,這是MPEG-4應(yīng)用層與傳輸網(wǎng)絡(luò)的接口灾螃,定義了通信協(xié)議题翻,使MPEG-4系統(tǒng)的數(shù)據(jù)流能進(jìn)入各種傳輸網(wǎng)絡(luò)。還包含一個存儲格式MP4腰鬼,用于存儲編碼的場景嵌赠。
(7) ISO/IEC 14496-7優(yōu)化的參考軟件,提供了對實現(xiàn)進(jìn)行優(yōu)化的例子(這里的實現(xiàn)指的是第五部分)垃喊。
(8)ISO/IEC 14496-8在IP網(wǎng)絡(luò)上傳輸猾普,定義了在IP網(wǎng)絡(luò)上傳輸MPEG-4內(nèi)容的方式。
(9)ISO/IEC 14496-9參考硬件描述本谜,提供了用于演示怎樣在硬件上實現(xiàn)本標(biāo)準(zhǔn)其他部分功能的硬件設(shè)計方案
(10)ISO/IEC 14496-10高級視頻編碼AVC初家,定義了一個視頻編解碼器(codec)。AVC和XviD都屬于MPEG-4編碼,但由于AVC屬于MPEG-4 Part 10溜在,在技術(shù)特性上比屬于MPEG-4 Part2的XviD要先進(jìn)陌知。另外,它和ITU-T H.264標(biāo)準(zhǔn)是一致的掖肋,故又稱為H.264仆葡。
(11)ISO/IEC 14496-11場景描述和應(yīng)用引擎。
(12)ISO/IEC 14496-12ISO媒體文件格式志笼,定義了一個存儲媒體內(nèi)容的文件格式沿盅。
(13)ISO/IEC 14496-13知識產(chǎn)權(quán)管理和保護(hù)(IPMP:Intellectual Property Management and Protection)擴(kuò)展。
(14)ISO/IEC 14496-14MP4文件格式纫溃,定義了基于第十二部分的用于存儲MPEG-4內(nèi)容的容器文件格式腰涧。
(15)ISO/IEC 14496-15AVC文件格式,定義了基于第十二部分的用于存儲第十部分的視頻內(nèi)容的文件格式紊浩。
(16)ISO/IEC 14496-16動畫框架擴(kuò)展AFX(Animation Framework eXtension)窖铡。
(17)ISO/IEC 14496-17同步文本字幕格式。
(18)ISO/IEC 14496-18字體壓縮和流式傳輸(針對公開字體格式)坊谁。
(19)ISO/IEC 14496-19合成材質(zhì)流(Synthesized Texture Stream)费彼。
(20)ISO/IEC 14496-20簡單場景表示(LASeR for Lightweight Scene Representation)。
(21)ISO/IEC 14496-21用于描繪(Rendering)的MPEG-J拓展口芍。
(22)ISO/IEC 14496-22開放字體格式(Open Font Format)箍铲。
(23)ISO/IEC 14496-2符號化音樂表示(Symbolic Music Representation)。
(24)ISO/IEC 14496-24音頻與系統(tǒng)交互作用(Audio and systems interaction)阶界。
(25)ISO/IEC 14496-253D圖形壓縮模型(3D Graphics Compression Model)虹钮。
(26)ISO/IEC 14496-26音頻一致性檢查:定義了測試音頻數(shù)據(jù)與ISO/IEC 14496-3是否一致的方法(Audio conformance)。
(27)ISO/IEC 14496-273D圖形一致性檢查:定義了測試3D圖形數(shù)據(jù)與ISO/IEC 14496-11:2005, ISO/IEC 14496-16:2006, ISO/IEC 14496-21:2006, 和 ISO/IEC 14496-25:2009是否一致的方法(3D Graphics conformance)膘融。
參考
http://blog.csdn.net/yu_yuan_1314/article/details/9406587
http://m.blog.chinaunix.net/uid-26009923-id-5702652.html
視頻格式說明
http://www.zhihu.com/question/20997688
atom說明
http://wiki.multimedia.cx/?title=QuickTime_container
http://atomicparsley.sourceforge.net/mpeg-4files.html
http://www.ftyps.com/what.html
http://blog.csdn.net/yu_yuan_1314/article/details/9366703
http://blog.csdn.net/yu_yuan_1314/article/details/9078287
開源庫
qtfaststart python編寫的芙粱,如果moov在文件尾部,移動到文件頭部
https://github.com/danielgtaylor/qtfaststart.git