MP4文件分为两部分:
元数据 metadata 保存帧的时间信息,视频帧占用空间大小,在文件中位置等媒体数据的参数
媒体数据 media data 真正的音视频数据
MP4文件中的时间都是相对时间,插入删除帧时候,文件时间戳不需要重新写入
媒体数据有流stream组成 , 所有流之间的交互关系保存在元数据当中,所以媒体数据可以以一种自然的方式连续存放
使用Hint来指导流媒体服务器按照某种协议将数据打包,是MP4文件独立于流式传输中使用的协议
MPEG-4四种基本流:Visual , Audio ,Object Descriptor (OD), Binary Format For Scene (BIFS),它们以轨道(track)的方式来组织,每个轨道看成是一段连续Access Unit(AU) , AU是基本流中的一个单独存取部分,
Visual Audio 是传统的视频音频流数据
BIFS 用来描述场景中AV,可以理解为一棵树,每个节点都有属性和其他一些信息,叶子节点对应基本AV数据
OD 对象描述符,为一个或多个基本流描述符的集合,对象描述符也可以以基本流方式传输。
对象描述符用对象描述符ID来标识,将场景中单个节点和AV对象关联。基本流描述符也使用数字标识符,称为ES_ID; 来识别一个单独的基本流,一个基本流描述符中包含一些解码过程必须的初始化和配置信息。
MP4文件中的元数据区域专门用编辑列表(edit list)来记录一个AU和它的下一个AU之间时间的差异,这个差异称为延迟(duration)。
每个AU都有一个解码时间戳(decoding time stamp)和合成时间戳(composition time stamp)
每个轨道都有一个时间刻度,它定义该轨道时钟的速度,使用一个合适的时间刻度就可以精确定义播放该轨道内容的速度。
这样,通过使用编辑列表、解码时间戳和合成时间戳就可以计算出MP4文件中每个轨道中流的同步关系。
文件存储结构:
MP4文件通过原子(atom)来组织数据。一个原子是一个容器
【ftyp原子容器】定义了文件的大小
所有媒体数据(AU)保存在【mdat的原子容器】当中
元数据保存在【moov原子容器】当中
【trak原子容器】定义了一些有关轨道的辅助信息
【iods】原子容器保存初始化对象描述符(Initial Object Descriptor,IOD)该对象通过ES_ID指向基本流
参考文献:
《基于对象的MPEG-4文件格式研究》