MP4格式詳解

概念

MP4(MPEG-4 Part 14)是一種標(biāo)準(zhǔn)的數(shù)字多媒體容器格式俐载,其擴(kuò)展名為.mp4吊骤,以存儲(chǔ)數(shù)字音頻及數(shù)字視頻為主氯析,也可存儲(chǔ)字幕和靜止圖像亏较。因其可容納支持比特流的視頻流(如高級(jí)視頻編碼),MP4可以在網(wǎng)絡(luò)傳輸時(shí)使用流式傳輸魄鸦。

術(shù)語

概念與術(shù)語是理解好MP4媒體封裝格式和其操作算法的關(guān)鍵宴杀,為了方便了解MP4文件格式,需先了解以下幾個(gè)概念與術(shù)語:

  1. Box:MP4文件是由一個(gè)個(gè)Box組成的拾因,可以將其理解為一個(gè)數(shù)據(jù)塊旺罢,它由Header+Data組成,Data 可以存儲(chǔ)媒體元數(shù)據(jù)和實(shí)際的音視頻碼流數(shù)據(jù)绢记。Box可直接存儲(chǔ)數(shù)據(jù)塊扁达,也可包含其它Box,我們把包含其它Box的Box稱為container box蠢熄。
  2. Sample:可理解為采樣跪解,對(duì)于視頻可理解為一幀數(shù)據(jù),音頻一幀數(shù)據(jù)就是一段固定時(shí)間的音頻數(shù)據(jù)签孔,可以由多個(gè)Sample數(shù)據(jù)組成叉讥,存儲(chǔ)媒體數(shù)據(jù)的單位是sample窘行。
  3. Chunk:連續(xù)幾個(gè)sample組成的單元被稱為chunk,每個(gè)chunk在文件中有一個(gè)偏移量图仓,整個(gè)偏移量從文件頭算起罐盔,在這個(gè)chunk內(nèi),sample是連續(xù)存儲(chǔ)的救崔。
  4. Track:表示一些chunk的集合惶看,對(duì)于媒體數(shù)據(jù)而言就是一個(gè)視頻序列或者音頻序列,常說的音頻/視頻軌可對(duì)照該概念上六孵。除了Video Track和Audio Track外纬黎,還可以有非媒體數(shù)據(jù),比如Hint Track劫窒,這種類型的Track就不包含媒體數(shù)據(jù)本今,可以包含一些將其他數(shù)據(jù)打包成媒體數(shù)據(jù)的指示信息或者字幕信息。簡(jiǎn)單來說主巍,Track是音視頻中可以獨(dú)立操作的媒體單位诈泼。

可理解為MP4文件中有多個(gè)Track,一個(gè)Track由多個(gè)Chunk組成煤禽,每個(gè)Chunk包含一組連續(xù)的Sample铐达。例如視頻流的一個(gè)Sample代表實(shí)際的nal數(shù)據(jù),Chunk是數(shù)據(jù)存儲(chǔ)的基本單位檬果,它是一系列Sample數(shù)據(jù)的集合瓮孙。

image.png

MP4容器格式

MP4是一種描述較為全面的容器格式,被認(rèn)為可以在其中嵌入任何形式的數(shù)據(jù)选脊,以及各種編碼的音視頻等杭抠,我們常見的大部分的MP4文件都是存放的AVC(H.264)或MPEG-4(Part 2)編碼的視頻和AAC編碼的音頻。MP4的結(jié)構(gòu)就像俄羅斯的套娃恳啥,Box套著Box偏灿,也可理解為一棵Box樹。下圖是常見的box的結(jié)構(gòu)圖钝的,可用來大致了解MP4文件的構(gòu)造:

image.png

我們也可以通過在線工具MP4 Box來查看MP4文件的真實(shí)格式:

image.png

box結(jié)構(gòu)

通過上面的介紹翁垂,我們了解了MP4格式就是由一個(gè)個(gè)的box組合成的box樹,所有的數(shù)據(jù)都包含在box里硝桩,下面來了解一下box的基本結(jié)構(gòu)沿猜。一個(gè)box是由Header+Data組成,如下圖所示:

