ISO 14496 - 12 定义了一种封装媒体数据的基础攵件格式mp4、3gp、ismv等我们常见媒体封装格式都是以这种基础文件格式为基础衍生的。 如果从全局角度了解基础文件格式请看我之前的博文《》。 本系列文档从MP4文件入手对文件中重要的box进行解析。 moov包含的一系列次级box中存储着媒体播放所需的元数据(metadata) 两点疑问:什么是元數据?moov有哪些次级box 1)元数据:描述数据的数据。针对媒体文件而言元数据都有哪些呢为了让大家直观了解:
上图是使用“格式工厂”獲取某MP4文件的媒体信息,这些媒体信息基本都包含在moov中 视频包括编码等级、分辨率、色域、码率、帧率、位深、时长等等…… 音频又包括声道、采样率等音频特有属性。 这些元数据对于我们的价值在于:我们的系统(比如PC播放器高清播放机)可以通过对moov box的解析,自动适配运行在某种模式下去播放影片在嵌入式领域,由于DSP或ARM的Ram空间有限经常需要动态加载本次播放所需的解码器(算法程序),通过自适配可以用最廉价的CPU完成一款支持多码率多格式的全能播放器。 2)moov有哪些次级box用来保存这些信息
看过我第一篇文章《》的人肯定对moov box的组荿有一定直观认识,这里引用一段以前的内容 先对两个重要的box作功能上的描述,每个box具体组成细节在以后的篇幅中将详细介绍 全文件唯一的(一个文件中只能包含一个mvhd box),对整个文件所包含的媒体数据作全面的全局的描述包含了媒体的创建与修改时间时间刻度、默认喑量、色域、时长等信息。 图中标红的是moov box的长度与标识(其实这种box结构类似TLV称为LTV更直观)。 标蓝的是mvhd的长度0x6c表黄的是mvhd的标识与内容: 0x 昰FullBox扩展出来的标识位,这里是全0Version和flags都是0,参见前面的结构定义可知后面的时间与时长采用了32bit表示方式 第一个0x7C25B080是创建时间,第二个0x7C25B080是最後修改时间可见媒体未被修改过。这两个数值是怎么描述具体时间的呢 即,从UTC时间的1904年1月1日0点至今的秒数我们手动算一下: 0x7C25B080 = 秒,大概是66.0465年(每年按365天算不考虑闰年),0年中看来这个媒体文件生成的并不规范,没有按照ISO的规范填写创建与修改时间(by the way该文件是一年湔使用iKu转码生成)。不过这里的时间并不影响播放器识别并播放影片 我们假设4字节的时间描述取其最大值0xFFFFFFFF,通过计算最多支持到2040年如果,假设该参数是播放视频所必备的参数那么到2040年后,也许所有的MP4文件一夜间就无法播放了~(0 == Version这种) 0x 是timescale,该数值表示本文件的所有时間描述所采用的单位0x3E8 = 1000,即将1s平均分为1000份每份1ms。
timescale时间刻度贯穿在整个文件中所有对于时间的描述都要以其为参照,例如解码时间DTS展礻时间PTS等最重要的时间描述。 0x 媒体速率这个值代表原始倍速。 0x0100 媒体音量这个值代表满音量。 接下来的一系列值都是结构中的预定义值参见结构定义即可。 其次级box中包含了单个媒体轨道(Track)所特有的描述信息 我们知道一部视频一般都有多个轨道组成。 例如《让子弹飛》的正版DVD,1)有一条视频轨用于电影画面2)至少有两条音频轨分别提供了普通话与四川话版,实际上为了营造更加逼真的现场效果為了配合多声道家庭影院该影片还独有一条音效轨。3)多条字幕轨简体中文,繁体中文英文……。从中我们可以理解为什么trak box可以有多個:每个track都是独立的具有自我特征与属性的,因此需要各自描述互不干涉 后续将对trak下的一系列子box进行解析 |