封裝格式--2:MP4格式詳解

“本文轉(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子容器秉颗。


mp4_1.PNG

一個(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):

mp4_2.png

每個(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顯示如下:


mp4_3.png

??通過上述工具分析出來的結(jié)果,我們大概可以總結(jié)出MP4以下幾個(gè)特點(diǎn):

  1. MP4文件就是由一個(gè)個(gè)Box組成咖楣,其中Box還可以相互嵌套督笆,排列緊湊沒有多的冗余數(shù)據(jù);
  2. Box類型并沒有很多诱贿,主要是由必須的ftyp娃肿、moov、mdat組成珠十,還有free料扰,udta非必須box組成即去掉這兩種box對于播放音視頻也沒有啥影響。
  3. 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è)示例如下:


mp4_4.png

mp4_5.png

2.4 moov(Movie Box)

  1. moov是一個(gè)container box撰豺,一個(gè)文件只有一個(gè)粪般,其包含的所有box用于描述媒體信息(metadata)。
  2. moov的位置可以緊隨著 ftyp 出現(xiàn)污桦,也可以出現(xiàn)在文件末尾亩歹。
  3. 由于是一個(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)

mp4_6.png

(2)數(shù)據(jù)
mp4_7.png

(3)成分
mp4_8.png

子Box:mvhd
??用于簡單描述一些所有媒體共享的信息滔蝉。
mp4_9.png

子Box:trak
??track,軌道塔沃,用于描述音頻流或視頻流信息蝠引,可以有多個(gè)軌道,如上出現(xiàn)了 2 次蛀柴,分別表示一路音頻和一路視頻流螃概。
mp4_10.png

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:

mp4_11.png

2.6 trak(track)

  1. trak box 是一個(gè) container box冒窍,其子 box 包含了該 track 的媒體信息。
  2. 一個(gè) mp4 文件可以包含多個(gè) track豺鼻,track之間是獨(dú)立的综液,trak box 用于描述每一路媒體流。
  3. 一般情況下有兩個(gè)trak儒飒,分別對應(yīng)音頻流和視頻流谬莹。

一個(gè)示例如下:

mp4_12.png

其中:

  • 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)

  1. tkhd 作為媒體信息的header出現(xiàn)(注意此 header 不是 box header蕉扮,而是 track 媒體信息的 header),用于描述一些該track的基本信息送悔。
  2. tkhd語法繼承自fullbox慢显,注意下述示例出現(xiàn)的version和flags 字段屬于fullbox header爪模。
    Box Body:
    mp4_13.png

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)

  1. 定義了track媒體類型以及sample數(shù)據(jù)馋缅,描述sample信息。
  2. 它是一個(gè)container box绢淀,它必須包含mdhd股囊,hdlr 和 minf。

一個(gè)示例如下:

mp4_14.png

其中:

  • mdhd(Media Header Box):用于簡單描述該路媒體流的信息更啄。
  • hdlr(Handler Reference Box):主要定義了 track 類型稚疹。
  • stbl(Media Information Box):用于描述該路媒體流的解碼相關(guān)信息和音視頻位置等信息。

2.10 mdhd(Media Header Box)

  1. mdhd 作為媒體信息的header出現(xiàn)(注意此header不是box header祭务,而是media媒體信息的header)内狗,用于描述一些該media的基本信息。
  2. mdhd和tkhd 义锥,內(nèi)容大致都是一樣的柳沙。不過tkhd通常是對指定的track設(shè)定相關(guān)屬性和內(nèi)容。而mdhd 是針對于獨(dú)立的media來設(shè)置的拌倍。
  3. mdhd語法繼承自fullbox赂鲤,注意下述示例出現(xiàn)的 version 和 flags 字段屬于fullbox header。
    Box Body:


    mp4_15.png

    注:timescale同mvhd中的timescale柱恤,但是需要注意雖然意義相同数初,但是值有可能不同,下邊stts,ctts等時(shí)間戳的計(jì)算都是以mdhd中的timescale梗顺。

2.11 hdlr(Handler Reference Box)

  1. 主要解釋了媒體的播放過程信息泡孩。聲明當(dāng)前track的類型,以及對應(yīng)的處理器(handler)寺谤。
  2. hdlr 語法繼承自 fullbox仑鸥,注意下述示例出現(xiàn)的 version 和 flags 字段屬于 fullbox header吮播。
    Box Body:
    mp4_16.png

