Chip123 科技應用創新平台

標題: MP3文件格式解析3 [打印本頁]

作者: windflowerz    時間: 2007-4-11 05:01 AM
標題: MP3文件格式解析3
III, 数据帧 ; Z% z+ C6 g8 Z; |$ r9 u
' G1 w9 L5 J0 Z% O: W5 C
数据帧往往有多个,至于有多少,由文件大小和帧大小来决定。每个帧都有一个四字节长的帧头,接下来可能有两个字节的CRC校验,其存在由帧头中的具体信息决定。接着就是帧的实体数据,也就是MAIN_DATA了。
5 {7 ~* Z6 P4 O- N6 ]; p
. D$ w0 D8 \2 r$ PA,帧头结构如下: 1 i! E+ i, H  l
# M" m& F$ X+ N1 R& U
位置     长度     描述
: v* n4 g3 M1 l+ s4 [6 A% u(BIT)  (BITS)2 s+ S- A9 B( |/ D& |( j. ^1 |% L# p
————————————————————————————
6 ?" P3 {+ @( z4 R) e3 ~9 K# i31-19   12       Frame sync(0xFFF)1 r0 }7 ^" Q& [& H- x& V" [( P
18/17    2        Layer, 00 – reserved, 01 – Layer III9 E; T; Y+ J  G! B/ v
                         10 – Layer II, 11 - Layer I" X- P9 M  C7 K/ @: s  Y
16       1         protection_bit, 0 意味着受CRC保护,帧头后面跟16位的CRC。; H6 _# ?& J0 i! I5 j7 f- ]. ^
15-12    4        bitrate_index, 比特率" M% g/ S* }: U9 t
11-10    2        sampling_frequency,    00 – 44.1KHz, 01 – 48KHz
9 W- V* A2 o- _7 S4 M                                         10 – 32 KHz,  11 – 保留7 b% @' ?, i7 i- G
9        1        padding_bit,1 意味着帧里包含padding位,仅当采样频率为44.1KHz时发生。
# J8 v: ?. a8 @- m& h  T* D8        1        private_bit8 }+ d( R  V% v5 {# L
7-6     2        mode,    00-stereo,       01-joint stereo(intensity stereo and/or ms_stereo)8 w7 E, i) P7 }  _6 V- l. z
                           11- dual_channel, 11 – single_channel
- ~, S- b7 L* d1 I6 g# V/ A3 K  w$ a5-4      2        mode_extension,在Layer III中表示使用了哪一种joint stereo编码方式。8 }& W. V2 X3 b! \6 d7 w. F$ ]
                            Intensity_stereo   ms_stereo
/ ?4 B: e5 h6 v' a' I6 p                   00            off                off
1 \% A3 n4 [2 `. r. K7 S- Y                   01            on                 off
. c# Y. D* V" u& w                   10            off                on
9 r- G6 ~) P% s2 h+ @% Q& w6 D0 h2 D                   11            on                 on9 R: l2 C& |! z. o" m
3        1        copyright,1 表示受版权保护。
  `  S2 n( t" M' h  X, F2        1        original,0表示该bitstream是一个copy,1表示是original.. Y% E0 P( B5 k7 D9 \3 j& V
1-0      2        emphasis,表示会使用哪一种de-emphasis。
5 u, b+ u9 u) p% v- ^6 ~                   00 - no emphasis,     01 – 50/15 microsec. Emphasis
) P! c& G, w* E                   10 – reserved,        11 – CCITT J.17 & S7 L+ p/ a' p+ H4 Q- v' P
  P4 I6 a; F$ U- ^8 J; U* ^3 B. ~/ ^
1)      无论帧长是多少,每帧的播放时间都是26ms
7 ^5 V( a0 n5 H: G5 O% g# z
, a+ z. a. }8 L1 C: H# |2)      数据帧大小:   |" A5 k/ r1 A5 J

" a' R5 A6 V8 J9 _( mFrameSize = 144 * Bitrate / SamplingRate + PaddingBit(bytes)1 e$ }* p( C+ r9 ^
当144 * Bitrate / SamplingRate不能被8整除,则加上相应的paddingBit.
* s4 o1 b( D. O# l5 t
2 k7 ?+ A2 v& K6 O7 i
$ |4 z7 J1 y7 |$ E( ~& aB,MAIN_DATA: ! R1 _! g  `& d* F4 ^  L( O4 }1 K

/ 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

6 ]- E  C& N6 f$ g0 q: H主要数据里包含了scalefactors, Huffman encoded data和ancillary information。其内容不再详叙,可以参考MP3 SPEC-IS0 11172-3 AUDIO PART。我们一般用的都是立体声,scfsi的长度为32个字节。 " U9 M3 U# c% _# T, H) \4 _6 w6 K3 ~

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

- w  o. W/ }/ X5 d× MP3 文件格式
' s7 _4 @, D7 U, [) d- Bhttp://bbs.gliet.edu.cn/bbs/inde ... post&id=1813051# ]! Z& F/ K% y, O
8 e( E7 F* d, a3 o5 x0 t
× MP3 SPEC-IS0 11172-3 AUDIO PART
/ k' }% g, G, P# l6 C1 ehttp://www.ece.cmu.edu/~ece796/documents/MPEG-1_Audio_CD.doc




歡迎光臨 Chip123 科技應用創新平台 (http://chip123.com/) Powered by Discuz! X3.2