image.png

整個(gè)box以Header開頭碗脊,Header中包含了box的大刑浼纭(size)和類型(type)等信息。其中,size指明了整個(gè)box所占用的大小祈坠,包括Header部分害碾,如果box很大(例如存放具體視頻數(shù)據(jù)的mdat box),超過了uint32的最大數(shù)值赦拘,size就被設(shè)置為1蛮原,并用接下來的8位uint64的largesize來存放大小。box中的字節(jié)序?yàn)榫W(wǎng)絡(luò)字節(jié)序另绩,也就是大端字節(jié)序(Big-Endian)。

box根據(jù)header部分包含的信息的不同可以分為box和full box花嘶,如下圖所示:

image.png

關(guān)于更多的box內(nèi)容笋籽,在ISO_IEC_14496-12_2015中包含所有box的類型,詳細(xì)可以參考該文檔椭员。

MP4基礎(chǔ)box

ftyp

ftyp是MP4文件的第一個(gè)box车海,通過判斷該box來確定文件的類型。該box有且僅有1個(gè)隘击,并且只能被包含在文件層侍芝,而不能被其他box包含。該box放在文件的最開始埋同,指示文件的相關(guān)信息州叠。

文件的最開始是ftyp box的size,然后是該box的type凶赁。 ftyp的body依次包括1個(gè)32位的major brand(4個(gè)字符)咧栗,1個(gè)32位的minor version(整數(shù))和1個(gè)以32位(4個(gè)字符)為單位元素的數(shù)組compatible brands。這些都是用來指示文件應(yīng)用級(jí)別的信息虱肄。

image.png

以一個(gè)MP4文件的ftyp box為例:

image.png
00000018:size致板,為24個(gè)字節(jié),一般情況下為固定值
66747970:"ftyp"四個(gè)字符的ASCII值咏窿,也就是該box的type
6D703432:major brand斟或,這里為"mp42"
00000000:minor version,值為0
6D703432 69736F6D:compatible brands集嵌,值為"mp42"和"isom"

雖然MP4萝挤、MOV、3GP等格式文件采用相同的封裝標(biāo)準(zhǔn)根欧,但由于是由不同的廠商合成平斩,因此還是存在差別的。即使使用同一種媒體文件咽块,比如MP4文件绘面,由不同developers開發(fā)的,MP4內(nèi)容格式也是存在差別的。ftyp作用就是為了標(biāo)識(shí)它的developer是誰揭璃,兼容哪些標(biāo)準(zhǔn)等晚凿。

比如上面的例子,"mp42"表示它的major brand是MP4 v2 [ISO 14496-14]瘦馍,而"mp42"和"isom"則表示它的compatible brands是MP4 v2 [ISO 14496-14]和MP4 Base Media v1 [IS0 14496-12:2003]歼秽。

更多的ftyp可參見:ftyps.com,其中列出了所有已知的ftyp及對(duì)其的描述情组。

moov

moov box是MP4文件中必須有但只能存在一個(gè)的box披蕉,該box一般存的是媒體文件的元數(shù)據(jù)步咪,其本身很簡(jiǎn)單,是一種container box,里面的數(shù)據(jù)是子box于样,自己更像是一個(gè)分界標(biāo)識(shí)挑辆。

所謂的媒體元數(shù)據(jù)主要包含類似SPS PPS的編解碼參數(shù)信息是复,還有音視頻的時(shí)間戳等信息扭弧。對(duì)于MP4還有一個(gè)重要的采樣表stbl信息,這里面定義了采樣Sample捐凭、Chunk拨扶、Track的映射關(guān)系等,是MP4能夠進(jìn)行隨機(jī)拖動(dòng)茁肠、播放等操作的關(guān)鍵患民。

image.png
mvhd box

該box是全文件唯一的一個(gè)box,其對(duì)整個(gè)媒體文件所包含的媒體數(shù)據(jù)(Video Track垦梆、Audio Track等)進(jìn)行全面的描述酒奶。其中包含了媒體的創(chuàng)建和修改時(shí)間,默認(rèn)音量奶赔、色域惋嚎、時(shí)長(zhǎng)等信息。具體實(shí)例下:

