3.2. MPEG音频数据

MPEG帧,除了开始部分的MPEG帧头外,余下的就是MPEG的音频数据。

需要注意的,MP3中的帧,是MPEG帧,其中的音频数据部分,是经过MP3的相关算法压缩后的数据,而不是原始采样过来的数据。

MPEG音频数据部分,包含了固定数目的 音频采样(Audio Sample)。

其中关于采样个数:

MPEG的不同规范(MPEG-1/2/3),以及同一规范中不同的Layer(Layer I/II/III),每一帧所对应的采样数,都是固定的,其具体的值参见下表:

表 3.4. MPEG帧的采样数索引表(单位:个/帧)

MPEG 1 MPEG 2 (LSF) MPEG 2.5 (LSF)
Layer I 384 384 384
Layer II 1152 1152 1152
Layer III 1152 576 576

[提示] 常见MP3每帧采样数

强调部分:就是我们此处所关心的,MPEG-1,Layer III,即MP3,不论是CBR还是VBR,文件中的每一帧,其采样的个数/采样数,都是固定的1152个。

而后面要介绍如何计算VBR MP3的播放时间,正是基于此前提:

MP3,即MPEG-1,Layer III,不论是CBR,还是VBR,每一帧的采样个数都是固定的1152个。即每一帧,都是固定的1152个采样。

同时,我们还要注意另外一点,那就是对于被某个编码器将原始音频数据编码为MP3数据后,得到的MP3文件,对于此单个文件,其采样率,始终都是一样的。也就是说,如果解析MP3的第一帧MPEG头得到的采样率是44100Hz的话,那么此MP3文件后面的所有的帧的采样率,也肯定都是44100Hz,即这个采样率,对于同一个MP3文件来说,是固定的。

于此相对的是,VBR中的Variable Bitrate,中的Variable,可变的,指的是,变化的比特率,而不是采样率。

总结一下就是:

CBR和VBR中的固定和可变,都是指的是比特率Bitrate,而不是采样率Sample Rate。对于同一MP3文件,不论CBR还是VBR,采样率都是固定的。

因为该采样率对应着此MP3被编码器编码的那一时刻,编码器的采样率也是最开始时候就设置好,并且之后不会再变化(除了你重新录制另外一个MP3文件)。

关于这个知识点,一定要搞清楚,否则就会出现我最开始遇到的情况,以为VBR的采样率也是变化的,导致别人问我那么是不是意味着对VBR MP3解码,每一帧都要重新设置解码器的采样率,如果回答是,那mplayer等常见解码器的代码实现中,没看到对应设置,只看到了最开始解码MP3时候,只设置一次其采样率,其后解码每一帧,都是没有重新设置采样率的。而实际结果是,VBR变化的只是比特率,采样率是固定的,所以只需要在解码MP3最开始的时候设置一次即可。