帧头之后,可能是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。