Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

搜索
1 2 3 4
查看: 3783|回復: 0
打印 上一主題 下一主題

MP3文件格式解析2

[複製鏈接]
跳轉到指定樓層
1#
發表於 2007-4-11 05:00:36 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
2,      MP3文件格式 ) ?: V$ w: ]2 [; g1 E+ }

6 M. ?1 w, ^; Z/ e用一个二进制查看器(比如Ultra-Edit)打开一个MP3文件,就能看到一大堆看似杂乱无序的数据。但只要用心了解就会知道,其实,这一切都是有章可循的。
6 R1 B4 j; d4 R' W3 W* h 9 x2 \7 Q" c: H4 Q# T+ g7 T* d
MP3文件是由帧(frame)构成,帧是MP3文件的最小组成单位。每帧都包含帧头,并可以计算帧的长度。根据帧的性质不同,文件主要分为三个部分,ID3v2标签帧,数据帧和ID3v1标签帧。并非每个MP3文件都有ID3v2,但是数据帧和ID3v1帧是必须的。ID3v2在文件头,以字符串“ID3”为标志,包含了演唱者,作曲,专辑等信息,长度不固定,扩展了ID3V1的信息量。ID3v1在文件结尾,以字符串“TAG”为标记,其长度是固定的128个字节,包含了演唱者、歌名、专辑、年份等信息。+ B8 {2 f3 \9 M, W, A

# q) D! b" Z# A/ YI, ID3V2
/ r. ?8 {. N$ Q& t# D
: j! S. P8 M% S5 |ID3V2到现在一共有四个版本,但流行的播放软件一般只支持第三版,既ID3V2.3。每个ID3V2.3 的标签都一个标签头和若干个标签帧或一个扩展标签头组成。关于曲目的信息如标题、作者等都存放在不同的标签帧中,扩展标签头和标签帧并不是必要的,但每个标签至少要有一个标签帧。标签头和标签帧一起顺序存放在MP3 文件的首部。
4 L' O7 {4 A2 S- y& p. J7 j
0 q# c, v1 w4 M+ t% u标签头 5 ]' y! P8 G) b: s$ }3 p8 X

# Q+ s$ J7 }' y7 s长度为10个字节,位于文件首部,其数据结构如下:   M' L: x, i, ]& f/ a! y3 Z; Q% |6 u
. Z" x; v  d+ _4 N% @
char Header[3]; /* 字符串 "ID3" */  b" s. u" G% T7 B
; }; A- O3 M) Y- A- j  B7 E3 H  M
char Ver;       /* 版本号ID3V2.3 就记录3 */ ! ^$ x0 H9 D4 O. ?
" A) v) N5 c5 n
char Revision;  /* 副版本号此版本记录为0 */ ) I7 U& |* J7 Q/ [5 l- d1 H, `& E- s
% k" n# {! K) b
char Flag;     /* 存放标志的字节,这个版本只定义了三位,很少用到,可以忽略 */
: r( ]# V7 ]; b0 [8 j" `
5 `0 j0 |* u) h+ F! F$ a- h8 \7 tchar Size[4];  /* 标签大小,除了标签头的10 个字节的标签帧的大小 */
6 H" }4 h( x2 |8 d5 m. C/ Y" X1 W9 Q% |  v
标签大小为四个字节,但每个字节只用低7位,最高位不使用,�为0,其格式如下:- i. r) d8 d5 S9 i- I
0xxxxxxx 0xxxxxxx 0xxxxxxx 0xxxxxxx ) X8 |2 a9 m/ a3 B( @  r3 W/ @( i
9 [/ M& {% L( g2 ~! u
计算公式如下: - |% l, j; v$ U, _

; _9 q4 V; H& `, [2 iID3V2_frame_size =  (int)(Size[0] & 0x7F) << 21
* z0 U) [( `6 h% ]. M& ?/ @0 V6 u                  | (int)(Size[1] & 0x7F) << 14& k  F( A/ P# W$ t& K! j( `
                  | (int)(Size[2] & 0x7F) << 77 o6 I' z' |, f
                  | (int)(Size[3] & 0x7F) + 10;
+ [( d9 K# v! F& U* w, {3 G5 ~+ j. j' i: s+ `
) Q+ L$ @/ {) Y% y, @9 V  ]
标签帧 - y6 g9 X; Q- u; Z7 Q0 U+ j6 \

6 v) n0 E6 m, p& N. M每个标签帧都有一个10字节的帧头和至少一个字节的不固定长度的内容组成。它们是顺序存放在文件中,由各自特定的标签头来标记帧的开始。其帧的结构如下:
- b% |$ r0 d$ [1 w" {7 w4 s& z7 o/ p) Z% ?) L2 r
char FrameID[4];   /*用四个字符标识一个帧,说明其内容 */ % U2 \5 |) u  K
" l3 i8 t" _9 t8 W3 w) f1 _& l% _
char Size[4];      /* 帧内容的大小,不包括帧头,不得小于1 */
* d  ^! e2 D$ i$ B3 i) ]; J
8 }5 @8 ~; E9 `char Flags[2];     /* 存放标志,只定义了6 位,此处不再说明 */ + Z. z8 i" ~/ _. y5 ~
; |, j3 m/ ^" O# o7 A! G+ ]
常用帧标识: + A- _* A% x) V3 ^* k
, l! [+ o$ }" E4 X& T" H9 K
TIT2:标题9 o' l6 j* d8 z
TPE1:作者" B2 N  P( V/ O7 }5 E" }
TALB:专辑% c4 [1 l" h9 p5 M, V& X
TRCK: 音轨,格式:N/M,N表示专辑中第几首,M为专辑中歌曲总数1 A2 T+ w9 X8 \7 u
TYER:年份, g+ s1 u3 f. j( t
TCON:类型8 q* K' z. |  ]
COMM:备注,格式:“eng\0备注内容”,其中eng表示所使用的语言  \. g  l0 G! R/ A8 ^( I& q
帧大小为四个字节所表示的整数大小。
5 K9 E/ r* ?( h9 A  T5 ]4 f1 F0 O. r! R9 _. V2 z
. B1 T, e8 R* ?- `5 |
II, ID3V1 6 X4 c- p  ^. w