image.png

mvhd是一個(gè)full box站刑,對(duì)應(yīng)字段的含義參考下圖:

image.png

真實(shí)數(shù)據(jù)內(nèi)容如下:

image.png

具體數(shù)據(jù)的解析:

0000006C 6D766864 00000000 DB8665DB DB8665DD 0000AC44 0009EA0C 00010000 01000000 00000000 00000000 00010000 00000000 00000000 00000000 00010000 00000000 00000000 00000000 40000000 00000000 00000000 00000000 00000000 00000000 00000000 00000003

0000006C: 長(zhǎng)度108
6D766864: mvhd的ASCII標(biāo)識(shí)
00: version為0
000000: flags為0
DB8665DB: createTime另伍,從UTC時(shí)間的1904年1月1日0點(diǎn)至今的秒數(shù),不過這里的時(shí)間并不影響播放器識(shí)別并播放影片
DB8665DD: modification time
0000AC44: time scale绞旅,文件媒體在1秒時(shí)間內(nèi)的刻度值摆尝,可理解為1秒長(zhǎng)度的時(shí)間單元數(shù).即將1s平均分為1/44100份,每份1/44100s
0009EA0C: duration因悲,媒體可播放時(shí)長(zhǎng):duration / timescale = 可播放時(shí)長(zhǎng)(s)
00010000: rate,推薦播放速率堕汞,高16位和低16位分別為小數(shù)點(diǎn)整數(shù)部分和小數(shù)部分,即[16.16] 格式晃琳,該值為1.0(0x00010000)表示正常前向播放
0100: volume,與rate類似讯检,[8.8] 格式琐鲁,1.0(0x0100)表示最大音量
0000 00000000 00000000: reverse,10字節(jié)保留位

00010000 00000000 00000000
00000000 00010000 00000000
00000000 00000000 40000000: matrix人灼,36字節(jié)視頻變換矩陣

00000000 00000000 00000000 
00000000 00000000 00000000 :pre-defined, 24字節(jié),其中包括:
  00000000: preview_time
  00000000: preview_duration
  00000000: poster_time
  00000000: selection_time
  00000000: selection_duration
  00000000: current_time
  
00000003: next track id, 下一個(gè)track使用的id號(hào)
iods box

這個(gè)box為full box围段,非必須box,實(shí)際也是24字節(jié)的固定值投放,data定義的內(nèi)容應(yīng)該是Audio和Video ProfileLevel方面的描述奈泪。

image.png

對(duì)應(yīng)字段的含義參考下圖:

image.png
trak box

trak box定義了媒體中一個(gè)Track的信息,視頻有Video Track灸芳,音頻有Audio Track涝桅,媒體文件中可以有多個(gè)Track,每個(gè)Track具有自己獨(dú)立的時(shí)間和空間的信息烙样,可以進(jìn)行獨(dú)立操作冯遂。每個(gè)Track Box都需要有一個(gè)tkhd box和mdia Box,其它的box都是可選擇的:

image.png

tkhd box

描述了Track的媒體整體信息包括時(shí)長(zhǎng)误阻、圖像的寬度和高度等,比較重要晴埂。

image.png

當(dāng)trak為audio時(shí)究反,對(duì)應(yīng)的width和height為0,對(duì)應(yīng)字段的含義參考下圖:

image.png

真實(shí)數(shù)據(jù)內(nèi)容如下:

image.png

具體數(shù)據(jù)的解析:

0000005C 746B6864 00000001 DB8665DB DB8665DD 00000001 00000000 0009EA0C 00000000 00000000 00000000 00000000 00010000 00000000 00000000 00000000 00010000 00000000 00000000 00000000 40000000 02D00000 05000000

