“本文轉(zhuǎn)載自:
1.[小夕nike]MP4 封裝格式
2.[weixin_41422027] 音視頻封裝:MP4結(jié)構(gòu)概述和分析工具推薦"
本文相關(guān)系列:
1.MP4格式概述
1.1 簡介
??MP4或稱MPEG-4第14部分(MPEG-4 Part 14)是一種標(biāo)準(zhǔn)的數(shù)字多媒體容器格式骗露。擴(kuò)展名為.mp4只祠。雖然被官方標(biāo)準(zhǔn)定義的唯一擴(kuò)展名是.mp4导街,但第三方通常會使用各種擴(kuò)展名來指示文件的內(nèi)容:
- 同時(shí)擁有音頻視頻的MPEG-4文件通常使用標(biāo)準(zhǔn)擴(kuò)展名.mp4;
- 僅有音頻的MPEG-4文件會使用.m4a擴(kuò)展名。
??大部分?jǐn)?shù)據(jù)可以通過專用數(shù)據(jù)流嵌入到MP4文件中绎晃,因此MP4文件中包含了一個(gè)單獨(dú)的用于存儲流信息的軌道。目前得到廣泛支持的編解碼器或數(shù)據(jù)流格式有:
- 視頻格式:H.264/AVC、H.265/HEVC姜骡、VP8/9等
- 音頻格式:AAC、MP3屿良、Opus等
1.2 術(shù)語
??為了后面能比較規(guī)范的了解這種文件格式圈澈,這里需要了解下面幾個(gè)概念和術(shù)語,這些概念和術(shù)語是理解好MP4媒體封裝格式和其操作算法的關(guān)鍵尘惧。
(1)Box
??這個(gè)概念起源于QuickTime中的atom康栈,也就是說MP4文件就是由一個(gè)個(gè)Box組成的,可以將其理解為一個(gè)數(shù)據(jù)塊喷橙,它由Header+Data組成啥么,Data 可以存儲媒體元數(shù)據(jù)和實(shí)際的音視頻碼流數(shù)據(jù)。Box里面可以直接存儲數(shù)據(jù)塊但是也可以包含其它類型的Box贰逾,我們把這種Box又稱為container box悬荣。
(2)Sample
??簡單理解為采樣,對于視頻可以理解為一幀數(shù)據(jù)疙剑,音頻一幀數(shù)據(jù)就是一段固定時(shí)間的音頻數(shù)據(jù)氯迂,可以由多個(gè)Sample數(shù)據(jù)組成,簡而言之:存儲媒體數(shù)據(jù)的單位是sample言缤。
(3)Track
??表示一些sample的集合嚼蚀,對于媒體數(shù)據(jù)而言就是一個(gè)視頻序列或者音頻序列,我們常說的音頻軌和視頻軌可以對照到這個(gè)概念上管挟。當(dāng)然除了Video Track和Audio Track還可以有非媒體數(shù)據(jù)轿曙,比如Hint Track,這種類型的Track就不包含媒體數(shù)據(jù)僻孝,可以包含一些將其他數(shù)據(jù)打包成媒體數(shù)據(jù)的指示信息或者字幕信息拳芙。簡單來說:Track 就是電影中可以獨(dú)立操作的媒體單位。
(4)Chunk
??一個(gè)track的連續(xù)幾個(gè)sample組成的單元被稱為chunk皮璧,每個(gè)chunk在文件中有一個(gè)偏移量舟扎,整個(gè)偏移量從文件頭算起,在這個(gè)chunk內(nèi)悴务,sample是連續(xù)存儲的睹限。
??這樣就可以理解為MP4文件里面有多個(gè)Track,一個(gè)Track又是由多個(gè)Chunk組成譬猫,每個(gè)Chunk里面包含著一組連續(xù)的Sample,正是因?yàn)槎x了上述幾個(gè)概念羡疗,MP4這種封裝格式才容易實(shí)現(xiàn)靈活染服、高效、開放的特性叨恨,所以要仔細(xì)理解柳刮。
2.MP4整體結(jié)構(gòu)
2.1 MP4結(jié)構(gòu)概覽
??MP4格式是一個(gè)box的格式,box容器套box子容器痒钝,box子容器再套box子容器秉颗。
一個(gè)box由兩部分組成:box header、box body送矩。
- box header:box的元數(shù)據(jù)蚕甥,比如box type、box size栋荸。
- box body:box的數(shù)據(jù)部分菇怀,實(shí)際存儲的內(nèi)容跟box類型有關(guān),比如mdat中body部分存儲的媒體數(shù)據(jù)晌块。
??box header中爱沟,只有type、size是必選字段匆背。當(dāng)size==1時(shí)呼伸,存在largesize字段。如果size==0靠汁,表示該box為文件的最后一個(gè)box蜂大。在部分box中闽铐,還存在version蝶怔、flags字段,這樣的box叫做Full Box兄墅。當(dāng)box body中嵌套其他box時(shí)踢星,這樣的box叫做container box。
mp4box 圖示如下:
其中: - ftyp(file type box):文件頭隙咸,記錄一些兼容性信息
- moov(movie box):記錄媒體信息
- mdat(media data):媒體負(fù)載
完整的Box結(jié)構(gòu):
每個(gè)Box承載的數(shù)據(jù)內(nèi)容如下:
2.2 Box結(jié)構(gòu)
??mp4 封裝格式采用稱為 box 的結(jié)構(gòu)來組織數(shù)據(jù)沐悦。結(jié)構(gòu)如下:
+-+-+-+-+-+-+-+-+-+-+
| header | body |
+-+-+-+-+-+-+-+-+-+-+
其它所有 box 都在語法上繼承自此基本 box 結(jié)構(gòu)。
2.2.1 box header
??box 分為普通 box 和 fullbox五督。
(1)普通 box header 結(jié)構(gòu)如下:
字段 | 類型 | 描述 |
---|---|---|
size | 4 Bytes | 包含 box header 的整個(gè) box 的大小 |
type | 4 Bytes | 4 個(gè) ascii 值藏否,如果是 "uuid",則表示此 box 為用戶自定義充包,可忽略 |
large size | 8 Bytes | size=1 時(shí)才有的字段副签,用于擴(kuò)展遥椿,例如 mdat box 會需要此字段 |
(2)fullbox 在上面的基礎(chǔ)上新增了 2 個(gè)字段:
字段 | 類型 | 描述 |
---|---|---|
version | 1 Bytes | 版本號 |
flags | 3 Bytes | 標(biāo)識 |
2.2.2 box body
??一個(gè)box可能會包含其它多個(gè)box,此種box稱為container box淆储。因此box body可能是一種具體box類型冠场,也有可能是其它box。
??雖然Box的類型非常多本砰,大概有70多種碴裙,但是并不是都是必須的,一般的MP4文件都是含有必須的Box和個(gè)別非必須Box点额,我用MP4info這種工具分析了一首MP4的文件舔株,具體的Box顯示如下:
??通過上述工具分析出來的結(jié)果,我們大概可以總結(jié)出MP4以下幾個(gè)特點(diǎn):
- MP4文件就是由一個(gè)個(gè)Box組成咖楣,其中Box還可以相互嵌套督笆,排列緊湊沒有多的冗余數(shù)據(jù);
- Box類型并沒有很多诱贿,主要是由必須的ftyp娃肿、moov、mdat組成珠十,還有free料扰,udta非必須box組成即去掉這兩種box對于播放音視頻也沒有啥影響。
- Moov一般存儲媒體元數(shù)據(jù)焙蹭,比較復(fù)雜嵌套層次比較深晒杈,后面會詳細(xì)解釋各個(gè)box的字段含義和組成。
2.3 ftyp(File Type Box)
??ftyp 一般出現(xiàn)在文件的開頭孔厉,用來指示該 mp4 文件使用的標(biāo)準(zhǔn)規(guī)范:
字段 | 類型 | 描述 |
---|---|---|
major_brand | 4 bytes | 主版本 |
minor_version | 4 bytes | 次版本 |
compatible_brands[] | 4 bytes | 指定兼容的版本拯钻,注意此字段是一個(gè) list,即可以包含多個(gè) 4 bytes 版本號 |
一個(gè)示例如下:
2.4 moov(Movie Box)
- moov是一個(gè)container box撰豺,一個(gè)文件只有一個(gè)粪般,其包含的所有box用于描述媒體信息(metadata)。
- moov的位置可以緊隨著 ftyp 出現(xiàn)污桦,也可以出現(xiàn)在文件末尾亩歹。
- 由于是一個(gè) container box,所以除了 box header凡橱,其 box body 就是其它的 box小作。
子Box:
- mvhd(moov header):用于簡單描述一些所有媒體共享的信息。
- trak:即 track稼钩,軌道顾稀,用于描述音頻流或視頻流信息,可以有多個(gè)軌道坝撑,如上出現(xiàn)了 2 次静秆,分別表示一路音頻和一路視頻流氮块。
- udta(user data):用戶自定義,可忽略诡宗。
一個(gè)示例如下:
(1)結(jié)構(gòu)
(2)數(shù)據(jù)
(3)成分
子Box:mvhd
??用于簡單描述一些所有媒體共享的信息滔蝉。
子Box:trak
??track,軌道塔沃,用于描述音頻流或視頻流信息蝠引,可以有多個(gè)軌道,如上出現(xiàn)了 2 次蛀柴,分別表示一路音頻和一路視頻流螃概。
2.5 mvhd(Movie Header Box)
??mvhd 作為媒體信息的 header 出現(xiàn)(注意此header不是box header,而是moov媒體信息的header)鸽疾,用于描述一些所有媒體共享的基本信息吊洼。
??mvhd 語法繼承自fullbox,注意下述示例出現(xiàn)的version和flags字段屬于fullbox header制肮。
Box Body:
2.6 trak(track)
- trak box 是一個(gè) container box冒窍,其子 box 包含了該 track 的媒體信息。
- 一個(gè) mp4 文件可以包含多個(gè) track豺鼻,track之間是獨(dú)立的综液,trak box 用于描述每一路媒體流。
- 一般情況下有兩個(gè)trak儒飒,分別對應(yīng)音頻流和視頻流谬莹。
一個(gè)示例如下:
其中:
- tkhd(track header box):用于簡單描述該路媒體流的信息,如時(shí)長桩了,寬度等附帽。
- mdia(media box):用于詳細(xì)描述該路媒體流的信息
- edts(edit Box):子Box為elst(Edit List Box),它的作用是使某個(gè)track的時(shí)間戳產(chǎn)生偏移井誉。
2.7 tkhd(track header box)
- tkhd 作為媒體信息的header出現(xiàn)(注意此 header 不是 box header蕉扮,而是 track 媒體信息的 header),用于描述一些該track的基本信息送悔。
- tkhd語法繼承自fullbox慢显,注意下述示例出現(xiàn)的version和flags 字段屬于fullbox header爪模。
Box Body:
2.8 edts(edit Box)
??它下邊有一個(gè)elst(Edit List Box)欠啤,它的作用是使某個(gè)track的時(shí)間戳產(chǎn)生偏移∥莨啵看一下一些字段:
- segment_duration: 表示該edit段的時(shí)長洁段,以Movie Header Box(mvhd)中的timescale為單位,即 segment_duration/timescale = 實(shí)際時(shí)長(單位s)
- media_time: 表示該edit段的起始時(shí)間,以track中Media Header Box(mdhd)中的timescale為單位共郭。如果值為-1(FFFFFF)祠丝,表示是空edit疾呻,一個(gè)track中最后一個(gè)edit不能為空。
- media_rate: edit段的速率為0的話写半,edit段相當(dāng)于一個(gè)”dwell”岸蜗,即畫面停止。畫面會在media_time點(diǎn)上停止segment_duration時(shí)間叠蝇。否則這個(gè)值始終為1璃岳。
- 需要注意的問題:
??為使PTS從0開始,media_time字段一般設(shè)置為第一個(gè)CTTS的值悔捶,計(jì)算PTS和DTS的時(shí)候铃慷,他們分別都減去media_time字段的值就可以將PTS調(diào)整為從0開始的值。
??如果media_time是從一個(gè)比較大的值蜕该,則表示要求PTS值大于該值時(shí)畫面才進(jìn)行顯示犁柜,這時(shí)應(yīng)該將第一個(gè)大于或等于該值的PTS設(shè)置為0,其他的PTS和DTS也相應(yīng)做調(diào)整堂淡。
2.9 mdia(media box)
- 定義了track媒體類型以及sample數(shù)據(jù)馋缅,描述sample信息。
- 它是一個(gè)container box绢淀,它必須包含mdhd股囊,hdlr 和 minf。
一個(gè)示例如下:
其中:
- mdhd(Media Header Box):用于簡單描述該路媒體流的信息更啄。
- hdlr(Handler Reference Box):主要定義了 track 類型稚疹。
- stbl(Media Information Box):用于描述該路媒體流的解碼相關(guān)信息和音視頻位置等信息。
2.10 mdhd(Media Header Box)
- mdhd 作為媒體信息的header出現(xiàn)(注意此header不是box header祭务,而是media媒體信息的header)内狗,用于描述一些該media的基本信息。
- mdhd和tkhd 义锥,內(nèi)容大致都是一樣的柳沙。不過tkhd通常是對指定的track設(shè)定相關(guān)屬性和內(nèi)容。而mdhd 是針對于獨(dú)立的media來設(shè)置的拌倍。
-
mdhd語法繼承自fullbox赂鲤,注意下述示例出現(xiàn)的 version 和 flags 字段屬于fullbox header。
Box Body:
注:timescale同mvhd中的timescale柱恤,但是需要注意雖然意義相同数初,但是值有可能不同,下邊stts,ctts等時(shí)間戳的計(jì)算都是以mdhd中的timescale梗顺。
2.11 hdlr(Handler Reference Box)
- 主要解釋了媒體的播放過程信息泡孩。聲明當(dāng)前track的類型,以及對應(yīng)的處理器(handler)寺谤。
- hdlr 語法繼承自 fullbox仑鸥,注意下述示例出現(xiàn)的 version 和 flags 字段屬于 fullbox header吮播。
Box Body:
2.12 minf(Media Information box)
- 解釋 track 媒體數(shù)據(jù)的 handler-specific 信息,media handler用這些信息將媒體時(shí)間映射到媒體數(shù)據(jù)并進(jìn)行處理眼俊。minf 同樣是個(gè) container box意狠,其內(nèi)部需要關(guān)注的內(nèi)容是 stbl,這也是 moov 中最復(fù)雜的部分疮胖。
-
一般情況下摄职,“minf”包含一個(gè)header box,一個(gè)“dinf”和一個(gè)“stbl”获列,其中谷市,header box根據(jù)track type(即media handler type)分為“vmhd”、“smhd”击孩、“hmhd”和“nmhd”迫悠,“dinf”為data information box,“stbl”為sample table box巩梢。
2.13 *mhd (Media Info Header Box)
??可分為“vmhd”创泄、“smhd”、“hmhd”和“nmhd”括蝠,比如視頻類型則為vmhd鞠抑,音頻類型為smhd。
(1)vmhd
- graphics mode:視頻合成模式忌警,為0時(shí)拷貝原始圖像搁拙,否則與opcolor進(jìn)行合成。
- opcolor:一組(red法绵,green箕速,blue),graphics modes使用朋譬。
(2)smhd - balance:立體聲平衡盐茎,[8.8] 格式值,一般為0表示中間徙赢,-1.0表示全部左聲道字柠,1.0表示全部右聲道。
2.14 dinf(Data Information Box)
- 描述了如何定位媒體信息狡赐,是一個(gè)container box窑业。
- “dinf”一般包含一個(gè)“dref”(data reference box)。
- “dref”下會包含若干個(gè)“url”或“urn”阴汇,這些box組成一個(gè)表数冬,用來定位track數(shù)據(jù)节槐。簡單的說搀庶,track可以被分成若干段拐纱,每一段都可以根據(jù)“url”或“urn”指向的地址來獲取數(shù)據(jù),sample描述中會用這些片段的序號將這些片段組成一個(gè)完整的track哥倔。一般情況下秸架,當(dāng)數(shù)據(jù)被完全包含在文件中時(shí),“url”或“urn”中的定位字符串是空的咆蒿。
2.15 stbl(Sample Table Box)
??在介紹stbl box之前东抹,需要先介紹一下mp4中定義的sample與chunk:
- sample:ISO/IEC 14496-12 中定義 samples 之間不能共享同一個(gè)時(shí)間戳,因此沃测,在音視頻 track 中缭黔,一個(gè) sample 代表一個(gè)視頻或音頻幀。
-
chunk:多個(gè) sample 的集合蒂破,實(shí)際上音視頻 track 中馏谨,chunk 與 sample 一一對應(yīng)。
??stbl box是一個(gè)container box附迷,是整個(gè)track中最重要的一個(gè)box惧互,其子box描述了該路媒體流的解碼相關(guān)信息、音視頻位置信息喇伯、時(shí)間戳信息等喊儡。
??MP4文件的媒體數(shù)據(jù)部分在mdat box里,而stbl則包含了這些媒體數(shù)據(jù)的索引以及時(shí)間信息稻据。
一個(gè)示例如下:
其中:
- stsd(sample description box):存儲了編碼類型和初始化解碼器需要的信息艾猜,并與具體編解碼器類型有關(guān)。
- stts(time to sample box):存儲了該 track 每個(gè) sample 到 dts 的時(shí)間映射關(guān)系捻悯。
- stss(sync sample box):針對視頻 track箩朴,關(guān)鍵幀所屬sample 的序號。
- ctts(composition time to sample box):存儲了該 track 中秋度,每個(gè) sample 的 cts 與 dts 的時(shí)間差炸庞。
- stsc/stz2(sample to chunk box):存儲了該 track 中每個(gè) sample 與 chunk 的映射關(guān)系。
- stsz(sample size box):存儲了該 track 中每個(gè) sample 的字節(jié)大小荚斯。
- stco/co64(chunk offset box):存儲了該 track 中每個(gè) chunk 在文件中的偏移埠居。
2.16 stsd(sample description box)
??主要存儲了編碼類型和初始化解碼器需要的信息。這里以視頻為例事期,包含子box:avc1滥壕,表示是H264的視頻。
2.16.1 h264 stsd
??對于h264視頻兽泣,典型結(jié)構(gòu)如下:
其上(只列出 avc1 與 avcC绎橘,其余 box 可忽略):
- avc1,是 avc/h264/mpeg-4 part 10視頻編解碼格式的代稱,是一個(gè) container box称鳞,但是 box body 也攜帶自身的信息涮较。
Box Body:
-
avcC(AVC Video Stream Definition Box),存儲 sps && pps冈止,即在 ISO/IEC 14496-15 中定義的 AVCDecoderConfigurationRecord 結(jié)構(gòu)
注:在 srs 中狂票,解析 avcc/AVCDecoderConfigurationRecord 結(jié)構(gòu)解析參見 srs/trunk/src/kernel/srs_kerner_codec.cpp::SrsFormat::avc_demux_sps_pps() 函數(shù)。
2.16.2 aac stsd
??對于 aac 音頻熙暴,典型結(jié)構(gòu)如下:
可以看到闺属,aac stsd 結(jié)構(gòu)比較復(fù)雜,box 眾多周霉。實(shí)際上掂器,在 ISO/IEC 14496-3 中,定義了 AudioSpecificConfig 類型俱箱,aac stsd 結(jié)構(gòu)主要信息就來自 AudioSpecificConfig唉匾。
具體不做分析,可以參看 srs 中:
- 解析 AudioSpecificConfig 結(jié)構(gòu)的 srs/trunk/src/kernel/srs_kerner_codec.cpp::SrsFormat::audio_aac_sequence_header_demux() 函數(shù)
- 封裝 aac stsd 結(jié)構(gòu)的 srs/trunk/src/kernel/srs_kernel_mp4.cpp::SrsMp4Encoder::flush() 函數(shù)
2.17 stts(time to sample box)
- 存儲了該 track 每個(gè) sample 到 dts 的時(shí)間映射關(guān)系匠楚。
-
包含了一個(gè)壓縮版本的表巍膘,通過這個(gè)表可以從解碼時(shí)間映射到sample序號。表中的每一項(xiàng)是連續(xù)相同的編碼時(shí)間增量(Decode Delta)的個(gè)數(shù)和編碼時(shí)間增量芋簿。通過把時(shí)間增量累加就可以建立一個(gè)完整的time to sample表峡懈。
??這里為了節(jié)約條目的個(gè)數(shù),采用了壓縮存儲的方式与斤,即 sample_count 個(gè)連續(xù)的 sample 如果 sample_delta 時(shí)長一樣肪康,那么用一個(gè)條目就能表示了。
一個(gè)音頻 track 的示例如下:
一個(gè)視頻 track 的示例如下:
2.18 ctts(composition time to sample box)
- 存儲了該 track 中撩穿,每個(gè) sample 的 pts 與 dts 時(shí)間差(cts = pts - dts):
-
如果一個(gè)視頻只有I幀和P幀磷支,則ctts這個(gè)表就不需要了,因?yàn)榻獯a順序和顯示順序是一致的食寡,但是如果視頻中存在B幀雾狈,則需要ctts。
注意:
- 此 box 在 dts 和 pts 不一樣的情況下必須存在抵皱,如果一樣善榛,不用包含此 box。
- 如果 box 的 version=0呻畸,意味著所有 sample 都滿足 pts >= dts移盆,因而差值用一個(gè)無符號的數(shù)字表示。只要存在一個(gè) pts < dts咒循,那么必須使用 version=1、有符號差值來表示。
- 關(guān)于 ctts 的生成叙甸,可以參看 srs/trunk/src/kernel/srs_kernel_mp4.cpp::SrsMp4SampleManager::write_track() 函數(shù) pts颖医、dts、cts 滿足公式:pts - dts = cts蚁署。
2.19 stss(sync sample box)
??它包含media中的關(guān)鍵幀的sample表便脊。關(guān)鍵幀是為了支持隨機(jī)訪問蚂四。如果此表不存在光戈,說明每一個(gè)sample都是一個(gè)關(guān)鍵幀。
一個(gè)視頻示例如下:
2.20 stsc/stz2(sample to chunk box)
??存儲了該 track 中每個(gè) sample 與 chunk 的映射關(guān)系遂赠。
一個(gè)音頻示例如下:
- 第一組 chunk 的 first_chunk 序號為 1久妆,每個(gè) chunk 的 sample 個(gè)數(shù)為 1,因?yàn)榈诙M chunk 的 first_chunk 序號為 2跷睦,可知第一組 chunk 中只有一個(gè) chunk筷弦。
- 第二組 chunk 的 first_chunk 序號為 2,每個(gè) chunk 的 sample 個(gè)數(shù)為 2抑诸,因?yàn)榈谌M chunk 的 first_chunk 序號為 24烂琴,可知第二組 chunk 中有 22 個(gè) chunk,有 44 個(gè) sample蜕乡。
- 這個(gè)并不是說奸绷,這個(gè)視頻流只有3個(gè)sample,也就是只有3幀层玲,不可能的号醉,而是第三,第四行省略了辛块,也就是說畔派,第三跟第四,等等润绵,后面的chunk 里面都只有1個(gè)sample线椰,跟第二個(gè)chunk一樣。本視頻流有239個(gè)chunk尘盼。因?yàn)楸疽曨l流一共240幀士嚎,第一個(gè)chunk里面有2幀,后面的都是1幀悔叽,所以計(jì)算出來只有239個(gè)chunk莱衩。
2.21 stsz(sample size box)
??包含sample的數(shù)量和每個(gè)sample的字節(jié)大小,這個(gè)box相對來說體積比較大的娇澎。表明視頻幀或者音頻幀大小笨蚁,F(xiàn)Fmpeg 里面的AVPacket 的size 數(shù)據(jù)大小,就是從這個(gè)box中來的。
2.22 stco/co64(chunk offset box)
- Chunk Offset表存儲了每個(gè)chunk在文件中的位置括细,這樣就可以直接在文件中找到媒體數(shù)據(jù)伪很,而不用解析box瘟滨。
-
需要注意的是一旦前面的box有了任何改變栈顷,這張表都要重新建立冈在。
- stco 有兩種形式茄螃,如果你的視頻過大的話返干,就有可能造成 chunkoffset 超過 32bit 的限制辕漂。所以包各,這里針對大 Video 額外創(chuàng)建了一個(gè) co64 的 Box那伐。它的功效等價(jià)于 stco贷笛,也是用來表示 sample 在 mdat box 中的位置应又。只是,里面 chunk_offset 是 64bit 的乏苦。
- 需要注意株扛,這里 stco 只是指定的每個(gè) Chunk 在文件中的偏移位置,并沒有給出每個(gè) Sample 在文件中的偏移汇荐。想要獲得每個(gè) Sample 的偏移位置洞就,需要結(jié)合 Sample Size box 和 Sample-To-Chunk 計(jì)算后取得。
2.23 udta(user data box)
??用戶自定義數(shù)據(jù)掀淘。
2.24 free(free space box)
- “free”中的內(nèi)容是無關(guān)緊要的旬蟋,可以被忽略。該box被刪除后繁疤,不會對播放產(chǎn)生任何影響咖为。
- Ftyp可以是free或skip。
2.25 mdat(media data box)
- mdat就是具體的編碼后的數(shù)據(jù)稠腊。
- mdat 也是一個(gè) box躁染,擁有 box header 和 box body。
- mdat 可以引用外部的數(shù)據(jù)架忌,參見 moov --> udta --> meta吞彤,這里不討論,只討論數(shù)據(jù)存儲在本文件中的形式叹放。
- 對于 box body 部分饰恕,采用一個(gè)一個(gè) samples 的形式進(jìn)行存儲,即一個(gè)一個(gè)音頻幀或視頻幀的形式進(jìn)行存儲井仰。
- 碼流組織方式采用 avcc 格式埋嵌,即 AUD + slice size + slice 的形式。