边信息

帧头之后,可能是2个字节的CRC,据说是用于网络传输时校验用的,见的不多,解码时可以直接把这两个字节忽略。
之后就是边信息了,刚接触位流,遇到边信息直接懵13,根本不知道如何下手,用了最蠢笨的方法,用excel一个bit一个bit的拿图表示出来
用来分析边信息的表格

边信息结构

从整体上看,mpeg 1的单声道的边信息占用138bits,合17个字节,双声道的边信息占256bits,合32字节。是否为单声道,在帧头的mode位指明的四种模式中,除了0x11之外,都可以看作是双声道,立体声是有专门的立体声处理环节的。
mpeg 2的双声道占17字节,单声道占9字节,因为针对mp3文件,它是基于mpeg1 layer III的,所以暂不对mpeg2的边信息进行支持。

双声道边信息结构

名称

变量

切窗为1

切窗位0

说明

主数据指针

mainDataBegin

9bits

9bits

因为哈夫曼编码是不定长编码,并且由于长短窗技术和心理声学模型技术等,使每一个样本的数据,编码成不相同的长度,这些数据被放在长度相同的帧,有的样本数据就会横跨2个以上的帧,所以需要一个指针来告诉下一个帧,前一帧还有多少数据是属于下一帧的。

保留字

privateBit

3bits

3bits

scfsi选择子

scfsi

4 * 1bit

4 * 1bit

声道0

scfsi选择子

scfsi

4 * 1bit

4 * 1bit

声道1

以下是粒度部分

part23Length

12

12

bigValues

9

9

globalGain

8

8

scalefacCompress

4

4

windowSwitchFlag

1

1

blockType

2

0

mixedBlockFlag

1

0

tableSelect

2 *5

3*5

subBlockGain

3*3

0

region0Count

0

4

region1Count

0

3

preFlag

1

1

scalefacScale

1

1

count1

1

1

part23Length

12

12

bigValues

9

9

globalGain

8

8

scalefacCompress

4

4

windowSwitchFlag

1

1

blockType

2

0

mixedBlockFlag

1

0

tableSelect

2 *5

3*5

subBlockGain

3*3

0

region0Count

0

4

region1Count

0

3

preFlag

1

1

scalefacScale

1

1

count1

1

1

上表的粒度部分只列出了一个声道的两个粒度的信息,下一个声道与上表粒度部分一样,一个双声道的边信息,共有4个粒度信息,每个粒度信息占59bits,两个声道共占236bits,加上共用的20bits,一个256bits,合32字节。

共用部分

gr[0]ch[0]

gr[0]ch[1]

gr[1]ch[0]

gr[1]ch[1]

合计

双声道

20bits

59bits

59bits

59bits

59bits

256bits

单声道

18bits

59bits

-

59bits

-

136bits

单声道跟双声道共用部分的区别就是双声道的保留字长度是5bits,单声道的保留字3bits。