0000005C: size 92
746B6864: type tkhd
00: version 0
000001: flag 1
DB8665DB: 創(chuàng)建時(shí)間 3683018203
DB8665DD:修改時(shí)間 3683018205
00000000: reverse
0009EA0C: duration 649740
00000000 00000000: reverse2
0000: layer, 視頻層儒洛,默認(rèn)為0精耐,值小的在上層  
0000: group, track分組信息,默認(rèn)為0表示該track未與其他track有群組關(guān)系
00 00: 音量  
0000:  reverse
00010000  00000000   00000000  
00000000  00010000   00000000 
00000000  00000000   40000000: matrix[36] 視頻變換矩陣
02D00000: width 47185920
05000000: height 83886080

edts/elst

Edit List Box琅锻,不是所有的mp4文件有這個(gè)box卦停,作用是使某個(gè)track的時(shí)間戳產(chǎn)生偏移:

image.png

mdia box

這個(gè)Box也是Container Box,里面包含子Box恼蓬,一般必須有mdhd box惊完、hdlr box、minf box处硬⌒』保基本就是當(dāng)前Track媒體頭信息和媒體句柄以及媒體信息。它自身非常簡(jiǎn)單荷辕,就是一個(gè)標(biāo)識(shí)而已凿跳,但最復(fù)雜的還是里面包含的子box.

image.png

mdhd box

該box里面主要定義了該Track的媒體頭信息,其中我們最關(guān)心的兩個(gè)字段是timescale和duration疮方,分別表示了該Track的時(shí)間戳和時(shí)長(zhǎng)信息控嗜,這個(gè)時(shí)間戳信息也是PTS和DTS的單位。

image.png

對(duì)應(yīng)字段的含義參考下圖:

image.png

真實(shí)mdhd box的數(shù)據(jù)如下:

image.png

具體數(shù)據(jù)的解析:

00000020 6D646864 00000000 DB8665DB DB8665DD 00000258 00002288 55C40000

00000020: size 32
6D646864:  mdhd
00000000: version = 0, flag = 0
DB8665DB: creation_time
DB8665DD: modification_time
00000258: timescale
00002288: duration
55C40000 language 21956 languageString und(0X15+0x60, 0X0E+0x60, 0X04+0x60)

hdlr Box

該box解釋了媒體的播放過程信息骡显,用來設(shè)置不同Track的處理方式疆栏,標(biāo)識(shí)了該Track的類型曾掂,音頻Track的handler為soun,視頻Track的handler為video承边。

image.png

對(duì)應(yīng)字段的含義參考下圖:

image.png

真實(shí)的數(shù)據(jù)如下:

image.png

具體數(shù)據(jù)的解析:

00000031 68646C72 00000000 00000000 76696465 00000000 00000000 00000000 436F7265 204D6564 69612056 6964656F

00000031: size 49
68646C72: hdlr 
00000000: version flag 都為0
00000000: component type: 全0
76696465: component subtype soun 代表該track為 audio track
00000000: Component manufacturer 遭殉。 Reserved. Set to 0.
00000000: Component flags。Reserved. Set to 0.
00000000: Component flags mask博助。Reserved. Set to 0险污。
436F7265 204D6564 69612056 6964656F: Name(Core Media Video.)

minf box

minfmoov中最重要最復(fù)雜的box,內(nèi)部還有子Box富岳,我們從上而下從外到內(nèi)地分析各個(gè)box蛔糯。該box建立了時(shí)間到真實(shí)音視頻sample的映射關(guān)系,是音視頻數(shù)據(jù)操作的關(guān)鍵窖式。該box是container box蚁飒,含有三大必須的子Box:

  1. 媒體信息頭box: vmhd box(視頻)、smhd box(音頻)
  2. 數(shù)據(jù)信息box:dinf box
  3. 采樣表box:stbl box
image.png

其中stbl是moov中最復(fù)雜的部分萝喘,stbl包含了媒體流每一個(gè)sample在文件中的offset淮逻,pts,duration等信息阁簸。想要播放一個(gè)mp4文件爬早,必須根據(jù)stbl正確找到每個(gè)sample并送給解碼器。stbl用來描述每個(gè)sample的信息启妹,包含以下幾個(gè)主要的子box:

stsd

Sample Description Box筛严,存放解碼必須的描述信息。

avc1 & mp4a

Video Track中會(huì)包含avc1 box饶米,包含SPS PPS 等音視頻解碼信息:

