/ x+ ~2 J: i3 X3 u$ Z+ X) IMP3的granule包含18 * 32个subband采样。每个数据帧含有两个granule的数据,其内容结如下:% n/ J7 o6 t* _* X
- main_data_end pointer+ k5 I6 z% z9 ~ |1 @
- side info for both granules (scfsi) 1 G B6 S/ _- a; Z1 i& o - side info granule 1- m" C% I3 h7 R' r/ u4 [2 E
- side info granule 22 Q) k, S' v& v; P# k
- scalefactors and Huffman code data granule 1 N% L T, k& n J0 d - scalefactors and Huffman code data granule 2 3 U, k& Q& J/ C' L1 ^9 b
3 b& C2 C, B* f这里要解释的一个概念就是位流――bitstream。我们平常接触到的数据都是整数,最小的单位就是byte后者char。虽然我们也会用一个字节里的不同位来表示不同的含义,但总的来说,我们在出来数据的时候还是把它当作一个个字节看待。但对MP3这种数据格式来说,这是行不通的。在解码时,它的数据输入就是一个个比特流。其中一个或几个比特会是你的采样数据或者信息编码。你需要从整个MAIN_DATA里提取你所需要的以BIT为单位的参数和输入信号,从而进行解码。所以我们需要一个子程序,getbit(n),也就是从缓冲中提取所需要的位,并形成一个新的整数,作为我们的输出。 3 @, m. E& I. W" V4 \; K2 [, _# z! ]
- Y0 ~4 a7 U. V7 }8 c( _C,LAME标签帧 1 p& L# z5 @6 h0 T- J! q O, g# ^5 b& P: Y0 T7 b
可是,当你真的打开一个MP3文件的时候,你会发现,很奇怪,很多时候第一个数据帧的帧头后面的32个字节居然都为0,这是为什么呢,这么奇怪的解码信息该如何解释?找到MP3 INFO TAG REV SPECIFICATION的网站,我才明白,原来第一帧并不是真正的数据帧,而是LAME编码的标志帧。 & @' a% ], e8 P; i# \
8 C( d" U7 A. N1 N; m2 i- b
这里又要牵涉到两个概念:CBR和VBR。CBR表示比特率不变,也就是每帧的长度是一致的,它以字符串“INFO”为标记。VBR是Variable BitRate的简称,也就是每帧的比特率和帧的长度是变化的,它以字符串“Xing”为标记。同时,它还存放了MP3文件里帧的总个数,和100个字节的播放总时间分段的帧的INDEX,还有其他一些参数,这被称为Zone A,传统Xing VBR标签数据,共120个字节。 " x" L" A3 q/ z9 v6 e, I1 ?
" Z. l% u- s. Q, Y" |& T在二进制文本编辑器里我们还可看到一个字符串“LAME”,并且后面清楚地跟着版本号。这就是20个字节的Zone B初始LAME信息,表示该文件是用LAME编码技术。接下来一直到该帧结束就是Zone C-LAME标签。 % q' }5 E* u1 ?( {% L$ b% I & v( A& G. [! P' O, g. f3, 相关资料 $ ]/ v$ U* ?9 U, R. v/ M: k1 P. W: _% _0 f
× Mp3 Info Tag rev 1 specifications - draft 0 3 R) r% [; f; p) H. Ahttp://gabriel.mp3-tech.org/mp3infotag.html 6 K: m0 I! A! [4 Y