高质量mp3设置在MPEG文件中,没有主标头,因为MPEG的音频文件是由一系列被称为帧的较小部分组成的。每个帧都是一个具有自己标头和音频信息的数据块。
Layer II,II,III的音频帧头都是相同的,不同之处体现在音频数据的编码方式。帧本身是由slot组成的。Layer I的slot大小是4字节,其余情况是1字节。
除了Layer之外,MPEG音频本身也有3个版本,这个几个版本的不同之处体现在能处理的采样率不同(参考 表2.1.2)。MPEG 1 (ISO/IEC 13818-3) 和MPEG2(ISO/IEC 11172-3)是ISO标准. MPEG2.5对MPEG2进行的非官方的扩展,它是为了支持更低的采样率。MPEG2/2.5 也常被简称为LSF(Low SamplingFrequencies),既低采样率
对于Layer I和Layer II,帧是完全彼此独立的,因此您可以剪切MEPG音频文件的任何部分并正确的播放。然后,播放器将从发现的第一个完整有效的帧开始播放。但是,Layer III,帧不总是独立的,因为它可能使用了byte resevoir,这是一种内部缓冲区,因此帧之间通常是相互依赖的。在最坏的情况下,可能至少需要输入9个帧才能解码单个帧。
如果你需要检索有关MPEG的音频文件的信息,那么可以简单的找到第一帧,然后从它的header中获取信息。除比特率外,其他帧中的信息应该与第一个帧是一致的,因为可能当前是VBR的文件。在VBR的文件中,可以在每个帧中更改比特率。例如,为了在整个文件中保持音乐的高质量,当音乐比较复杂时就需要更多的位来做编码
帧头本身的长度是32位的(4字节)。帧头的前十二位(在MPEG2.5扩展的情况下为前十一位)始终设置为1,称为帧同步。帧还可能有可选的CRC校验和。它长16位,如果存在,则紧跟在帧头之后。CRC之后就是音频数据。通过重新计算CRC并将值与文件中的值进行比较,就可以检查比特流在传输期间是否已经被更改。
一个文件可以被编码成恒定比特率(CBR)或可变比特率(VBR),这意味着每帧可以有不同的比特率。可变比特率的质量往往比恒定比特率编码的文件更高,因为他们可以在需要的地方使用更高的比特率。
MP3文件的整体结构:
[ID3 V2] | [APE 头]: 可选ID3 V2的头,大多数最新的MP3,都有这个头用于APE格式的头,现在也用于MPEG第一帧MPEG 音频头, 通常大小为4字节.(当Protection bit==0时,帧头后会有16bit=2byte的CRC,此时帧头大小为6字节)边信息,9/17/32 字节[Xing 头]: 可选 8-120字节,如果是VBR,多数都有此Xing头,而且只有第一帧有音频数据第二帧帧头边信息音频数据第三帧帧头边信息音频数据最后一帧帧头边信息音频数据[TAG]: 可选。128字节的ID3 V1信息,如果没有前面的ID3 V2,多数都有这个ID3 V1的头起始位置0位高位开始
起始位置
大小
位置
描述
0
11
31-21
帧同步标识,11个‘1’。用于定位帧头起始位置
11
2
20-19
MPEG音频版本
13
2
18-17
Layer序列号
15
1
16
Protection bit
16
4
15,12
比特率
20
2
11-10
采样率
22
1
9
padding bit的定义
23
1
8
保护位
24
2
7-6
channel模式
26
2
5-4
只用于Joint stereo 模式扩展
28
1
3
版权位 0:无版权 1:有版权
29
1
2
原始位 0:原始媒体的副本 1:原始媒体
30
2
1-0
Emphasis
设置值
描述
00
MPEG version2.5
01
保留
10
MPEG version2
11
MPEG version1
设置值
描述
00
保留
01
Layer III
10
Layer II
11
Layer I
设置值
描述
0
protected by 16 bit CRC following header
1
no CRC
bits
V1,L1
V1,L2
V1,L3
V2,L1
V2, L2 & L3
0000
free
free
free
free
free
0001
32
32
32
32
8
0010
64
48
40
48
16
0011
96
56
48
56
24
0100
128
64
56
64
32
0101
160
80
64
80
40
0110
192
96
80
96
48
0111
224
112
96
112
56
1000
256
128
112
128
64
1001
288
160
128
144
80
1010
320
192
160
160
96
1011
352
224
192
176
112
1100
384
256
224
192
128
1101
416
320
256
224
144
1110
448
384
320
256
160
1111
bad
bad
bad
bad
bad
NOTES: All values are in kbps
V1: MPEG Version 1V2: MPEG Version 2 and Version 2.5L1: Layer IL2: Layer IIL3: Layer III"free":: free fromat. free bitrate必须保持恒定,并且必须小于允许的最大的比特率. 解码器不需要支持free bitrate的流"bad": 意思是这个值是不被允许的.MPEG文件可能具有可变的比特率(VBR)。每一个帧可以用不同的比特率来创建。这是可以在所有的layer中使用。Layer III必须这个方式,Layer I 和 Layer II 解码器可以选择支持 针对Layer II,不允许使用比特率和模式的一些组合。下面是一些允许的组合
bitrate
单通道
立体声
Intensity stereo
dual channe
free
yes
yes
yes
yes
32
yes
no
no
no
48
yes
no
no
no
56
yes
no
no
no
64
yes
yes
yes
yes
80
yes
no
no
no
96
yes
yes
yes
yes
112
yes
yes
yes
yes
128
yes
yes
yes
yes
160
yes
yes
yes
yes
192
yes
yes
yes
yes
224
no
yes
yes
yes
256
no
yes
yes
yes
320
no
yes
yes
yes
384
no
yes
yes
yes
抽样速率指定每秒钟有多少个样本被记录。每个MPEG版本可以处理不同的samplingrates。
采样率索引
MPEG-1 (Hz)
MPEG-2 (Hz)
MPEG-2.5 (Hz)
00
44100
22050
11025
01
48000
24000
12000
10
32000
16000
8000
11
reserved
reserved
reserved
如果设置了,则用一个slot填充数据(slot对框架大小的计算很重要) Layer I的slot大小是4字节,其余情况是1字节。
设置值
描述
0
没有填充
1
使用一个额外的slot填充数据
设置值
描述
00
立体声
01
Joint stereo
10
Dual channel(2 mono channels)
11
Single channel(mono)
注意:双通道文件由两个独立的单声道组成。每一个都只使用了文件的一半比特率。大多数解码器将其输出为立体声,但情况并非总是如此。使用一个例子是在相同的比特流中承载了两个不同语言的语音,那么解码器需要仅解码所选择的语言进行播放
扩展模式被用来增加了一些没有在立体声效果使用的信息,从而减少了所需的位。这些位由在Joint stereo模式下的编码器动态的确定,每一个帧的Joint stereo都可以改变,甚至可以打开或者关闭
MPEG文件的整个的频率范围分为了多个子带,共有32个子带。对于Layer I和Layer II来说两个位确定了当应用intensity stereo时的频率范围(频带)。针对Layer III,这两个位决定了使用哪一种类型的joint stereo(intensity stereo或者m/s stereo). 频率范围由解压缩算法来确定
设置值
Layer I & II
00
bands 4 to 31
01
bands 8 to 31
10
bands 12 to 31
11
bands 16 to 31
Layer III:
Intensity stereo
MS stereo
off
off
on
off
off
on
on
on
设置值
描述
00
none
01
50/15 ms
10
reserved
11
CCIT J.17
边信息紧接着帧头。它包含了一些解码器会用到的一些信息,用于解码器控制音频流的播放,但不包含实际的音频数据。下表显示了所有Layer III文件的边信息的大小
模式
MPEG 1
MPEG 2/2.5 (LSF)
立体声,联合立体声,双通道
32
17
Mono
17
9
对于Layer I的文件,你必须考虑到扩展模式(见表2.1.6)。然后你可以以下公式计算出用于计算CRC的比特位的数量:
4 * ( 声道数 * bound of intensity stereo + (32 - bound of intensity stereo) );
这可以被读成两倍的立体声子带加上单子带的数量和结果乘以4。对于简单的mono帧,这等于128,因为通道的数目是1,而强度立体声的边界是32,这意味着没有强度立体声。对于立体帧,这是256。有关更多信息,请查看类CMPAFrame中的rc代码。
基于MPG123库
核心数据结构
数据结构关键字段说明:
struct buf *head, *tail这是一个字符串双向链表head 是外部请求输入的buffertail 是获取的之前的buffer,解析的时候从tail开始。解析后会更新pos位置wordpointer是指向bsspace的指针decodeMP3_clipchoice中每次计算出头的大小,side info的大小,data的大小,都会复制到这个指针的内存里面,使用copy_mp来复制,复制的源是tail中的数据消费者在commong.c中的一系列的getbits函数,这些函数会更新bitindex以及wordpointer的指向getbitsgetbits_fastget_leq_8_bitsget_leq_16_bitsbsspace是位流的空间decodeMP3_clipchoice是核心的入口函数
关键的流程解析:
addbuf将输入的需要解码的数据,插入到head的buffer中高质量mp3