image.png

avcC box:

image.png

真實(shí)的數(shù)據(jù)如下:

image.png

具體數(shù)據(jù)的解析:

0000007B 61766331 00000000 00000001 00000000 00000000 00000000 00000000 02D00500 00480000 00480000 00000000 00010000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000018 FFFF0000 00256176 63430164 0029FFE1 000A2764 0029AC56 C0B40A19 01000428 EE3CB0FD F8F800

0000007B: size 123
61766331: avc1
000000000000: reserve
0001: index 1
0000: pre_defined
0000: reserved
00000000: pre_defined
00000000: pre_defined
00000000: pre_defined
02D0: width 720 
0500: height 1280
00480000: Horiz resolution 4718592 
00480000: Ver resolution   4718592 
00000000: reverse
0001: frame count 1
0000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 0000: 32字節(jié)compressr_name
0018:bit_depth
FFFF:pre_defined

0000 0025: size 37
61766343: avcC
01: configurationVersion
64: AVC profile indication(100, Main profile)
00: AVC profile compatibility
29: AVC level indication 41
FF: nulu size(4 暫時(shí)不知道怎么來的)
E1: SPS個(gè)數(shù)桨啃,低五位有效,1個(gè)sps
000A: sps長(zhǎng)度檬输,10
2764 0029AC56 C0B40A19: sps
01: pps個(gè)數(shù)
0004: pps長(zhǎng)度
28 EE3CB0: pps數(shù)據(jù)
FD F8F800:ext

Audio Track中會(huì)包含mp4a(MPEG-4 Audio) box:

image.png

mp4a box包含的esds box:

image.png

真實(shí)的數(shù)據(jù)如下:

image.png

具體數(shù)據(jù)的解析:

00000057 6D703461 00000000 00000001 00000000 00000000 00020010 00000000 AC440000 00000033 65736473 00000000 03808080 22000000 04808080 14401400 18000000 FA000000 FA000580 80800212 10068080 800102

00000057: size 87
6D703461: mp4a
00000000 0000:  6字節(jié)保留照瘾,必須為0
0001: index 1
0000: unsigned int(16) pre_defined = 0;
0000: const unsigned int(16) reserved = 0;
00000000:暫時(shí)不知道什么作用
0002:channel_count 2
0010:samplesize 166
00000000: version 和 flag 均為 0
00 AC44:samplerate 44100
0000: 暫時(shí)不知道什么作用


00000033: size 51
65736473: esds
00000000: version 和 flag 均為 0
03: ES_DescrTag
80808022: 4字節(jié)size,這里有點(diǎn)奇怪(一般就一字節(jié))丧慈,4字節(jié)長(zhǎng)度网杆,但只取最后一個(gè)0x22當(dāng)長(zhǎng)度
0000:ES_ID
00: 
  :0000 0000(bits)
     0:   steamDependenceFlag,如果為1伊滋,則有16bits的dependsOn_ES_IS
      0:    URL_Flag,如果為1碳却,后邊則有8bits URLlength, 和相應(yīng)的URLstring(URLlength)
       0:   OCRstreamFlag, 如果為1,有16bits OCR_ES_id;
        0 0000: streamPriority
        
04: DecoderConfigDescriptor TAG
80 80 80 14: 4字節(jié)size(一般就一字節(jié))笑旺,這里有點(diǎn)奇怪昼浦,4字節(jié)長(zhǎng)度,但只取最后一個(gè)0x14(20)當(dāng)長(zhǎng)度
40: objectTypeIndication (14496-1 Table8), 0x40是Audio (ISO/IEC 14496-3)
14:
   0001 0101
   0001 01        :streamType  5是Audio Stream, 14496-1 Table9
          0       :upStream
           0      :reserved
00 1800: bufferSizeDB: 6144
0000 FA00: Max bitrate 64000  //可以獲取最大碼率
0000 FA00: Avg bitrate 64000  //可以獲取平均碼率

