1、mp4文件,是由多个Box或FullBox组成
2、 Box,每个Box由Header和Data组成,FullBox,是Box的扩展,Box结构的基础上在Header中增加8bits version和24bits flags
3、 Header,包含了整个Box的长度size和类型type。当size==0时,代表这是文件中最后一个Box;当size==1时,意味着Box长度需要更多bits来描述,在后面会定义一个64bits的largesize描述Box的长度;当type是uuid时,代表Box中的数据是用户自定义扩展类型。
4、 Data,是Box的实际数据,可以是纯数据也可以是更多的子Boxes,见下图:
推荐一个mp4的图形界面解析工具:mp4info
上图左侧栏 ftyp moov trak tkhd edts elst mdia 等都是一个Box,moov 包含 trak
ftyp 是第一个box,二进制数据见下图
(1) 00 00 00 1c 是ftyp的大小----共28字节
(2) 66 74 79 70 是ftyp的类型ASCII值----ftyp
(3) 6d 70 34 32 在版本号 mp42
(4) 00 00 00 01 小版本号
(5) 6d 70 34 31 / 6d 70 34 32 / 69 73 6f 6d 兼容版本号 mp42 / mp41 / isom
moov
00 02 a7 cc 大小----174028
6d 6f 6f 76 类型ASCII值----moov
mvhd
00 00 00 6c 大小----108
6d 76 68 64 类型ASCII值----mvhd ,
00 00 00 00 这个是FullBox----8bits version和24bits flags
d9 19 03 20 创建时间 3 642 295 072 从UTC时间的1904年1月1日0点至今的秒数
d9 19 03 20 修改时间
00 00 02 58 Time scale 文件在1秒时间内的刻度 Time scale----600 duration / timescale = 可播放时长(s)
00 02 99 e0 duration 该track的时间长度,用duration和Time scale值可以计算track时长---170464
00 01 00 00 媒体速率,这个值代表原始倍速
01 00 媒体音量,这个值代表满音量
接下来的一系列值都是结构中的预定义值,参见结构定义即可
thkd
00 00 00 5c 大小----92
74 6b 68 64 类型ASCII值----tkhd
00 00 00 01 这个是FullBox----8bits version和24bits flags
d9 19 03 20 创建时间 3 642 295 072 从UTC时间的1904年1月1日0点至今的秒数
d9 19 03 20 修改时间
00 00 00 01 trak id号,不能重复且不能为0
00 00 00 00 保留的
00 02 99 e0 duration时长---170464
00 00 00 00 00 00 00 00 保留的
00 00 视频层,默认为0,值小的在上层
00 00 track分组信息,默认为0表示该track未与其他track有群组关系
01 00 媒体音量,这个值代表满音量
00 00 保留的
接下来36个字节为视频变换矩阵
01 70 00 00 宽 368
02 70 00 00 高 624
avcC--sps pps
在H264中,SPS和PPS存在于NALU header中,而在MP4文件中,SPS和PPS存在于AVCDecoderConfigurationRecord, 首先要定位avcC
00 00 00 2a 大小----42
61 76 63 43 类型ASCII值----avcC
图片转自 https://www.cnblogs.com/ghw-NO1/archive/2012/08/27/2658896.html