& B7 v; ^- |: \- P6 X/ B  m) Q其数据结构如下:
: ?* n/ V# R) e- z
2 a( c, J* v- J% Q4 B- tchar Header[3];    /* 标签头必须是"TAG"否则认为没有标签 */
4 s( D& x% |: u2 kchar Title[30];    /* 标题 */; }3 f2 v8 C) d/ S4 f
char Artist[30];   /* 作者 */* G3 T' b2 H; A9 b+ G
char Album[30];    /* 专集 */& f2 D. V3 b' T& H9 G, M. F$ L9 J5 `
char Year[4];      /* 出品年代 */
7 a) S( ^! q& v. Hchar Comment[28]; /* 备注 */4 @! t, }: ~2 o+ s  V' M+ q% u0 [
char reserve;      /* 保留 */  n2 D' W) \; c; W3 N
char track;;       /* 音轨 */
' f% o% j7 a; |7 E. achar Genre;        /* 类型 */
% `) V! x; @' y$ Z/ K
9 U1 p, Q9 q# y: f& m1 b其实,关于最后31个字节还存在另外一个版本,就是30个字节的Comment和一个字节的Genre.
4 U) u2 ?) M) V# \( e# ]  \" M, v  b1 ]) p
有了上述的这些信息,我们就可以自己写代码,从MP3文件中抓取信息以及修改文件名了。但是,如果真的想写一个播放软件,还是需要读它的数据帧,并进行解码。
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂 踩 分享分享
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

首頁|手機版|Chip123 科技應用創新平台 |新契機國際商機整合股份有限公司

GMT+8, 2024-9-28 04:16 PM , Processed in 0.161010 second(s), 17 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表