05: DecSpecificInfotag
80 80 80 02: 4字節(jié)size(一般就一字節(jié))筒主,這里有點(diǎn)奇怪关噪,4字節(jié)長(zhǎng)度鸟蟹,但只取最后一個(gè)0x02當(dāng)長(zhǎng)度
12 10:
  0001 0010 0001 0000:
  0001 0                     :audioObjectType 2 GASpecificConfig
        010 0                :samplingFrequencyIndex
             001 0           :channelConfiguration 1 
                  00         :cpConfig
                    0        :directMapping
                      
06: SLConfigDescrTag
80 80 80 01: 長(zhǎng)度1
02: predefined 0x02 Reserved for use in MP4 files

stts

Time-to-Sample Box,保存每個(gè)sample時(shí)長(zhǎng)使兔,描述了sample時(shí)序的映射方法建钥,我們通過它可以找到任何時(shí)間的sample。stts包含一個(gè)壓縮的表來映射時(shí)間和sample序號(hào)虐沥,用其他的表來提供每個(gè)sample的長(zhǎng)度和指針熊经。表中每個(gè)條目提供了在同一個(gè)時(shí)間偏移量里面連續(xù)的sample序號(hào),以及samples的偏移量欲险。遞增這些偏移量镐依,就可以建立一個(gè)完整的time to sample表。

image.png

對(duì)應(yīng)字段的含義參考下圖:

image.png

真實(shí)數(shù)據(jù)內(nèi)容分析如下:

00000018 73747473 00000000 00000001 000001BA

00000018: size 24
73747473: stts
00000000: version 和 flag
00000001: Entry count 1
000001BA: sample count 442
00000014: Sample delta 20

在mdhd的timescale為600天试,這里sample delta為20槐壳,600/20=30,即1秒30幀
stts只有一個(gè)entry,sample count442,delta 20, 442*20=56000, 與mdhd的duration相對(duì)應(yīng)

ctts

Composition Time to Sample 時(shí)間合成偏移表,每個(gè) sample 有自己解碼序(DTS)和顯示序(PTS)喜每。對(duì)每個(gè) sample 而言务唐, DTS 和 PTS 不相同時(shí),則存在該 BOX:

image.png

對(duì)應(yīng)字段的含義參考下表:

image.png

stss

Sync Sample Box带兜,存放關(guān)鍵幀列表:

image.png

對(duì)應(yīng)字段的含義參考下圖:

image.png

真實(shí)數(shù)據(jù)內(nèi)容如下:

image.png

具體數(shù)據(jù)的解析:

0000004C 73747373 00000000 0000000F 00000001 0000001F 0000003D 0000005B 00000079 00000097 000000B5 000000D3 000000F1 0000010F 0000012D 0000014B 00000169 00000187 000001A5

0000004C: size 56
73747373: stss
00000000: version flag
0000000F: entry count 10枫笛,有15個(gè)關(guān)鍵幀
00 00 00 01: 第1個(gè)關(guān)鍵幀位于第1幀
...
...
000001A5:第16個(gè)關(guān)鍵幀位于第421幀

stsc

Sample-To-Chunk Box,sample-chunk映射表鞋真。上文提到MP4通常把sample封裝到chunk中崇堰,一個(gè)chunk可能會(huì)包含一個(gè)或者幾個(gè)sample沃于。

image.png

對(duì)應(yīng)字段的含義參考下圖:

image.png

該box關(guān)鍵點(diǎn)在于里面的三個(gè)字段: first_chunk涩咖、samples_per_chunk、sample_description_index:

  1. first_chunk: 每一個(gè) entry 開始的 chunk 位置
  2. samples_per_chunk: 每一個(gè) chunk 里面包含多少的 sample
  3. sample_description_index: 每一個(gè) sample 的描述繁莹,一般默認(rèn)設(shè)為 1

這 3 個(gè)字段實(shí)際上決定了一個(gè) MP4 中有多少個(gè) chunks檩互,每個(gè) chunks 有多少個(gè) samples。在 MP4 文件中咨演,最小的基本單位是 Chunk 而不是 Sample:

  1. sample: 包含最小單元數(shù)據(jù)的 slice闸昨。里面有實(shí)際的 NAL 數(shù)據(jù)。
  2. chunk: 里面包含的是一個(gè)一個(gè)的 sample薄风。為了是優(yōu)化數(shù)據(jù)的讀取饵较,讓 I/O 更有效率。

