mp4格式(轉)

原文地址:mp4格式(轉)作者:滄海笑

ftyp:
這是一個筐,可以裝mdat等其他Box。
例:00 00 00 14 66 74 79 70 69 73 6F 6D 00 00 02 00 6D 70 34 31
語義爲:ftyp: Major brand: isom
Minor version: 512
Compatible brand: mp41
free|skip
空白Box.裝在ftyp等筐裏
例:00 00 00 08 66 72 65
語意爲: free: (null)

moov:
這是一個筐,裏面很豐富
例:00 00 07 63 6D 6F 6F 76
本身屬性沒有。但後面全是它的內容
mvhd:
這是moov的header.
例: 00 00 00 6C 6D 76 68 64 00 00 00 00 7C 25 B0 80
7C 25 B0 80 00 00 03 E8 00 00 06 14 00 01 00 00
01 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00
00 00 00 00 00 00 00 00 00 00 00 00 40 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 03

語義:
creation_time:2082844800 modification_time:2082844800
timescale:1000 //一秒分多少份,這裏1000表示時間單位爲1毫秒,這個設置很重要
duration:1556 rate:10000 表示1.0 volume:100 表示最大聲
reserved:0 reserved[0]:0 reserved[1]:0
Matric[0]:10000 Matric[1]:0 Matric[2]:0 Matric[3]:0 Matric[4]:10000
Matric[5]:0 Matric[6]:0 Matric[7]:0 Matric[8]:40000000
Predefined[0]:0 Predefined[1]:0 Predefined[2]:0 Predefined[3]:0
Predefined[4]:0 Predefined[5]:0 next_track_ID:3

tkhd:
這是track header
例: 00 00 00 5C 74 6B 68 64 00 00 00 0F 7C 25 B0 80
7C 25 B0 80 00 00 00 01 00 00 00 00 00 00 06 08
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00
40 00 00 00 02 40 00 00 01 E0 00 00  
語義:
creation_time:2082844800 modification_time:2082844800
track_ID:1 第一軌index, 這個值很重要, 直接決定了視頻和音頻是否能同時出現, 如果音頻和視頻的track_ID都是1, 則會導致播放器無法播放.
reserved_1:0
duration:1544 //這個值對播放器很重要, 具體時間還和mvhd的timescale相關,用來指定了時長,1544個時間單位,如果是毫秒爲單位,則爲1544毫秒,
volume:0 //這是視頻軌,無音響 reserved_2[0]:0 reserved_2[1]:0
layer:0 //由於我們的視頻只有一層,所以這裏總是0
alternate_group:0 reserved_3:0
Matric[0]:10000 Matric[1]:0 Matric[2]:0 Matric[3]:0 Matric[4]:10000
Matric[5]:0 Matric[6]:0 Matric[7]:0 Matric[8]:40000000
width:2400000 height:1e00000 //這兩個單位都要右移16位才靠譜

例2語義:
creation_time:2082844800 modification_time:2082844800
track_ID:2 reserved_1:0 duration:1556 //這個值對播放器很重要, 用來指定了時長,具體時間還和mvhd的timescale相關
volume:100 //這是音頻軌,最大聲 reserved_2[0]:0 reserved_2[1]:0
layer:0 //只對視頻有意義 alternate_group:0 //總是0
reserved_3:0 Matric[0]:10000 Matric[1]:0 Matric[2]:0 Matric[3]:0
Matric[4]:10000 Matric[5]:0 Matric[6]:0 Matric[7]:0 Matric[8]:40000000
width:0 height:0

mdia:
這個Box沒有屬性,是一個筐,裝在trak裏
mdhd: mdia header
例1:視頻
creation_time:2082844800 modification_time:2082844800
timescale:24000 //這個位決定了播放的速度,不過他與duration的相乘後還是可以對應上面的mvhd設置
duration:37037
pad:0
Language[0]:21 Language[1]:14 Language[2]:4
pre_defined:0

例2:聲頻
creation_time:2082844800 modification_time:2082844800
timescale:44100
duration:68608
pad:0 //這個位無意義,是爲了將後面language湊夠16位之用
Language[0]:21 Language[1]:14 Language[2]:4
pre_defined:0

hdlr: handler
例1:視頻
pre_defined:0 handler_type:vide //似乎除了handler_type以外,其餘的屬性無意義
reserved0 reserved:0 reserved:0

例2:聲頻
pre_defined:0 handler_type:soun
reserved:0 reserved:0 reserved:0

vmhd: Video media header
例:
graphicsmode:0 //Video軌的合成模式,未知語義
opcolor:0 opcolor:0 opcolor:0 //同樣未知

dref: data referrence
例:
entry_count:1 //只有一條Entry
url: //即使有也是沒內容,測試文件無論音視都沒有內容

stsd: Sample Description box
這是一個table, 裏面放有很多entry
例:entry_count:1 //視頻,有一條entry

VisualSampleEntry: stsd裏裝的一條一條的視頻entry,
例:
data_reference_index:1
pre_defined[0]:0
pre_defined[1]:0 pre_defined[2]:0
width:576 height:480
horizresolution:480000 vertresolution:480000 //常數,即72dpi
reserved:0 frame_count:1 compressorname://無
depth:24 //顏色深度
pre_defined:-1

AudioSampleEntry: stsd裏裝的一條一條音頻entry
例:reserved[0]:0 reserved[1]:0
channelcount:2 samplesize:16 pre_defined:0 reserved_2:0
samplerate:ac440000 //顯然要右移16位纔有意義

stts: Time to sample
例1: 視頻
entry_count:1
sample_count:37 //上面已經有duration時間了,duration指整個mdat中video的時長,這裏37卻爲chunks數目
sample_delta:1001 //1001 * 37=37037 sample_delta*sample_count=duration

