MP4由一系列的box组成,每一个box存放了不同的数据,box里面还可以嵌套box。最外层主要有三个box,分别是ftyp box、moov box和mdat box。其中最重要最复杂的就是moov box了,里面存放了音视频的基本信息和每一个音视频数据的具体位置。
box header
MP4总体box分布
ftyp box
ftyp box放在MP4文件的开始,用来表示文件类型。
mdat box
mdat box是音视频数据存放的地方,mdat box基本由头部和数据俩部分组成,box type是“mdat”的ASCII码值。对于H264来说,是一个个NALU,这里的NALU不再包含SPS和PPS,这些数据已经放到了moov box里面,这个的NALU类型是图像数据或者SEI数据。
moov box
moov box用来存放Metadata信息。里面会一层层嵌套很多层box。总体嵌套逻辑就是movie里面是track,track里面是sample,多个sample组成了一个个chunk。
- sample:视频的一帧和音频的一段编码数据称之为一个sample
- chunk:连续几个sample称之为chunk
- track:视频所有的sample或者音频所有的sample组成track
moov box主要包含以下2种类型的box
- moov box首先有一个mvhd box主要存放文件的基本信息,比如MP4文件的创建时间、时间单位、总时长等信息。
- 音频和视频各有一个trak box。具体是音频trak还是视频trak,会在trak box中的mdia box里面的hdlr box表示出来。
trak box主要包含以下2种类型的box
- tkhd box主要表示track的一些基本信息,比如视频的宽、高。音频的音量信息等。
- mdia box,是媒体信息box。包含了3个子box,一个是mdhd box,一个是hdlr box,一个是minf box这个box包含了sample的很多信息,这些信息是找到并使用音频和视频数据的关键。
mdia box主要包含以下3种类型的box
- mdhd box包含了时间单位time scale,这个时间单位是sample的时间戳单位,控制播放速度和音视频同步都用这个值。
- hdlr box主要包含了track的类型信息,表明是音频还是视频track。
- minf box里面包含了stbl box,里面存放着可以计算得到每一个chunk的偏移地址、每一个sample在文件中的地址信息和大小、每一个sample的时间戳和每一个视频IDR帧的地址信息
minf box放置的关键box
- stts box放置每一个sample的时长,这个值是DTS。
- ctts box放置CTS,就是每一个sample的PTS和DTS的差值。
- stss box放置的是那些sample是关键帧。
- stsc box放置的是sample到chunk的映射表。
- stco box或者co64 box放置每个chunk在文件中的偏移位置。
- stsz box放置每一个sample的大小。
文章来自多方面的学习积累,请各位大佬指正