|
III, 数据帧
g( c# M* P* x' O! f& k
% q. k3 J* o2 J: \+ V2 t0 B7 O) M数据帧往往有多个,至于有多少,由文件大小和帧大小来决定。每个帧都有一个四字节长的帧头,接下来可能有两个字节的CRC校验,其存在由帧头中的具体信息决定。接着就是帧的实体数据,也就是MAIN_DATA了。 ; l9 y R" K1 N' K. B
1 O. Q5 p, m; J1 l
A,帧头结构如下: . Z* `# O& w: A
$ `9 E) V3 Y6 ?) G0 l. ^! j1 c位置 长度 描述
; [( F2 T2 W' U* k3 [6 }* K(BIT) (BITS)3 p& G# S o2 I& c3 l- a; f- F
————————————————————————————. O' W) l( f! f8 S3 b
31-19 12 Frame sync(0xFFF)
( w( D( z7 Q: M; J* [ |8 p/ G$ A18/17 2 Layer, 00 – reserved, 01 – Layer III
% F$ t5 p) P# b e; m/ C% B4 H+ ] 10 – Layer II, 11 - Layer I/ l' |% L2 o" \4 k/ |, F6 ~, z7 \& B
16 1 protection_bit, 0 意味着受CRC保护,帧头后面跟16位的CRC。
$ z$ Z) s( U+ A2 r5 m) S! \% E ^15-12 4 bitrate_index, 比特率" {- b2 m7 L: s1 I% S& I7 N' d, D
11-10 2 sampling_frequency, 00 – 44.1KHz, 01 – 48KHz$ m5 |$ Z! {- t Q5 e" Y
10 – 32 KHz, 11 – 保留
2 C f$ [3 R9 a& i9 1 padding_bit,1 意味着帧里包含padding位,仅当采样频率为44.1KHz时发生。
o6 k1 N6 [4 |0 E2 l5 C# s8 1 private_bit
4 M' |4 R! r7 [, v1 j8 X7-6 2 mode, 00-stereo, 01-joint stereo(intensity stereo and/or ms_stereo)2 J, e3 B# P) n# g+ H9 E
11- dual_channel, 11 – single_channel
5 q( m( j- R9 X. Z8 z8 t0 P6 \5-4 2 mode_extension,在Layer III中表示使用了哪一种joint stereo编码方式。
7 e D6 ~! Z' S. y3 |; F# i! N Intensity_stereo ms_stereo& q0 V9 |% H* I; G
00 off off1 _. @* z! o H4 y7 ^) S
01 on off
% p6 d2 {7 s( ^$ J* M' _ 10 off on4 e5 I3 I+ y$ W
11 on on
4 ~' E) O% ~7 f4 J+ M! V3 1 copyright,1 表示受版权保护。
$ m! K6 f6 f3 N `2 1 original,0表示该bitstream是一个copy,1表示是original.
- v2 H7 [* n) w4 S+ M% n1-0 2 emphasis,表示会使用哪一种de-emphasis。& D0 e) M& f" h( ?0 m/ K
00 - no emphasis, 01 – 50/15 microsec. Emphasis
# K l+ C- t4 B0 _ 10 – reserved, 11 – CCITT J.17
) B& m6 y" n- t, X
1 z9 j% o- \: ^9 A* v1) 无论帧长是多少,每帧的播放时间都是26ms
' ~0 ~, K- x( `4 ^: Q/ v8 o: U7 A2 ]4 R
2) 数据帧大小: 2 l8 [' h; u+ q6 U0 `
3 i+ q B, W& h+ ^) FFrameSize = 144 * Bitrate / SamplingRate + PaddingBit(bytes)1 m6 {3 C8 E3 u
当144 * Bitrate / SamplingRate不能被8整除,则加上相应的paddingBit. 5 H) K9 V( ~. k& e
8 B) P# a% X# j4 z3 ~9 x
T$ p( @" S- \8 O5 ~$ {
B,MAIN_DATA: 9 G1 M9 u* [4 X) p& {. n
) J# L' R! B4 P. QMP3的granule包含18 * 32个subband采样。每个数据帧含有两个granule的数据,其内容结如下:% T& k5 M# l+ x, E/ q: O
- main_data_end pointer( E8 M- n8 B2 k- y3 @2 j/ M
- side info for both granules (scfsi)
) k' c# E/ t4 H" v$ f }& k$ ^& { - side info granule 1
8 G) K H3 `+ E& H+ y7 W X - side info granule 2: x. ~2 H1 i# B# q
- scalefactors and Huffman code data granule 17 i, C: ?+ c! U W8 O" _* L9 _
- scalefactors and Huffman code data granule 2 0 e* D, s" j( u _& s
# F6 q+ E% a' `8 M4 E7 a1 k# k主要数据里包含了scalefactors, Huffman encoded data和ancillary information。其内容不再详叙,可以参考MP3 SPEC-IS0 11172-3 AUDIO PART。我们一般用的都是立体声,scfsi的长度为32个字节。 7 \7 H; I, h, W) b
, K% O$ n: f6 y" p( k p
这里要解释的一个概念就是位流――bitstream。我们平常接触到的数据都是整数,最小的单位就是byte后者char。虽然我们也会用一个字节里的不同位来表示不同的含义,但总的来说,我们在出来数据的时候还是把它当作一个个字节看待。但对MP3这种数据格式来说,这是行不通的。在解码时,它的数据输入就是一个个比特流。其中一个或几个比特会是你的采样数据或者信息编码。你需要从整个MAIN_DATA里提取你所需要的以BIT为单位的参数和输入信号,从而进行解码。所以我们需要一个子程序,getbit(n),也就是从缓冲中提取所需要的位,并形成一个新的整数,作为我们的输出。 9 [3 r8 `, I& o) e3 G
' I/ Q ]9 }2 oC,LAME标签帧
! y9 E3 {- B. u1 P# ]1 n' x$ T% T4 W
可是,当你真的打开一个MP3文件的时候,你会发现,很奇怪,很多时候第一个数据帧的帧头后面的32个字节居然都为0,这是为什么呢,这么奇怪的解码信息该如何解释?找到MP3 INFO TAG REV SPECIFICATION的网站,我才明白,原来第一帧并不是真正的数据帧,而是LAME编码的标志帧。 7 ]7 R2 R: d9 k/ y, V2 d3 \
" _! r2 }( u( R. p9 R8 ~这里又要牵涉到两个概念:CBR和VBR。CBR表示比特率不变,也就是每帧的长度是一致的,它以字符串“INFO”为标记。VBR是Variable BitRate的简称,也就是每帧的比特率和帧的长度是变化的,它以字符串“Xing”为标记。同时,它还存放了MP3文件里帧的总个数,和100个字节的播放总时间分段的帧的INDEX,还有其他一些参数,这被称为Zone A,传统Xing VBR标签数据,共120个字节。 ! [5 Z6 ?4 |3 ~1 m/ y7 P5 u. u+ |
* I) Q% C# p) r q& L% w
在二进制文本编辑器里我们还可看到一个字符串“LAME”,并且后面清楚地跟着版本号。这就是20个字节的Zone B初始LAME信息,表示该文件是用LAME编码技术。接下来一直到该帧结束就是Zone C-LAME标签。 5 Y* D- r, o4 N1 C' H* e" Z+ O
0 y1 k; G8 o2 m
3, 相关资料 1 e' t/ z& y! r% s. d
2 r/ U! t, d, S0 V: E# W× Mp3 Info Tag rev 1 specifications - draft 0) }- K' T* h" o0 D2 x8 _& Q
http://gabriel.mp3-tech.org/mp3infotag.html % Y! e1 w9 g5 B
) H+ l$ ^3 O/ V/ \! T% J
× MP3 文件格式
. ~, @' Z, u/ ~$ c$ i7 a% khttp://bbs.gliet.edu.cn/bbs/inde ... post&id=1813051
8 d7 B/ D z1 l/ j# L% h
0 L5 G8 e) W& Q0 R5 \, d) u6 L- i' ^× MP3 SPEC-IS0 11172-3 AUDIO PART 6 `0 {8 Q6 o; \0 ?9 e7 K: x2 L3 K
http://www.ece.cmu.edu/~ece796/documents/MPEG-1_Audio_CD.doc |
|