Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

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

MP3文件格式解析2

[複製鏈接]
跳轉到指定樓層
1#
發表於 2007-4-11 05:00:36 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
2,      MP3文件格式 3 s. r  }- w  J$ D4 h3 r  ^9 }4 N/ z

. g' h* Q+ `( D3 }! v0 N9 [' K用一个二进制查看器(比如Ultra-Edit)打开一个MP3文件,就能看到一大堆看似杂乱无序的数据。但只要用心了解就会知道,其实,这一切都是有章可循的。/ X" T  g3 W% t* m( c! d* C' C3 x- T

9 U$ l/ s9 Z  L5 ~MP3文件是由帧(frame)构成,帧是MP3文件的最小组成单位。每帧都包含帧头,并可以计算帧的长度。根据帧的性质不同,文件主要分为三个部分,ID3v2标签帧,数据帧和ID3v1标签帧。并非每个MP3文件都有ID3v2,但是数据帧和ID3v1帧是必须的。ID3v2在文件头,以字符串“ID3”为标志,包含了演唱者,作曲,专辑等信息,长度不固定,扩展了ID3V1的信息量。ID3v1在文件结尾,以字符串“TAG”为标记,其长度是固定的128个字节,包含了演唱者、歌名、专辑、年份等信息。
. z7 u" y. d5 X2 C9 f4 Z) t $ d0 j0 T- {: i! z0 d1 v
I, ID3V2 * L7 S+ ?9 _, G6 [& ?% [, e2 u4 b: f

7 A  Z* t. x3 @1 T9 R5 p: \ID3V2到现在一共有四个版本,但流行的播放软件一般只支持第三版,既ID3V2.3。每个ID3V2.3 的标签都一个标签头和若干个标签帧或一个扩展标签头组成。关于曲目的信息如标题、作者等都存放在不同的标签帧中,扩展标签头和标签帧并不是必要的,但每个标签至少要有一个标签帧。标签头和标签帧一起顺序存放在MP3 文件的首部。
7 U0 f' d- c# r% I& R% g: z0 ~. T# O8 v' Q$ ]
标签头 : i4 ?. k3 P3 M6 K! J7 L
! H, B4 Y$ O) K0 o/ W8 o5 @& I0 f
长度为10个字节,位于文件首部,其数据结构如下: 5 N$ P/ ]5 J# A3 s* E

/ e! \6 \+ X0 i. y+ w9 ]char Header[3]; /* 字符串 "ID3" */
# l5 p8 n0 ~1 `5 t; J5 T% f; K9 L$ W% t' n
char Ver;       /* 版本号ID3V2.3 就记录3 */ 8 B1 B+ y3 b1 c+ a. c* {2 i+ P
& D2 R. V# k$ H- a
char Revision;  /* 副版本号此版本记录为0 */
2 U0 H" f) P- `6 B$ D$ {% [, |% c# t" T2 l1 Z; W$ z& I3 f+ N' d
char Flag;     /* 存放标志的字节,这个版本只定义了三位,很少用到,可以忽略 */
4 ?8 H, [; W. |- t5 A9 X3 n& s
9 u: U" Z) R; ^7 ?8 x! ~char Size[4];  /* 标签大小,除了标签头的10 个字节的标签帧的大小 */
( c) Z/ K1 b' g4 R/ f6 T9 U; z+ C9 L6 K$ G" Z( L) B) l
标签大小为四个字节,但每个字节只用低7位,最高位不使用,�为0,其格式如下:
% y4 X1 e* U' P% b6 Q% J# O0xxxxxxx 0xxxxxxx 0xxxxxxx 0xxxxxxx
. {* n1 [  m4 a8 p
3 k0 t9 y5 Q  }: o计算公式如下: + g4 Q/ G, a/ D' c% j
- A6 M4 J6 Q  n% u: n
ID3V2_frame_size =  (int)(Size[0] & 0x7F) << 21
. M( A' ?5 F- x5 A" ?                  | (int)(Size[1] & 0x7F) << 14
% U5 z6 p0 x& ?$ ?* Y4 U; n                  | (int)(Size[2] & 0x7F) << 7
; g# S& ?/ h8 {/ C$ `# v                  | (int)(Size[3] & 0x7F) + 10; ) f4 _8 E. F: ?" f2 [, f" J

! v# w2 s4 t: u5 l2 Z & ~6 P2 M5 o5 t/ @# q; L
标签帧
! \) F7 g7 l. I6 u6 H# F& ~: Y) r. o3 Y/ U" ?# H! Z0 Q2 X$ a$ }3 Z+ x" T. B
每个标签帧都有一个10字节的帧头和至少一个字节的不固定长度的内容组成。它们是顺序存放在文件中,由各自特定的标签头来标记帧的开始。其帧的结构如下: 5 n8 f/ z* K) w$ n) v" f8 {4 `2 m# z& O

; H  j  n0 m1 U5 Z7 \8 F/ i# J( Mchar FrameID[4];   /*用四个字符标识一个帧,说明其内容 */ 4 p: ]  X% D  I. J

  m: z+ b2 X* P/ }# Rchar Size[4];      /* 帧内容的大小,不包括帧头,不得小于1 */
