Mp3文件格式:
参考: https://www.cn blogs.com/ranson7zop/p/7655474.html
33559 www.cn blogs.com/ranson7zop/p/7655474.html
基于mp3文件进行描述,如下图所示。
下图中的10个字节表示ID3V2.4的标签头。0x49 44 33表示ID3,0 x 04表示ID3的版本号。 (4表示ID3V2.4;0x 00 00 00 23表示标签大小,标签头的10个字节除外。 通过计算标签大小可以偏移到数据帧。 下表显示标签大小为0x23 10=45。
如下图所示,标签框架是鼠标选择的部分,大小为35字节。0x54 53 53 45表示TSSE中的音频标记。 这取决于音频文件。0x00 0000f表示帧大小,0x0000存储标志。 后面的几个0x000000000是用于扩展的。
下图显示了第一个数据帧。 帧头为FFFBD000
1111 1111 1111 1011 1101 0000 0000 0000
固定在前11位1,
12-13,版本11 -”mpeg 1
14-15 01 -第3层
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
是mpeg2(LSF )
是mpeg2.5(LSF )
第1层
384
384
384
第2层
1152
1152
margin-left:0cm;">1152Layer 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的标记。