3.3. MPEG帧的大小

前面已经解释了,MPEG帧= 帧头 + 数据。

下面来看看,MPEG的帧的大小,即帧头的大小,加上帧数据的大小。

解释MPEG帧大小之前,先要介绍个名词:Slot,槽。

MPEG帧,由一个个的Slot(槽)组成。

Layer I中,一个Slot是4个字节;

Layer II和Layer III中,一个Slot是一个字节。

所以,此处可以简单的理解为:

MPEG的Layer III中,帧是有一个个字节所组成。(是不是听起来像句废话,^_^)

好了,知道了此处MPEG的Layer III的帧的基本单位为字节之后,我们再来看看帧的大小是多少。

首先,帧头,不用多说,都是前面提到的,固定的32比特=4字节。

其次要好好解释一下MPEG帧的音频数据的大小,可用如下公式计算:

公式 3.1. Frame Data Size

Frame_Data_Size

= Audo_Data_Size + Frame_Padding_Size

= Frame_Time * Frame_Bitrate + Frame_Padding_Size

= (Sample_Number * Time_per_Sample) * Frame_Bitrate + Frame_Padding_Size

= (Sample_Number * (1/Sample_Rate)) * Frame_Bitrate + Frame_Padding_Size


公式 3.2. 帧数据大小

帧数据大小

= 音频数据大小 + 帧的填充大小

= 帧的时长 * 帧的比特率 + 帧的填充大小

= (采样个数 * 每一采样的时长)* 帧的比特率 + 帧的填充大小

= (采样个数 * (1 / 采样率))* 帧的比特率 + 帧的填充大小


其中:

  1. 帧的填充大小:

    对于MPEG的Layer III来说,单位就是字节,不够8bit一个字节的话,添加padding对应的bit,凑够一个字节。所以,具体padding几个bit,要看每一帧的数据的bit是否是8的倍数,如果本身是8的倍数,那么padding就是0,如果不是,根据具体情况决定补齐几个bit。

  2. 采样个数:

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

  3. 采样率:

    对于MP3,即MPEG-1,Layer III来说,不论CBR还是VBR,对于单个MP3文件来说,也是固定的,每一帧采样率,都是一样的。采样率是多少,通过解析第一帧,即可得知所有帧的采样率。

  4. 帧的比特率:
    1. CBR:

      每一帧都是一样的。通过解析第一帧即可得知其他所有帧的比特率。

    2. VBR:

      每一帧都不同,所以要针对每一帧具体解析帧头,才能得知每一帧的比特率具体是多少。

3.3.1. 常见MPEG帧的音频数据大小是418字节

最后 举个栗子 来说明,

以常见的采样率为44100 Hz,比特率为128kbps的CBR的MP3来计算:

帧数据大小

= (采样个数 * (1 / 采样率))* 帧的比特率 + 帧的填充大小

= (1152 * (1/44100 Hz))* 128kbps + 填充大小

= 3343.7 比特 + 填充大小

= 417.959字节 + 填充大小

= 418 字节

对应的MPEG帧大小为:

MPEG帧大小

= 帧头 + 帧数据

= 4 + 418

= 422字节

而对于VBR的帧的大小,就不是能这么简单计算出来的了。

因为VBR是每一帧的比特率都是变化的,所以对于每一帧的大小,都先要解析每一帧的帧头,得到每一帧的比特率,然后才可以计算出来每个帧的大小。

另外提及一点,由于舍入误差,官方的计算帧大小的方法和此稍有不同。根据ISO标准,应该以slot为单位进行计算,然后对结果取整,再乘于slot的大小。

不过,我们此处计算的是MPEG的Layer III,本身slot就是一个字节,所以计算方法是对的。

如果计算的是Layer I,一个slot是4字节,就要先以4字节为单位进行计算,然后对结果取整,再乘于slot大小,即再乘于4字节。