|
III, 数据帧
0 p: R7 {* \( a" L: z8 _1 Q( T6 }1 Z- n4 C( ]; t, }
数据帧往往有多个,至于有多少,由文件大小和帧大小来决定。每个帧都有一个四字节长的帧头,接下来可能有两个字节的CRC校验,其存在由帧头中的具体信息决定。接着就是帧的实体数据,也就是MAIN_DATA了。
; C! |* G- o6 ?/ b' f+ g2 a; }/ @4 G+ Q& _ f( c) u2 K
A,帧头结构如下:
8 s4 j; f( Z8 ~# S% `" y$ i4 W# }: {0 } ^, _# A
位置 长度 描述
0 y# `( X. }4 z3 I3 s. T(BIT) (BITS)2 V2 `: m( g9 l( T1 ]
————————————————————————————* J9 \) p) }* B$ b6 L* a' v/ R
31-19 12 Frame sync(0xFFF)
4 j! F4 g4 ]' D18/17 2 Layer, 00 – reserved, 01 – Layer III1 Q) H9 Y3 s! D9 |( f% T
10 – Layer II, 11 - Layer I( } E8 ^- C$ C- q0 P
16 1 protection_bit, 0 意味着受CRC保护,帧头后面跟16位的CRC。9 R" [: b* T! L1 r
15-12 4 bitrate_index, 比特率
0 a" |7 i H4 g11-10 2 sampling_frequency, 00 – 44.1KHz, 01 – 48KHz6 W% G( F# X8 ~& u$ A' g
10 – 32 KHz, 11 – 保留% o' v9 f9 f% d! w
9 1 padding_bit,1 意味着帧里包含padding位,仅当采样频率为44.1KHz时发生。
) D9 d5 S6 h3 R/ r6 j8 1 private_bit% v6 k& z. m1 O( ~! w6 F
7-6 2 mode, 00-stereo, 01-joint stereo(intensity stereo and/or ms_stereo)
5 M; [+ t7 \" Y7 j9 j! ?2 B1 ? 11- dual_channel, 11 – single_channel
5 K5 G0 V# G( g7 H5-4 2 mode_extension,在Layer III中表示使用了哪一种joint stereo编码方式。6 S5 C9 R3 B5 e& U- I
Intensity_stereo ms_stereo3 ?+ B4 R6 z- @# q
00 off off
0 Z1 Z: ~- a4 V1 E 01 on off
3 p! m+ a9 L5 V6 { 10 off on
. k! v; ^/ e" ^2 T: F2 Q+ B 11 on on* U. O! B. V! B' b: S. Z
3 1 copyright,1 表示受版权保护。
1 ^4 P& \0 _8 j+ j1 ^: i+ N7 [7 x2 1 original,0表示该bitstream是一个copy,1表示是original.+ c7 i9 _' U3 A* x+ K
1-0 2 emphasis,表示会使用哪一种de-emphasis。6 v. `: @' H" Y- x6 N% S+ T0 ?2 D
00 - no emphasis, 01 – 50/15 microsec. Emphasis
V6 r0 N% H8 _. { 10 – reserved, 11 – CCITT J.17
$ h0 S' B. w3 Z# J* Z& x, [
7 e4 f' Q. `5 \/ w$ q# `1) 无论帧长是多少,每帧的播放时间都是26ms 4 Y4 v6 ]* u0 l; ?
$ B7 q6 r9 S1 k$ |) d- V3 {) t
2) 数据帧大小: & a% j( Z9 l- ]
( {$ ]4 Z' s- a: x |FrameSize = 144 * Bitrate / SamplingRate + PaddingBit(bytes)$ X% S% Q& ~" _7 p
当144 * Bitrate / SamplingRate不能被8整除,则加上相应的paddingBit.
0 q2 V9 C1 T8 I9 Z @3 y5 p1 R: g" ^8 L: r$ \1 B: V' H" o
# N F5 Q/ X; Q& l+ s0 B! [
B,MAIN_DATA:
) t9 ^# `' p) u
/ g+ P) p/ M) U( w* qMP3的granule包含18 * 32个subband采样。每个数据帧含有两个granule的数据,其内容结如下:
/ g- X" H- k4 A) Y$ M. m - main_data_end pointer8 K- C0 ~( V" f, y/ a$ I+ o
- side info for both granules (scfsi)
3 ?' A0 K6 }) z) Q8 h" i# A - side info granule 1
8 ~# g# U2 ?/ o+ ^+ t - side info granule 2" x2 J: d6 _! a* y; V9 ^
- scalefactors and Huffman code data granule 1
' t. s& Q0 v* R+ u - scalefactors and Huffman code data granule 2
9 q P H8 a( `% ? ?7 f b1 f) t. T1 p7 o4 g8 f8 D4 M2 \, T
主要数据里包含了scalefactors, Huffman encoded data和ancillary information。其内容不再详叙,可以参考MP3 SPEC-IS0 11172-3 AUDIO PART。我们一般用的都是立体声,scfsi的长度为32个字节。 5 g# P3 B+ @4 L R" S1 e- i2 ~
2 w+ f7 I# }7 @. ~1 _; L这里要解释的一个概念就是位流――bitstream。我们平常接触到的数据都是整数,最小的单位就是byte后者char。虽然我们也会用一个字节里的不同位来表示不同的含义,但总的来说,我们在出来数据的时候还是把它当作一个个字节看待。但对MP3这种数据格式来说,这是行不通的。在解码时,它的数据输入就是一个个比特流。其中一个或几个比特会是你的采样数据或者信息编码。你需要从整个MAIN_DATA里提取你所需要的以BIT为单位的参数和输入信号,从而进行解码。所以我们需要一个子程序,getbit(n),也就是从缓冲中提取所需要的位,并形成一个新的整数,作为我们的输出。 6 M8 |* u# `/ m* T$ P- g2 ]2 o4 o4 T% j
& T7 l D$ S7 i# y6 q5 y
C,LAME标签帧
3 U# D! A4 D j% g& k
, m& V1 a, u3 D8 r& _" b可是,当你真的打开一个MP3文件的时候,你会发现,很奇怪,很多时候第一个数据帧的帧头后面的32个字节居然都为0,这是为什么呢,这么奇怪的解码信息该如何解释?找到MP3 INFO TAG REV SPECIFICATION的网站,我才明白,原来第一帧并不是真正的数据帧,而是LAME编码的标志帧。
9 Y" H2 l$ ^7 G# X) ^# @; _; v: E- t! v M
这里又要牵涉到两个概念:CBR和VBR。CBR表示比特率不变,也就是每帧的长度是一致的,它以字符串“INFO”为标记。VBR是Variable BitRate的简称,也就是每帧的比特率和帧的长度是变化的,它以字符串“Xing”为标记。同时,它还存放了MP3文件里帧的总个数,和100个字节的播放总时间分段的帧的INDEX,还有其他一些参数,这被称为Zone A,传统Xing VBR标签数据,共120个字节。
0 I0 i5 P( `$ S7 ]4 P$ P9 [) {4 K6 p8 m1 |& Z) x8 e# _/ ?4 k
在二进制文本编辑器里我们还可看到一个字符串“LAME”,并且后面清楚地跟着版本号。这就是20个字节的Zone B初始LAME信息,表示该文件是用LAME编码技术。接下来一直到该帧结束就是Zone C-LAME标签。 ; d# p, l { l# p3 C+ V- Z1 X
4 h2 [; X5 Q, U) Z1 w# I
3, 相关资料 $ m; E+ g6 V" N) Y$ t$ O# r# ]
2 B4 |2 h* K/ G. P
× Mp3 Info Tag rev 1 specifications - draft 0
" H1 r6 c! t R1 T: yhttp://gabriel.mp3-tech.org/mp3infotag.html & K$ M4 ~3 D) i2 v7 H
( _ s& v6 B K, R$ s* v× MP3 文件格式 * p3 o' n$ e- ]$ T, }: ^
http://bbs.gliet.edu.cn/bbs/inde ... post&id=1813051) w% b) B$ w0 D
+ o, ?5 d; S0 L% d, _9 m, E0 Z
× MP3 SPEC-IS0 11172-3 AUDIO PART
+ ]: }$ ~6 o3 M: L2 d$ {http://www.ece.cmu.edu/~ece796/documents/MPEG-1_Audio_CD.doc |
|