http://blog.csdn.net/nogodoss/article/details/39368721
版权声明:本文为博主原创文章,未经博主允许不得转载。
抽了一段时间学习了MP4文件格式.也解析了一个mp4文件的样本.留以自用或帮助需要帮助的人.
其中有些地方本人也不很明白(我也标注了).希望明白的人指点说明.
以下MP4文件从网上随意找的.
/begin ftyp部分的解析 /
00 00 00 14 //4字节 length (长度为20字节)
66 74 79 70 //4字节 BoxType (“ftyp” box的标识)
69 73 6F 6D //4字节 Major_brand (“isom”)
00 00 00 01 //4字节 Minor_version (iosmo 的版本号)
69 73 6F 6D //4字节 Compatible_brands /*本文件只遵从ismo协议, 注:有些支持iso2,mp41,那么这个字段就会随着支持的协议而增加字节数*/
/end ftyp部分的解析 /
/begin moov box(Moive Box)部分的解析 /
00 01 17 7A 但是这里不明白00 01 17 7A是什么含义??
6D 6F 6F 76 /*6D 6F 6F 76 标识为moov*/
/*Moov Box或者称Moive Box的头,每个MP4文件必须带有moov Box. 而moov Box下必须包含mvth Box */
// begin mvhd Box 解析
00 00 00 6C //4字节 Box Size /*长度为108字节*/
6D 76 68 64 //4字节 Box type /*“mvhd” 标识*/
00 //1字节 version
00 00 00 //3字节 flag
CF 28 A8 65 //4字节 Creation time 创建时间
CF 28 A8 65 //4字节 Modification time 修改时间 (/*创建时间和修改时间一样,说明文件创建后就没有修改过*/)
00 00 02 58 //4字节 time scale 表示本文件的所有时间按描述说采用的单位,0x258=600,即1秒平均分成600份.
00 02 1E DB //4字节 duration 时间长度 0x21EDB=138971./* duration / timesacel = 可播放时长. 138971 /600 = 231.说明这个文件可以播放231.0秒*/
00 01 00 00 //4字节 rate 播放速率 /*0x00010000 表示原始倍速*/
01 00 //2字节 volume 音量 /*0x0100 表示满音量*/
00 00 00 00 00 00 00 00 00 00 //10字节 保留字段
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 //36字节 视频变换矩阵
00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 //24字节 pre-defined
00 00 00 03 //4字节 下一个track id Next track ID
/end moov box(Moive Box)部分的解析 /
00 00 00 15 69 6F 64 73
00 00 00 00 10 07 00 4F FF FF 29 01 FF 00 00 64 A1 /*这一段不明白含义*/
/begin Track Header Box(tkhd)部分的解析 /
74 72 61 6B /*其中74 72 61 6B 表示’trak’*/
00 00 00 5C //4 字节 Box size
74 6B 68 64 // 4字节 Box type /* tkhd */
00 //1字节 version
00 00 01 //3字节 falg /*不为0 */
CF 28 A8 65 //4字节 创建时间
CF 28 A8 66 // 4字节 修改时间 /* 创建时间和修改时间不一致,说明tkhd这块创建后修改过*/
00 00 00 01 // 4字节 track id (0x00000001= 1 从1开始)
00 00 00 00 // 4字节保留
00 02 1E B8 //4字节 duration track的时间长度 0x00021EB8 = 138936
00 00 00 00 00 00 00 00 //8字节的保留
00 00 //2字节 layer 视频层
00 00 //2字节 alternate group track 分组信息
00 00 //2字节 valume 音量 /*为0表明不是最大音量*/
00 00 //2字节 保留字段
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 //36字节 视频变换矩阵
02 80 00 00 //4字节 宽度 /*这么大的宽度?*/
01 68 00 00 // 4字节 高度 /*这么大的高度?*/
/end Track Header Box(tkhd)部分的解析 /
00 00 64 3D /*这一段不明白含义*/
/begin Media Header Box(mdhd)部分的解析 /
6D 64 69 61 // 4个字节 mdhd 标识 /*mdia*/
00 00 00 20 // 4字节 Box size
6D 64 68 64 //4字节 Box type /*“mdhd”*/
00 //1字节 version
00 00 00 // 3字节 flag
CF 28 A8 65 //4字节 创建时间
CF 28 A8 66 //4字节 修改时间
00 00 61 A8 //4字节 time scale //0x61A8=25000
00 58 55 48 //4字节 duration //0x585548=5789000
55 C4 //2字节 语言码
00 00 //2字节pre-defined
/end Media Header Box(mdhd)部分的解析 /
/begin Hander Reference Box(hdlr)部分的解析 /
00 00 00 26 //4字节 Box size
68 64 6C 72 //4字节 Box type /*hdlr*/
00 //1字节 version
00 00 00 //3字节 flag
00 00 00 00 //4字节 pre-defined
76 69 64 65 //4字节 handle type /* 0x76696464 = “vide” */
00 00 00 00
00 00 00 00
00 00 00 00 //12字节 保留字段
76 69 64 65 6F // 不定长度的name /* 0x766964656F= “video”*/
/end Hander Reference Box(hdlr)部分的解析 /
/begin Media Information Box(minf)部分的解析 /
mind Box下包含有
Video Media Header Box( vmhd),
Sound Media Header Box(smhd),
Hint Media Header Box(hmhd)三种
00 00 00 63 EF /* 这段也不明白含义, 也许与上下都有联系*/
6D 69 6E 66 //4字节 Box type /*minf*/
/begin Video Media Header Box(vmhd)部分的解析 /
00 00 00 14 // 4字节 Box size 0x14=20
76 6D 68 64 // 4字节 Box type /*vmhd*/
00 // 1字节 version
00 00 01 //3字节 flag
00 00 00 00 //4字节 graphics mode
00 00 00 00 //4字节 opcolor
/end Video Media Header Box(vmhd)部分的解析 /
/begin Data Information Box(dinf)部分的解析 /
00 00 00 24 //4字节 Box size /*0x24= 36*/
64 69 6E 66 //4字节 Box type /*dinf*/
00 00 00 1C //4字节 Box size (dref的长度 0x1C= 28)
64 72 65 66 //4字节 Box type 0x64726566=“dref”
00 // 1字节 version
00 00 00 //3字节 flag
00 00 00 01 // /*这个不知道含义(根据经验推理Box type 后面是1个字节的version,3个字节的flag,后面有url,而url前是4个字节的url count)*/
00 00 00 0C //4字节 entry count /*url 的count*/
/*也可能前面的0x00000001是entry count.原因是url只有一个*/
75 72 6C 20 //url 列表 /*其中 0x75726C为”url”, 0x20 为空字符.意思是url为空*/
/end Data Information Box(dinf)部分的解析 /
00 00 00 01 00 00 63 AF /* 这段也不明白含义, 也许与上下都有联系*/
/Begin Sample Table Box(stbl)部分的解析 /
73 74 62 6C //4字节 STBL标识头 “stbl”
/Begin Sample Description Box(stsd)部分的解析 /
00 00 00 C7 //4字节 Box Size /*0xC7=199*/
73 74 73 64 //4字节 Box type /*0x73747364=“stsd”*/
00 //1字节 version
00 00 00 //3字节 flag
00 00 00 01 //4字节 entry_count /* 0x01=1 说明有一个entry */
//以下为AudioSampleEntry
00 00 00 B7 // 4字节 sample description 的字节数 /*0xB7=183*/
6D 70 34 76 //4字节 存储数据格式 /*0x6D703476=‘mp4v’*/
00 00 00 00 00 00 //6字节 保留字段
00 01 //2字节 数据引用索引 /*利用这个索引与当前sample description 关联的数据,数据引用存储在 Data reference Bos中*/
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 02 80 01 68 00 48 00 00
00 48 00 00 00 00 00 00 00 01 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 00 00 00 18 FF FF 00 00
00 10 70 61 73 70 00 00 00 01 00 00 00 01 00 00
00 51 65 73 64 73 00 00 00 00 03 43 00 00 00 04
3B 20 11 00 C3 9D 00 37 63 A8 00 17 60 80 05 2C
00 00 01 B0 01 00 00 01 B5 89 13 00 00 01 00 00
00 01 20 00 C4 8D 88 00 CD 14 04 2D 14 43 00 00
01 B2 4C 61 76 63 35 33 2E 38 2E 30 06 01 02
/end Sample Description Box(stsd)部分的解析 /
/Begin Time To Sample Box(stts)部分的解析 /
00 00 00 18 //4字节 Box Size /*0x18=24*/
73 74 74 73 //4字节 Box type /*0x73747473=’stts’*/
00 //1字节 version
00 00 00 //3字节 flag
00 00 00 01 //4字节 entry_cout /* 0x01=1 说明有一个entry*/
00 00 16 9D //4字节 sample_count /*0x169D=5789,说明有5789个样本(sample)*/
00 00 03 E8 //4字节 sample_delta /*0x03E8=1000,*/
/*sample_count和sample_dalta说明: 该文件有5789个样本(sample),每个样本(sample)的时间为1000, 这样结合mdhd中的timescale=25000. 每个sample的时长:1000/25000=0.04秒*/
/end Time To Sample Box(stts)部分的解析 /
/Begin sync Sample Box(stss)部分的解析 /
00 00 00 70 //4字节 Box size /*0x70=112*/
73 74 73 73 //4字节 Box type /*0x73747373=’stss’*/
00 //1字节 version
00 00 00 //3字节 flag
00 00 00 18 //4字节 Number of entries /*数量*/
00 00 00 01 00 00 00 FB
00 00 01 F5 00 00 02 EF 00 00 03 E9 00 00 04 E3
00 00 05 DD 00 00 06 D7 00 00 07 D1 00 00 08 CB
00 00 09 C5 00 00 0A BF 00 00 0B B9 00 00 0C B3
00 00 0D AD 00 00 0E A7 00 00 0F A100 00 10 9B
00 00 11 95 00 00 12 8F 00 00 13 89 00 00 14 83
00 00 15 7D 00 00 16 77
/end sync Sample Box(stss)部分的解析 /
/Begin Sample to chunk Box(stsc)部分的解析 /
00 00 00 34 //4字节 Box size /*0x34=52*/
73 74 73 63 // 4字节 Box type /*0x73747363=’stsc’*/
00 //1字节 version
00 00 00 //3字节 flag
00 00 00 03 //4字节 Number of entries
/*第一个chunk*/
00 00 00 01 //4字节 first chunk /*第一个chunk的序号, 0x01表示1序号*/
00 00 00 0D //4字节 Samples per chunk /*当前trunk内的sample数目, 0x0D=13,当前有13个sample数据*/
00 00 00 01 //4字节 /*与这些sample关联的sample description 的序号*/
/*第二个chunk*/
00 00 00 02
00 00 00 0C
00 00 00 01
/*第三个chunk*/
00 00 01 E3
00 00 00 04
00 00 00 01
/end Sample to chunk Box(stsc)部分的解析 /
/Begin Sample Size Box(stsz)部分的解析 /
00 00 5A 88 //4字节 Box size /*0x5A88 = 23176*/
73 74 73 7A //4字节 Box type /*0x7374737A=’stsz’*/
00 //1字节 version
00 00 00 //3字节 flag
00 00 00 00 //4字节 sample size /*0表示所有的sample 有不同的长度,如果所有的sample都是1024长度,那就是0x400*/
00 00 16 9D //4字节 Number of entries /*0x169D=5789*/
00 00 2F F0 00 00 02 A7 00 00 01 A7 00 00 06 E0 00 00
08 7A 00 00 08 A2 00 00 07 58 00 00 0A AE 00 00
04 CA 00 00 36 0E 00 00 11 21 00 00 2F 60 00 00
41 39 00 00 3E 0A 00 00 18 1A 00 00 13 31 00 00
1A 1E 00 00 15 E8 00 00 11 E3 00 00 1A CC 00 00
00000380h: 15 21 00 00 14 BC 00 00 18 7B 00 00 21 BB 00 00
00000390h: 17 A1 00 00 16 BE 00 00 16 31 00 00 16 76 00 00
000003a0h: 17 8E 00 00 15 1D 00 00 15 3E 00 00 19 88 00 00
000003b0h: 16 A7 00 00 17 5E 00 00 17 A2 00 00 16 65 00 00
000003c0h: 15 F7 00 00 19 FA 00 00 15 DE 00 00 16 54 00 00
000003d0h: 18 3D 00 00 15 F1 00 00 16 7D 00 00 18 9B 00 00
000003e0h: 14 E5 00 00 17 A2 00 00 18 F2 00 00 58 27 00 00
000003f0h: 10 DB 00 00 19 F9 00 00 1C 86 00 00 17 41 00 00
00000400h: 19 5A 00 00 1F EB 00 00 16 F1 00 00 1A CF 00 00
00000410h: 1D C3 00 00 17 E9 00 00 19 B8 00 00 1D 7B 00 00
00000420h: 19 F9 00 00 1D 74 00 00 1F 63 00 00 15 99 00 00
00000430h: 17 DD 00 00 1C 77 00 00 19 44 00 00 1E A2 00 00
00000440h: 20 C1 00 00 17 55 00 00 1F CE 00 00 06 DA 00 00
00000450h: 1F A8 00 00 19 97 00 00 1B A0 00 00 19 60 00 00
00000460h: 18 E4 00 00 16 A9 00 00 1D 65 00 00 17 11 00 00
00000470h: 16 E1 00 00 1A 14 00 00 18 FE 00 00 17 05 00 00
00000480h: 1E 01 00 00 19 1B 00 00 1C 17 00 00 1A 49 00 00
00000490h: 18 2A 00 00 15 F1 00 00 21 18 00 00 18 EA 00 00
000004a0h: 19 7A 00 00 1C 63 00 00 15 BB 00 00 20 02 00 00
000004b0h: 08 27 00 00 1F 70 00 00 16 5E 00 00 14 B5 00 00
000004c0h: 19 E4 00 00 15 22 00 00 15 25 00 00 16 48 00 00
000004d0h: 17 BE 00 00 17 3A 00 00 1A 44 00 00 17 76 00 00
000004e0h: 18 42 00 00 18 D8 00 00 16 F4 00 00 15 1F 00 00
000004f0h: 1C 49 00 00 15 9B 00 00 18 68 00 00 15 9D 00 00
00000500h: 17 08 00 00 15 A8 00 00 18 54 00 00 1C 23 00 00
00000510h: 19 63 00 00 07 14 00 00 20 3E 00 00 16 93 00 00
00000520h: 19 23 00 00 20 60 00 00 16 64 00 00 16 2F 00 00
00000530h: 1A 5F 00 00 15 4D 00 00 16 9C 00 00 19 2E 00 00
00000540h: 17 34 00 00 19 09 00 00 1C 3D 00 00 14 D9 00 00
00000550h: 16 EC 00 00 20 50 00 00 13 E0 00 00 1C B2 00 00
00000560h: 22 4E 00 00 10 54 00 00 13 4A 00 00 1E CB 00 00
00000570h: 14 10 00 00 21 66 00 00 07 23 00 00 19 4E 00 00
00000580h: 1C E2 00 00 17 76 00 00 21 AD 00 00 10 DF 00 00
00000590h: 1C 0C 00 00 1C DE 00 00 12 08 00 00 1A 10 00 00
000005a0h: 20 BC 00 00 12 0E 00 00 1E 7B 00 00 10 0B 00 00
000005b0h: 1B 9A 00 00 18 B0 00 00 1D 74 00 00 0E 48 00 00
000005c0h: 1A 36 00 00 1A 9C 00 00 18 04 00 00 16 5F 00 00
000005d0h: 1F E5 00 00 17 29 00 00 18 84 00 00 06 B4 00 00
000005e0h: 21 91 00 00 14 D4 00 00 1D F1 00 00 22 44 00 00
000005f0h: 12 3C 00 00 20 C9 00 00 16 5B 00 00 1D A3 00 00
00000600h: 14 99 00 00 2A 5F 00 00 12 B3 00 00 17 40 00 00
00000610h: 22 FC 00 00 11 87 00 00 1D AF 00 00 16 FA 00 00
00000620h: 1B 7C 00 00 1E 2A 00 00 13 F1 00 00 1F 79 00 00
00000630h: 14 EC 00 00 25 6F 00 00 10 84 00 00 1A 0B 00 00
00000640h: 07 D0 00 00 1F 6B 00 00 1E 70 00 00 20 B9 00 00
00000650h: 14 A4 00 00 1D 10 00 00 1D 45 00 00 16 16 00 00
00000660h: 19 E8 00 00 1C D0 00 00 1F 8B 00 00 12 D9 00 00
00000670h: 20 0D 00 00 15 E4 00 00 1B 90 00 00 19 A1 00 00
00000680h: 1D E2 00 00 16 45 00 00 1A 70 00 00 1C A4 00 00
00000690h: 11 3B 00 00 1F E5 00 00 14 51 00 00 19 46 00 00
000006a0h: 32 91 00 00 08 9C 00 00 26 D4 00 00 1C 71 00 00
000006b0h: 18 D6 00 00 1B F9 00 00 1D AB 00 00 1F 23 00 00
000006c0h: 1D 94 00 00 29 A1 00 00 1E 13 00 00 20 28 00 00
000006d0h: 1E 94 00 00 1F 56 00 00 1A 4B 00 00 21 2B 00 00
000006e0h: 18 96 00 00 1C 65 00 00 1B 8E 00 00 1E 71 00 00
000006f0h: 15 D1 00 00 21 F0 00 00 21 56 00 00 1C 10 00 00
00000700h: 18 41 00 00 1E 2F 00 00 0B 94 00 00 22 CF 00 00
00000710h: 1D 3B 00 00 1D 80 00 00 B0 60 00 00 12 3F 00 00
00000720h: 2A E9 00 00 15 5D 00 00 16 1D 00 00 1E 3A 00 00
00000730h: 23 57 00 00 15 2D 00 00 18 00 00 00 1E FB 00 00
00000740h: 17 01 00 00 18 F8 00 00 18 34 00 00 1C 74 00 00
00000750h: 10 AD 00 00 21 6C 00 00 15 B9 00 00 13 E9 00 00
00000760h: 16 15 00 00 6C 56 00 00 14 6D 00 00 06 68 00 00
00000770h: 1E DB 00 00 15 A0 00 00 1A ED 00 00 16 AA 00 00
00000780h: 21 EA 00 00 11 B5 00 00 13 64 00 00 1F 1F 00 00
00000790h: 14 C6 00 00 19 B3 00 00 1E 3E 00 00 18 D8 00 00
000007a0h: 10 F2 00 00 1E D2 00 00 19 8C 00 00 17 8A 00 00
000007b0h: 20 52 00 00 0F FD 00 00 18 9E 00 00 19 A5 00 00
000007c0h: 16 E3 00 00 15 4C 00 00 1C F4 00 00 15 F1 00 00
000007d0h: 01 48 00 00 14 C4 00 00 19 86 00 00 11 A5 00 00
000007e0h: 1B 09 00 00 4B FB 00 00 11 BA 00 00 12 B1 00 00
000007f0h: 23 0F 00 00 12 FC 00 00 1D 9D 00 00 23 DE 00 00
00000800h: 13 3C 00 00 1B 3A 00 00 22 07 00 00 11 1A 00 00
00000810h: 1B E2 00 00 20 AD 00 00 19 57 00 00 19 F5 00 00
00000820h: 21 67 00 00 12 BD 00 00 1C DC 00 00 1D DF 00 00
00000830h: 15 38 00 00 04 80 00 00 1E 7E 00 00 20 2D 00 00
00000840h: 1C 52 00 00 1C B4 00 00 18 95 00 00 21 52 00 00
00000850h: 14 2C 00 00 25 62 00 00 15 F4 00 00 14 DD 00 00
00000860h: 2B AE 00 00 34 DF 00 00 1F BD 00 00 0E FC 00 00
00000870h: 28 DA 00 00 3F BA 00 00 44 65 00 00 32 88 00 00
00000880h: 36 A6 00 00 2F 93 00 00 34 AF 00 00 2F 56 00 00
参考:
http://wenku.baidu.com/view/ed93e51d227916888486d74a.html