Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

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

MP3文件格式解析2

[複製鏈接]
跳轉到指定樓層
1#
發表於 2007-4-11 05:00:36 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
2,      MP3文件格式 * J! ]7 W. A' y- W1 X

7 O8 E# I* a9 ?2 J1 f用一个二进制查看器(比如Ultra-Edit)打开一个MP3文件,就能看到一大堆看似杂乱无序的数据。但只要用心了解就会知道,其实,这一切都是有章可循的。9 k3 _9 E# u5 n: v
! c6 l- _$ r' O- H2 f
MP3文件是由帧(frame)构成,帧是MP3文件的最小组成单位。每帧都包含帧头,并可以计算帧的长度。根据帧的性质不同,文件主要分为三个部分,ID3v2标签帧,数据帧和ID3v1标签帧。并非每个MP3文件都有ID3v2,但是数据帧和ID3v1帧是必须的。ID3v2在文件头,以字符串“ID3”为标志,包含了演唱者,作曲,专辑等信息,长度不固定,扩展了ID3V1的信息量。ID3v1在文件结尾,以字符串“TAG”为标记,其长度是固定的128个字节,包含了演唱者、歌名、专辑、年份等信息。; O3 S& W$ L7 g; F* v
& H" O8 C0 I, y3 a  m  n9 v0 b
I, ID3V2 7 Y2 O$ D& h6 L( Z) V6 F6 x' z
. I4 I7 f8 {0 Z6 A
ID3V2到现在一共有四个版本,但流行的播放软件一般只支持第三版,既ID3V2.3。每个ID3V2.3 的标签都一个标签头和若干个标签帧或一个扩展标签头组成。关于曲目的信息如标题、作者等都存放在不同的标签帧中,扩展标签头和标签帧并不是必要的,但每个标签至少要有一个标签帧。标签头和标签帧一起顺序存放在MP3 文件的首部。; T8 f2 k0 \8 z" @: F

  h. d8 V) Y$ a7 c! R3 p: `标签头 4 t5 v9 O0 C2 P" Z
+ L2 J$ l4 Q" i. D7 @# F
长度为10个字节,位于文件首部,其数据结构如下:
- f  f3 \2 D# W/ I# z( }" x% b% n5 g& _
char Header[3]; /* 字符串 "ID3" */, D6 |. `7 s/ e: R' k

1 }% c$ w% }5 e# ?0 k7 Echar Ver;       /* 版本号ID3V2.3 就记录3 */ ! P# h& d9 _$ x- a# _( U4 c4 e

- y) ]5 B4 h: K( F3 x) \( J1 rchar Revision;  /* 副版本号此版本记录为0 */
  B3 ~, m; V5 s; L: Y0 E: _7 A9 z
char Flag;     /* 存放标志的字节,这个版本只定义了三位,很少用到,可以忽略 */
# y6 k# `0 m1 P+ p; R! b7 u! ?/ l: j5 `
char Size[4];  /* 标签大小,除了标签头的10 个字节的标签帧的大小 */
3 f" T: y3 u' i- N
3 E" z+ S7 B! K标签大小为四个字节,但每个字节只用低7位,最高位不使用,�为0,其格式如下:
) O, G# y& b4 D0xxxxxxx 0xxxxxxx 0xxxxxxx 0xxxxxxx + U9 e- }4 d0 u$ O" Q; d

  a: T5 ?3 e$ l% N% {计算公式如下:
1 X" C% I6 a( I+ E* g& u4 a7 q; x) Z6 @' F) j9 d
ID3V2_frame_size =  (int)(Size[0] & 0x7F) << 21
( }& D# w: ?0 I! m+ v/ H+ I                  | (int)(Size[1] & 0x7F) << 14# y$ m9 L. s! r1 w: y( T' p
                  | (int)(Size[2] & 0x7F) << 7; A! ]9 B4 u8 w* v; W* e
                  | (int)(Size[3] & 0x7F) + 10; ! E/ d( K9 {8 a

) b9 Z6 o+ X; L* O3 t 3 d  v/ O6 h$ K+ O4 u
标签帧
2 ^2 h8 x% \: V7 B3 O. m  M3 ~. T' e5 m2 j+ S* I
每个标签帧都有一个10字节的帧头和至少一个字节的不固定长度的内容组成。它们是顺序存放在文件中,由各自特定的标签头来标记帧的开始。其帧的结构如下:
; D/ l0 c# i/ x* Q
; U1 A6 ]) o! V  jchar FrameID[4];   /*用四个字符标识一个帧,说明其内容 */ ) {8 U; X" N" }) ~* `* p6 W6 T, e

  E1 S, X- a. q0 z: schar Size[4];      /* 帧内容的大小,不包括帧头,不得小于1 */ . C% A3 V4 |' y- Z. Y# V
1 l, e  m( c& P$ X! P* H" v1 ^
char Flags[2];     /* 存放标志,只定义了6 位,此处不再说明 */ + w. A* s! J3 z4 t
4 [7 q6 m5 V. T7 u
常用帧标识: % k8 Y* C7 N' o
& l" E) L- d3 k$ `0 S
TIT2:标题
; O/ ~$ F' |+ {! W8 v; x/ I7 BTPE1:作者
, H$ {' p6 h  U# L. Q9 VTALB:专辑
# D' ^0 Z3 H" n- E  nTRCK: 音轨,格式:N/M,N表示专辑中第几首,M为专辑中歌曲总数+ g% ~4 g9 W, B) k
TYER:年份
2 W1 `1 h1 U! h, u. U" D) OTCON:类型+ L7 s7 k; D3 E7 E* \2 u
COMM:备注,格式:“eng\0备注内容”,其中eng表示所使用的语言9 u# t) U9 i9 ?" X( F: ~$ s5 ~
帧大小为四个字节所表示的整数大小。 1 O0 E1 E8 s- k- d: B

) k7 O7 E: ?5 F0 G1 W
' A% W5 j- ]0 A. h) k2 lII, ID3V1 ( ], [! Y, M% G2 A1 Y0 s
* L4 ~9 p& |; s1 R/ K' s9 i
其数据结构如下: 6 B. c+ \3 q! ~' f: @

! l' Q2 w. B1 {* m2 m/ }char Header[3];    /* 标签头必须是"TAG"否则认为没有标签 */' r8 C5 A0 L5 b4 E' ?. C0 o
char Title[30];    /* 标题 */
% b3 F( V0 {  c; r) b/ d& b) v$ fchar Artist[30];   /* 作者 */1 C! b9 {6 ~2 b6 J+ `
char Album[30];    /* 专集 */: h) Q/ l  s- v
char Year[4];      /* 出品年代 */2 M1 G* J% h3 ]- a6 M
char Comment[28]; /* 备注 */- I6 e  k- z0 F
char reserve;      /* 保留 */3 h# W# p5 \6 B
char track;;       /* 音轨 */
1 b$ N0 T7 F2 \; _. U. u3 O2 {char Genre;        /* 类型 */ % ?; f; W- m. O+ y

3 M7 U2 p- Q3 ^0 S4 I6 `6 k: }其实,关于最后31个字节还存在另外一个版本,就是30个字节的Comment和一个字节的Genre. $ B. r' v( F6 G' z) w

3 s. H/ W: O2 B9 |5 G0 N% L! F有了上述的这些信息,我们就可以自己写代码,从MP3文件中抓取信息以及修改文件名了。但是,如果真的想写一个播放软件,还是需要读它的数据帧,并进行解码。
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂 踩 分享分享
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2024-11-16 07:26 AM , Processed in 0.148008 second(s), 17 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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