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的头mp3帧头编码起始位置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
MPEG音频版本设置值
描述
00
MPEG version2.5
01
保留
10
MPEG version2
11
MPEG version1
Layer序列号设置值
描述
00
保留
01
Layer III
10
Layer II
11
Layer I
Protection-bit设置值
描述
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
Padding-bit如果设置了,则用一个slot填充数据(slot对框架大小的打算很主要) Layer I的slot大小是4字节,别的情形是1字节。
设置值
描述
0
没有添补
1
利用一个额外的slot填充数据
channel模式设置值
描述
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
Emphasis设置值
描述
00
none
01
50/15 ms
10
reserved
11
CCIT J.17
MP3边信息边信息紧接着帧头。它包含了一些解码器会用到的一些信息,用于解码器掌握音频流的播放,但不包含实际的音频数据。下表显示了所有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代码。
MP3解析的解析基于MPG123库
核心数据构造
typedef struct mpstr_tag { struct buf head, tail; / buffer linked list pointers, tail points to oldest buffer / int vbr_header; / 1 if valid Xing vbr header detected / int num_frames; / set if vbr header present / int enc_delay; / set if vbr header present / int enc_padding; / set if vbr header present / / header_parsed, side_parsed and data_parsed must be all set 1 before the full frame has been parsed / int header_parsed; / 1 = header of current frame has been parsed / int side_parsed; / 1 = header of sideinfo of current frame has been parsed / int data_parsed; int free_format; / 1 = free format frame / int old_free_format; / 1 = last frame was free format / int bsize; int framesize; int ssize; / number of bytes used for side information, including 2 bytes for CRC-16 if present / int dsize; int fsizeold; / size of previous frame, -1 for first / int fsizeold_nopadding; struct frame fr; / holds the parameters decoded from the header / struct III_sideinfo sideinfo; unsigned char bsspace[2][MAXFRAMESIZE + 1024]; / bit stream space used ???? / / MAXFRAMESIZE / real hybrid_block[2][2][SBLIMIT SSLIMIT]; int hybrid_blc[2]; unsigned long header; int bsnum; real synth_buffs[2][2][0x110]; int synth_bo; int sync_bitstream; / 1 = bitstream is yet to be synchronized / int bitindex; unsigned char wordpointer; plotting_data pinfo; lame_report_function report_msg; lame_report_function report_dbg; lame_report_function report_err;} MPSTR, PMPSTR;
数据构造关键字段解释:
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中