例2: 音頻
sentry_count:1
sample_count:67 //音頻分了67個chunks
sample_delta:1024 //同上

stss: syn Sample box
例1: 視頻
entry_count:1
sample_number:1

但音頻裏沒有這個box,
這個Box非常重要, 決定了整個mp4文件是否可以拖拉, 如果這個box只有一個entry,則拖拉時將cpu達到100%, 如果這個box不存在, 可以拖拉, 也不會達到100%, 但是會略等一會, 通常做法可以搞100條.

stsc: Sample To Chunk Box 這個box非常重要,指示了在某一個chunk開始後面的chunks裏每chunk有多少個sample, 一個sample就是一幀
例1:視頻
entry_count:1
first chunk: 1, sample per chunk: 1, sample description index 1

例2:音頻
entry_count:1
first chunk: 1, sample per chunk: 1, sample description index 1

stsz: Sample Size Box, 這個box乃重中之重, 指示了每個sample的大小
例1:視頻
sample size: 0 sample count: 37
5127 855 830 2327 2742 2373 2716 2365 3061
2170 1888 2427 2578 2218 2084 2138 2319 2586
2728 2322 3505 2624 1551 2725 2502 2072 1720
1382 2653 2177 1323 1492 1801 1765 1985 5028
3467
例2:音頻
sample size: 0 sample count: 65
219 205 207 182 213 194 195 194 212
188 159 179 186 189 184 184 190 188
190 186 195 196 182 197 182 186 182
182 185 182 193 186 184 187 175 173
170 185 171 181 178 178 185 192 188
187 175 167 177 182 167 173 177 175
176 174 170 168 169 180 164 167 176
170
mdat Box中被劃分爲很多個chunk,這裏指出了每個chunk的大小.

stco: Chunk Offset Box,這也是最重要的box, 指示了每個chunk的開始位置
例1: 視頻
entry_count:37
0x24 0x15d3 0x1aaf 0x1f84 0x2a20 0x35aa 0x404a 0x4c53 0x5705
0x6470 0x6da6 0x767c 0x8174 0x8d00 0x9725 0xa003 0xa9c9 0xb447
0xbfdc 0xcbf7 0xd5b8 0xe4c0 0xf064 0xf7da 0x103ea 0x10e70 0x117ff
0x1200d 0x126da 0x1328b 0x13bbd 0x14247 0x14973 0x151cd 0x15a0a 0x16272
0x17770

例2:音頻
entry_count:65
0x142b 0x1506 0x192a 0x19f9 0x1ded 0x1ec2 0x289b 0x295e
0x34d6 0x3eef 0x3fab 0x4ae6 0x4b99 0x5590 0x564d 0x62fa
0x63b2 0x6cea 0x7506 0x75be 0x7ff7 0x80b1 0x8b86 0x8c4a
0x95aa 0x966f 0x9f49 0xa85d 0xa913 0xb2d8 0xb391 0xbe61
0xbf22 0xca84 0xcb3c 0xd509 0xe369 0xe416 0xef00 0xefb9
0xf673 0xf728 0x1027f 0x10331 0x10db0 0x11688 0x11744 0x11eb7
0x11f66 0x12573 0x12624 0x13137 0x131de 0x13b0c 0x140e8 0x14197
0x1481b 0x148c9 0x1507c 0x15124 0x158b2 0x15966 0x161cb 0x17616
0x176c6

smhd: sound media header
例:
balance:0 reserved:0
暫時未知語義

avcC: AVC descriptor box 非常重要, SPS PPS 都放這 在14496-15定義
例:
configurationVersion:1 AVCProfileIndication:66
profile_compatibility:192 AVCLevelIndication;31
reserved_1:63 lengthSizeMinusOne:3
reserved_2:7
numOfSequenceParameterSets:1 numOfPictureParameterSets:1
SPS length: 24 //第一個SPS的長度, 多個SPS可以繼續往下
PPS length: 4 //第一個PPS的長度, 多個PPS可以繼續往下

btrt: bit rate box
bufferSizeDB:7858 //告訴decoder開闢緩衝區大小?
maxBitrate:413432 //最大Bit rate
avgBitrate:371960 //平均Bit rate

mp4a: aac box 這個box實際就是繼承了audio sample entry box
reserved[0]:0 reserved[1]:0
channelcount:2 samplesize:16
pre_defined:0 reserved_2:0 samplerate:56220000

esds: 包含在mp4a裏,
length:3
ES_ID:6400
streamDependenceFlag:0
URL_Flag=0 reserved=0
streamPriority:1 streamDependenceFlag:0
dependsOn_ES_ID:52685
m_iData_Size:23 //data的長度,算出來的
Data[23] //這裏面有很一堆不知所云的數據, 一直到stts,但這堆數據極度重要,直接決定了解碼器能否解碼,在11496-1裏有定義
//實踐證明: 這組數據與採樣率有關,44100一組, 22050一組, 48000又是一組, 44100可以與48000共用一組

Trouble shooting
1, 播放速度不正常, 哪個參數可調?
mdhd->timescale, 數字越大, 則播放速度越快

2, 拖拉不正常, 哪個Box可調?
stss, 如果只有一條entry, 則拖拉會產生cpu 100%的情況. 如果沒有entry, 則拖拉會略有停頓
3, 音頻,視頻分別整合成mp4文件可以播放, 但音頻,視頻都整合進mp4文件以後就無法播放.
trak->track_id, 兩軌可能都用同一ID, 則不成. 視頻爲1, 音頻爲2,則可以解決這個問題

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章