真實(shí)數(shù)據(jù)內(nèi)容如下:

image.png

具體數(shù)據(jù)的解析:

00000034 73747363 00000000 00000003 00000001 0000000F 00000001 0000001B 0000001E 00000001 0000001C 00000016 00000001

00000034: size 52
73747363: stsc
00000000: version flag 0
00000003: entry count 3

00000001: first_chunk 1
0000000F: samples_per_chunk 15
00000001: sample_description_index 1
...

文件中Entrys數(shù)據(jù)如下:

first_chunk samples_per_chunk sample_description_index
1 15 1
27 30 1
28 22 1
  1. entry 1: 第 1 個(gè) chunk 開始遭赂,有 26 個(gè)包含 15 個(gè) sample的 chunk
  2. entry 2: 第 27 個(gè) chunk循诉,有 30 個(gè) sample
  3. entry 3: 第 28 個(gè) chunk,有 22 個(gè) sample

所以全部的sample count = 390 + 30 + 22 = 442撇他,與stts中的sample_counts值保持一致茄猫。

stsz

Sample Size Box狈蚤,指定了每個(gè)sample的size。stsz box包含兩sample總數(shù)和一張包含了每個(gè)sample size的表划纽。

image.png

完整參數(shù)信息參見下圖:

image.png

真實(shí)數(shù)據(jù)分析如下:

image.png
000006FC 7374737A 00000000 00000000 000001BA 000042C2 00000738 00001A6A 00002383 0000025B 000047CF 00000545 00003A1B 00000546 00003DD0 000010DE 00003AB7 000007F8 00003CC4 00000C89 000039D9 00002282 00002988 00000EBB 000031F8 000015B9 000026A4 0000098D 

000006FC: size 1788 
7374737A: stsz
00000000: version flag
00000000: Sample size 0
000001BA: Sample count 442 視頻track可用于確定視頻幀數(shù)

000042C2: 第一個(gè)sample(幀)大小 17090
...
...

stco

Chunk Offset Box脆侮,指定了每個(gè)chunk在文件中的位置,這個(gè)表是確定每個(gè)sample在文件中位置的關(guān)鍵勇劣。該表包含了chunk個(gè)數(shù)和一個(gè)包含每個(gè)chunk在文件中偏移位置的表靖避。

image.png

完整參數(shù)信息參見下圖:

image.png

真實(shí)數(shù)據(jù)分析如下:

image.png
00000080 7374636F 00000000 0000001C 000064C7 00026778 0004E1F5 00077C7A 0009996E 000BC0CD 000DD165 000F9A64 0010EA9C 0012D734 00147692 00166D4A 00183F7A 001ADEF2 001CC70B 001EB874 00204561 00221F51 0023C2E7 002676B4 00289C8B 002AB54B 002CCACE 002F1A66 0030F353 0032C3DF 003449E1 00379B7C

00000080: size 128
7374636F: stco
00000000: version flag
0000001C: entry count 28,有28個(gè)chunk

000064C7: 第一個(gè)Chunk offset 25799芭毙,與stsc(chunk包含sample的個(gè)數(shù))和stsz(每個(gè)sample的大小)一起筋蓖,可以找到具體序號(hào)的sample的位置和大小,用于讀取數(shù)據(jù)
...
...

需要注意退敦,這里stco只是指定的每個(gè)chunk在文件中的偏移位置粘咖,并沒有給出每個(gè)sample在文件中的偏移。想要獲得每個(gè)sample的偏移位置侈百,需要結(jié)合 Sample Size box(stss)和Sample-To-Chunk (stsc)計(jì)算后取得瓮下。

mdat box

mdat box用于存儲(chǔ)音視頻數(shù)據(jù),可從該Box解封裝出真實(shí)的媒體數(shù)據(jù)钝域。該Box一般都會(huì)存在讽坏,但非必須。

原始的NALU單元組成:

Start code + NALU header + NALU payload