2.12 minf(Media Information box)

  1. 解釋 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ù)雜的部分疮胖。
  2. 一般情況下摄职,“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巩梢。


    mp4_17.png

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)

  1. 描述了如何定位媒體信息狡赐,是一個(gè)container box窑业。
  2. “dinf”一般包含一個(gè)“dref”(data reference box)
  3. “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)。
    mp4_18.png

??stbl box是一個(gè)container box附迷,是整個(gè)track中最重要的一個(gè)box惧互,其子box描述了該路媒體流的解碼相關(guān)信息、音視頻位置信息喇伯、時(shí)間戳信息等喊儡。

??MP4文件的媒體數(shù)據(jù)部分在mdat box里,而stbl則包含了這些媒體數(shù)據(jù)的索引以及時(shí)間信息稻据。
一個(gè)示例如下:

mp4_19.png

其中:

  • 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的視頻。


mp4_20.png

2.16.1 h264 stsd

??對于h264視頻兽泣,典型結(jié)構(gòu)如下:


mp4_21.png

其上(只列出 avc1 與 avcC绎橘,其余 box 可忽略):

  • avc1,是 avc/h264/mpeg-4 part 10視頻編解碼格式的代稱,是一個(gè) container box称鳞,但是 box body 也攜帶自身的信息涮较。
    Box Body:
    mp4_22.png
  • avcC(AVC Video Stream Definition Box),存儲 sps && pps冈止,即在 ISO/IEC 14496-15 中定義的 AVCDecoderConfigurationRecord 結(jié)構(gòu)


    mp4_23.png

注:在 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)如下:

mp4_24.png

可以看到闺属,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)

  1. 存儲了該 track 每個(gè) sample 到 dts 的時(shí)間映射關(guān)系匠楚。
  2. 包含了一個(gè)壓縮版本的表巍膘,通過這個(gè)表可以從解碼時(shí)間映射到sample序號。表中的每一項(xiàng)是連續(xù)相同的編碼時(shí)間增量(Decode Delta)的個(gè)數(shù)和編碼時(shí)間增量芋簿。通過把時(shí)間增量累加就可以建立一個(gè)完整的time to sample表峡懈。


    mp4_25.png

??這里為了節(jié)約條目的個(gè)數(shù),采用了壓縮存儲的方式与斤,即 sample_count 個(gè)連續(xù)的 sample 如果 sample_delta 時(shí)長一樣肪康,那么用一個(gè)條目就能表示了。
一個(gè)音頻 track 的示例如下:

mp4_26.png

一個(gè)視頻 track 的示例如下:

mp4_27.png

2.18 ctts(composition time to sample box)

  1. 存儲了該 track 中撩穿,每個(gè) sample 的 pts 與 dts 時(shí)間差(cts = pts - dts):
  2. 如果一個(gè)視頻只有I幀和P幀磷支,則ctts這個(gè)表就不需要了,因?yàn)榻獯a順序和顯示順序是一致的食寡,但是如果視頻中存在B幀雾狈,則需要ctts。


    mp4_28.png

注意:

  • 此 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)鍵幀。


mp4_29.png

一個(gè)視頻示例如下:

mp4_30.png

2.20 stsc/stz2(sample to chunk box)

??存儲了該 track 中每個(gè) sample 與 chunk 的映射關(guān)系遂赠。


mp4_31.png

一個(gè)音頻示例如下:

mp4_32.png
  • 第一組 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中來的。


mp4_33.png

2.22 stco/co64(chunk offset box)

  1. Chunk Offset表存儲了每個(gè)chunk在文件中的位置括细,這樣就可以直接在文件中找到媒體數(shù)據(jù)伪很,而不用解析box瘟滨。
  2. 需要注意的是一旦前面的box有了任何改變栈顷,這張表都要重新建立冈在。


    mp4_34.png
  • 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)

  1. “free”中的內(nèi)容是無關(guān)緊要的旬蟋,可以被忽略。該box被刪除后繁疤,不會對播放產(chǎn)生任何影響咖为。
  2. Ftyp可以是free或skip。