5 }  T) k0 L7 b7 c( [2 }$ }; @" d% z% S( V
char Flags[2];     /* 存放标志,只定义了6 位,此处不再说明 */
: R( q# K0 h& ^* q" L* C$ d" g5 I, n9 a
常用帧标识: ; h. b( {+ y( j& `4 d: J% s
0 X& B  u) ~* ?) f
TIT2:标题
* i# u0 W1 |' }TPE1:作者
5 [7 L5 q0 s6 P6 y' c2 B7 yTALB:专辑
8 y0 g9 ?' E' aTRCK: 音轨,格式:N/M,N表示专辑中第几首,M为专辑中歌曲总数1 r- i  l7 `3 A; f7 U. p# ^
TYER:年份/ |2 n* X: i+ F) F6 |* h' d
TCON:类型3 t" C: V( @# V& V' A" k
COMM:备注,格式:“eng\0备注内容”,其中eng表示所使用的语言* X, W0 l- H, Y3 K" u+ Y
帧大小为四个字节所表示的整数大小。 3 o: @  U2 ^  t9 c

7 [& l, e# V# V & Y- I4 x$ |5 z: ~
II, ID3V1 & _, ]1 m& m' e* K9 ]0 ]2 Z0 y

7 B7 S7 B# U* @9 @* }$ Q5 d8 }1 A其数据结构如下:
4 b  m: I) K; L1 S
/ c& S  |( v. K- B: X2 Ochar Header[3];    /* 标签头必须是"TAG"否则认为没有标签 */  |; ~9 d) t1 ^8 {2 u
char Title[30];    /* 标题 */! e* h/ u2 T0 @# W8 m+ s/ J3 T
char Artist[30];   /* 作者 */
% v" n0 f0 T# J* s* j; M! schar Album[30];    /* 专集 */  Z3 V: |2 v; U& U
char Year[4];      /* 出品年代 */
3 v& j* A3 e8 e  F; }: Kchar Comment[28]; /* 备注 */  y% a7 I9 g( Y
char reserve;      /* 保留 */
* s4 M8 j, u4 D' m' Xchar track;;       /* 音轨 */
' \" ]2 ~. O' P5 ~& A! Schar Genre;        /* 类型 */ 1 C- h$ b1 H* C% @; ~" t

9 M/ b' t: {# X0 h% l其实,关于最后31个字节还存在另外一个版本,就是30个字节的Comment和一个字节的Genre.
( r8 Y3 C5 H% I9 x* N
" x* ~/ ?2 @  Q' h: E有了上述的这些信息,我们就可以自己写代码,从MP3文件中抓取信息以及修改文件名了。但是,如果真的想写一个播放软件,还是需要读它的数据帧,并进行解码。
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂 踩 分享分享
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

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

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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