mp3文件格式详解

Mp3文件格式:

参考:https://www.cnblogs.com/ranson7zop/p/7655474.html

https://www.cnblogs.com/ranson7zop/p/7655474.html

 

下面对根据一个mp3文件讲解下,如下图所示:

 

 mp3文件格式详解_第1张图片

 

 

如下图十个字节代表ID3V2.4的标签头,;0x49 44 33 代表ID3,0x04代表ID3的版本号(4代表ID3V2.4;  0x 00 00 00 23代表标签大小(不包括标签头的十个字节),通过计算标签大小就可以偏移到数据帧。如下代表标签大小为0x23+10=45。

 

如下图所示:标签帧为鼠标选择的部分,大小为35个字节。0x54 53 53 45代表TSSE这中音频标识(不同音频文件不同)。0x 00 00 00 0F代表帧大小,0x00 00 存放标志。后面的几个0x000000000用来扩展。

 

 

如下图所示为第一个数据帧:帧头为FFFBD000

1111  1111 1111 1011 1101 0000 0000 0000

前11位位固定的1,

12-13,版本 11-》MPEG1

14-15  01->Layer3

16  CRC校验   1-》不校验

17-20,位率(码率) 1101-》256k/s

21到22:采样率 00  =>44100

第23位:帧长调节,其值为0 ->无需调整 

第24位:未使用

第25到26位:声道模式,其值为00->立体声Stereo

第27到28位:扩充模式,当声道模式为01(联合立体声)时才使用,此处未使用

第29位:版权,其值为0->无版权

第30位:原版标志,其值为9->不是原版文件

第31到32位:强调方式,其值为00->未定义

 

帧大小和帧长度。帧大小即每帧采样数表示一帧中采样的个数,这是恒定值。其值如下表所示

 

MPEG 1

MPEG 2(LSF)

MPEG 2.5(LSF)

Layer 1

384

384

384

Layer 2

1152

1152

1152

Layer 3

1152

576

576

 

 

 

 

 

帧长度是压缩时每一帧的长度,包括帧头。它将填充的空位也计算在内。LayerI的一个空位长4字节,LayerII和LayerIII的空位是1字节。当读取MPEG文件时必须计算该值以便找到相邻的帧。注意:因为有填充和比特率变换,帧长度可能变化。

从头中读取比特率,采样频率和填充的值后可以进行计算,

LyaerI使用公式:

帧长度(字节) = (( 每帧采样数/ 8 * 比特率 ) / 采样频率 ) + 填充 * 4

LyerII和LyaerIII使用公式:

帧长度(字节)= (( 每帧采样数/ 8 * 比特率 ) / 采样频率 ) + 填充

例:

LayerIII 比特率 128000,采样频率 44100,填充0  =〉帧大小 417字节;

如图 2.3中,比特率为128K,采样率为44.1K,填充0,则其帧长度为:

(1152 / 8 * 128K)/44.1K = 417 (字节)

 

2)每帧的持续时间

每帧的持续时间可以通过计算获得,下面给出计算公式

每帧持续时间(毫秒) = 每帧采样数 / 采样频率 * 1000

如图 2.3中,其每帧时间为:

1152 / 44.1K * 1000 = 26.12 (约等于26ms)

如果是MPEG2 Layer III 采样率为16KHz的话那一帧要持续36毫秒,这个相差还是蛮大的,所以还是应该通过计算来获的。

 

3)CRC校验

如果帧头的校验位为0,则帧头后就有一个16位的CRC值,这个值是big-endian的值,把这个值和该帧通过计算得出的CRC值进行比较就可以得知该帧是否有效。

 

4帧数据

在帧头后边是Side Info(姑且称之为通道信息)。对标准的立体声MP3文件来说其长度为32字节。通道信息后面是Scale factor(增益因子)信息。当解码器在读到上述信息后,就可以进行解码了。图 2.3中地址为0x880到0x89F(含),此处数据全为0。

对于mp3来说现在有两种编码方式,一种是CBR,也就是固定位率,固定位率的帧的大小在整个文件中都是是固定的(公式如上所述),只要知道文件总长度,和从第一帧帧头读出的信息,就都可以通过计算得出这个mp3文件的信息,比如总的帧数,总的播放时间等等,要定位到某一帧或某个时间点也很方便,这种编码方式不需要文件头,第一帧开始就是音频数据。另一种是VBR,就是可变位率,VBR是XING公司推出的算法,所以在MP3的FRAME里会有“Xing"这个关键字(也有用"Info"来标识的,现在很多流行的小软件也可以进行VBR压缩,它们是否遵守这个约定,那就不得而知了),它存放在MP3文件中的第一个有效帧的数据区里,它标识了这个MP3文件是VBR的。同时第一个帧里存放了MP3文件的帧的总个数,这就很容易获得了播放总时间,同时还有100个字节存放了播放总时间的100个时间分段的帧索引,假设4分钟的MP3歌曲,240S,分成100段,每两个相邻INDEX的时间差就是2.4S,所以通过这个INDEX,只要前后处理少数的FRAME,就能快速找出我们需要快进的帧头。其实这第一帧就相当于文件头了。不过现在有些编码器在编码CBR文件时也像VBR那样将信息记入第一帧,比如著名的lame,它使用"Info"来做CBR的标记。

mp3文件格式详解_第2张图片

 

你可能感兴趣的:(音视频知识)