2.25 mdat(media data box)

  1. mdat就是具體的編碼后的數(shù)據(jù)稠腊。
  2. mdat 也是一個(gè) box躁染,擁有 box header 和 box body。
  3. mdat 可以引用外部的數(shù)據(jù)架忌,參見 moov --> udta --> meta吞彤,這里不討論,只討論數(shù)據(jù)存儲在本文件中的形式叹放。
  4. 對于 box body 部分饰恕,采用一個(gè)一個(gè) samples 的形式進(jìn)行存儲,即一個(gè)一個(gè)音頻幀或視頻幀的形式進(jìn)行存儲井仰。
  5. 碼流組織方式采用 avcc 格式埋嵌,即 AUD + slice size + slice 的形式。

3.參考資料

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末俱恶,一起剝皮案震驚了整個(gè)濱河市雹嗦,隨后出現(xiàn)的幾起案子范舀,更是在濱河造成了極大的恐慌,老刑警劉巖了罪,帶你破解...
    沈念sama閱讀 216,744評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件锭环,死亡現(xiàn)場離奇詭異,居然都是意外死亡泊藕,警方通過查閱死者的電腦和手機(jī)辅辩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來娃圆,“玉大人玫锋,你說我怎么就攤上這事∮徊停” “怎么了景醇?”我有些...
    開封第一講書人閱讀 163,105評論 0 353
  • 文/不壞的土叔 我叫張陵臀稚,是天一觀的道長吝岭。 經(jīng)常有香客問我,道長吧寺,這世上最難降的妖魔是什么窜管? 我笑而不...
    開封第一講書人閱讀 58,242評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮稚机,結(jié)果婚禮上幕帆,老公的妹妹穿的比我還像新娘。我一直安慰自己赖条,他們只是感情好失乾,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,269評論 6 389
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著纬乍,像睡著了一般碱茁。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上仿贬,一...
    開封第一講書人閱讀 51,215評論 1 299
  • 那天纽竣,我揣著相機(jī)與錄音,去河邊找鬼茧泪。 笑死蜓氨,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的队伟。 我是一名探鬼主播穴吹,決...
    沈念sama閱讀 40,096評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼嗜侮!你這毒婦竟也來了港令?” 一聲冷哼從身側(cè)響起代嗤,我...
    開封第一講書人閱讀 38,939評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎缠借,沒想到半個(gè)月后干毅,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,354評論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡泼返,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,573評論 2 333
  • 正文 我和宋清朗相戀三年硝逢,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片绅喉。...
    茶點(diǎn)故事閱讀 39,745評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡渠鸽,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出柴罐,到底是詐尸還是另有隱情徽缚,我是刑警寧澤,帶...
    沈念sama閱讀 35,448評論 5 344
  • 正文 年R本政府宣布革屠,位于F島的核電站凿试,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏似芝。R本人自食惡果不足惜那婉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,048評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望党瓮。 院中可真熱鬧详炬,春花似錦、人聲如沸寞奸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,683評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽枪萄。三九已至隐岛,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間呻引,已是汗流浹背礼仗。 一陣腳步聲響...
    開封第一講書人閱讀 32,838評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留逻悠,地道東北人元践。 一個(gè)月前我還...
    沈念sama閱讀 47,776評論 2 369
  • 正文 我出身青樓,卻偏偏與公主長得像童谒,于是被迫代替她去往敵國和親单旁。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,652評論 2 354

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

  • MP4簡介 MP4(MPEG-4 Part 14)是一種常見的多媒體容器格式饥伊,它是在“ISO/IEC 14496-...
    FlyerGo閱讀 3,416評論 0 2
  • Mp4是一種非常常見的一種音視頻封裝格式象浑,因?yàn)榧嫒菪詮?qiáng)蔫饰,所以被普遍使用。今天總結(jié)了一下Mp4格式愉豺。 Mp4格式是一...
    幸福有你_abb7閱讀 3,752評論 0 1
  • 原文鏈接: http://blog.sina.com.cn/s/blog_48f93b530100jz4x.htm...
    之江狂徒閱讀 893評論 0 0
  • 目錄 概述 mp4文件基本信息 封裝格式重要概念 重要box介紹 其他box介紹 實(shí)用技術(shù) 開源軟件 參考 [1]...
    smallest_one閱讀 60,449評論 5 61
  • 目錄 概述 mp4文件基本信息 封裝格式重要概念 重要box介紹 其他box介紹 實(shí)用技術(shù) 開源軟件 參考 [1]...
    一川煙草i蓑衣閱讀 1,244評論 0 1