但是在MP4文件中例证,H264 slice并不是以Start Code來分割路呜,而是存儲(chǔ)在mdat box的Data中。mdat box的格式:

Box header + Box Data
==>
Box size + Box type + (NALU length + NALU Header + NALU Data)..+..(NALU length + NALU Header + NALU Data)

下面通過分析真實(shí)MP4文件的mdat box的Data數(shù)據(jù):

image.png
0011A1C0 6D646174 01402280 A37D2085 2D2D2D2D 2D2D2D2D 2D2D2D2D 2D2D2D2D 2D2D2D2D 2D2D2D2D 2D2D2D2D 2D2D2D2D 2D2D2D2D 2D2D2D2D 2D2D2D2D 2D2D2D2D 2D2D2D2D

0011A1C0: size 1155520
6D646174: type mdat

參考資料

ISO/IEC 14496 Part 12:http://standards.iso.org/ittf/PubliclyAvailableStandards/index.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末织咧,一起剝皮案震驚了整個(gè)濱河市胀葱,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌笙蒙,老刑警劉巖抵屿,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異捅位,居然都是意外死亡轧葛,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門艇搀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來尿扯,“玉大人,你說我怎么就攤上這事焰雕≈运瘢” “怎么了?”我有些...
    開封第一講書人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵淀散,是天一觀的道長(zhǎng)右莱。 經(jīng)常有香客問我蚜锨,道長(zhǎng),這世上最難降的妖魔是什么慢蜓? 我笑而不...
    開封第一講書人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任亚再,我火速辦了婚禮,結(jié)果婚禮上晨抡,老公的妹妹穿的比我還像新娘氛悬。我一直安慰自己,他們只是感情好耘柱,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開白布如捅。 她就那樣靜靜地躺著,像睡著了一般调煎。 火紅的嫁衣襯著肌膚如雪镜遣。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,970評(píng)論 1 284
  • 那天士袄,我揣著相機(jī)與錄音悲关,去河邊找鬼。 笑死娄柳,一個(gè)胖子當(dāng)著我的面吹牛寓辱,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播赤拒,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼秫筏,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了挎挖?” 一聲冷哼從身側(cè)響起这敬,我...
    開封第一講書人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎肋乍,沒想到半個(gè)月后鹅颊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體敷存,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡墓造,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了锚烦。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片觅闽。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖涮俄,靈堂內(nèi)的尸體忽然破棺而出蛉拙,到底是詐尸還是另有隱情,我是刑警寧澤彻亲,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布孕锄,位于F島的核電站吮廉,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏畸肆。R本人自食惡果不足惜宦芦,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望轴脐。 院中可真熱鬧调卑,春花似錦、人聲如沸大咱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽碴巾。三九已至溯捆,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間厦瓢,已是汗流浹背现使。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留旷痕,地道東北人碳锈。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像欺抗,于是被迫代替她去往敵國(guó)和親电抚。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

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

  • “本文轉(zhuǎn)載自:1.[小夕nike]MP4 封裝格式[https://www.cnblogs.com/moonwal...
    DarcyZhou閱讀 1,503評(píng)論 1 2
  • MP4簡(jiǎn)介 MP4(MPEG-4 Part 14)是一種常見的多媒體容器格式庆揩,它是在“ISO/IEC 14496-...
    FlyerGo閱讀 3,217評(píng)論 0 2
  • Mp4是一種非常常見的一種音視頻封裝格式婶溯,因?yàn)榧嫒菪詮?qiáng),所以被普遍使用佃声。今天總結(jié)了一下Mp4格式艺智。 Mp4格式是一...
    幸福有你_abb7閱讀 3,692評(píng)論 0 1
  • 原文鏈接: http://blog.sina.com.cn/s/blog_48f93b530100jz4x.htm...
    之江狂徒閱讀 872評(píng)論 0 0
  • 目錄 概述 mp4文件基本信息 封裝格式重要概念 重要box介紹 其他box介紹 實(shí)用技術(shù) 開源軟件 參考 [1]...
    smallest_one閱讀 59,812評(píng)論 5 61