Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

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

MP3文件格式解析2

[複製鏈接]
跳轉到指定樓層
1#
發表於 2007-4-11 05:00:36 | 只看該作者 回帖獎勵 |正序瀏覽 |閱讀模式
2,      MP3文件格式 9 s: ?6 p# O2 [8 E. T
0 Q& y5 j; l/ O
用一个二进制查看器(比如Ultra-Edit)打开一个MP3文件,就能看到一大堆看似杂乱无序的数据。但只要用心了解就会知道,其实,这一切都是有章可循的。8 E, d0 P9 y, g$ {2 b* R" a

2 L' @$ a) \' Z/ ]; M) \; dMP3文件是由帧(frame)构成,帧是MP3文件的最小组成单位。每帧都包含帧头,并可以计算帧的长度。根据帧的性质不同,文件主要分为三个部分,ID3v2标签帧,数据帧和ID3v1标签帧。并非每个MP3文件都有ID3v2,但是数据帧和ID3v1帧是必须的。ID3v2在文件头,以字符串“ID3”为标志,包含了演唱者,作曲,专辑等信息,长度不固定,扩展了ID3V1的信息量。ID3v1在文件结尾,以字符串“TAG”为标记,其长度是固定的128个字节,包含了演唱者、歌名、专辑、年份等信息。7 B, B1 a1 U! I# ^! ?1 a! v$ D! `1 J
6 w0 A6 o/ D0 w  ]4 @1 [
I, ID3V2
' u" K% B: `7 S7 t+ O( v; B" k2 q! b* F+ i
ID3V2到现在一共有四个版本,但流行的播放软件一般只支持第三版,既ID3V2.3。每个ID3V2.3 的标签都一个标签头和若干个标签帧或一个扩展标签头组成。关于曲目的信息如标题、作者等都存放在不同的标签帧中,扩展标签头和标签帧并不是必要的,但每个标签至少要有一个标签帧。标签头和标签帧一起顺序存放在MP3 文件的首部。' o' M. N4 k0 ]+ L! k- R4 y8 e

; p- |8 ]- c! B$ R! Y# k标签头
, ^/ o5 c8 O, \: d
. ?9 {- ~% V: r3 x) B长度为10个字节,位于文件首部,其数据结构如下: + _1 C/ E+ v  T6 v( n
# P8 Y4 I. b+ i) x7 Q
char Header[3]; /* 字符串 "ID3" */
1 @+ R2 N( u. X, ~# Q2 C8 d3 w& U1 ^. r3 @# G# C& Y
char Ver;       /* 版本号ID3V2.3 就记录3 */ 6 x/ e1 l3 O# q% z; \8 d

+ ]1 \. D& Z1 Achar Revision;  /* 副版本号此版本记录为0 */ ! c& L# R6 `; e. N  e# A
0 O* g# h" `7 ?7 v- u, n# l8 z
char Flag;     /* 存放标志的字节,这个版本只定义了三位,很少用到,可以忽略 */ ' ^# p; `7 B# ]+ \+ Z: E" T# @

/ e1 C5 y2 \/ V0 b1 q1 r2 W8 qchar Size[4];  /* 标签大小,除了标签头的10 个字节的标签帧的大小 */ 8 K8 f: H! J* I# c; Z

3 C% M7 Z3 A8 }. z) Z/ I# _; S0 U标签大小为四个字节,但每个字节只用低7位,最高位不使用,�为0,其格式如下:
: }8 S# r  ]8 D% ~+ Y0xxxxxxx 0xxxxxxx 0xxxxxxx 0xxxxxxx 8 k5 ?4 z' ~8 c! [  }
5 t& v3 D8 I. N* n% h( V; w' z
计算公式如下:
- _& B) ?9 Z# k' v1 T# k% k; A+ d- ^% _1 [
ID3V2_frame_size =  (int)(Size[0] & 0x7F) << 21  U& q$ s1 T. s  y% r. J
                  | (int)(Size[1] & 0x7F) << 140 M1 w" T2 M! S6 ]' m
                  | (int)(Size[2] & 0x7F) << 79 ^6 P& |+ g5 W6 o
                  | (int)(Size[3] & 0x7F) + 10;
  W" e2 E6 w9 Z6 Q7 Z7 V9 G+ s2 o  r& F+ Y# [/ O! @

! J4 w; [% ~  E- W: X7 a标签帧 2 S/ i7 x5 Z3 x. ?0 p# w; Q
3 \; ]4 u' B4 d
每个标签帧都有一个10字节的帧头和至少一个字节的不固定长度的内容组成。它们是顺序存放在文件中,由各自特定的标签头来标记帧的开始。其帧的结构如下: . d2 v( t5 Y) k5 s/ |
. H; x' k" z0 L2 t5 p: f
char FrameID[4];   /*用四个字符标识一个帧,说明其内容 */ ) M4 W% U( J  }! T  ~8 I. o/ Z
. ]& ~4 l) u4 B  r  K. X
char Size[4];      /* 帧内容的大小,不包括帧头,不得小于1 */ " o* l: r8 Y) [/ @5 |3 Y7 {
7 G' B, u) p' j2 @
char Flags[2];     /* 存放标志,只定义了6 位,此处不再说明 */ + W4 n# l1 w' k4 J

6 H. o7 g8 B) u, k& I2 [- e常用帧标识:
, K  A5 X2 w) H
; d3 f) t4 ]& Y+ n( t" `* i, BTIT2:标题
& x! k4 X9 c1 |: B' u* A1 GTPE1:作者
+ Q" g* U3 f$ E, n6 cTALB:专辑
; S3 C4 @' A0 Y) T, YTRCK: 音轨,格式:N/M,N表示专辑中第几首,M为专辑中歌曲总数9 b; l7 I3 l5 B) e
TYER:年份
* E4 {3 `: a- u2 T6 ?" \2 B  kTCON:类型; q% ^; Z1 W0 C: Q/ Z
COMM:备注,格式:“eng\0备注内容”,其中eng表示所使用的语言" h* q# W& y- h  r) I+ L# t+ y+ B
帧大小为四个字节所表示的整数大小。 ; ]5 C9 p- \* K
. E& e$ Z) P; P! i& i) Z

3 S) X8 M# g9 o( r6 ?1 wII, ID3V1 + w) d) a4 v# H/ Z) y( D

$ Q7 x4 G/ L+ p% w其数据结构如下: " G6 Z9 b+ ?1 }. K# S9 P) @0 Z1 w
4 }/ S, V% q. B: z* S
char Header[3];    /* 标签头必须是"TAG"否则认为没有标签 */# S3 f9 W0 S3 `% V  T( z) A
char Title[30];    /* 标题 */
) l& m6 [( s2 V8 {5 H5 Dchar Artist[30];   /* 作者 */8 r& i2 W1 F. U" N7 {: I
char Album[30];    /* 专集 */+ }& L/ S7 s, X% O4 a  j% l3 M  R
char Year[4];      /* 出品年代 */$ s5 C5 R) p/ H8 H7 X  N- l# _
char Comment[28]; /* 备注 */
) A/ u; B& ^0 R7 \char reserve;      /* 保留 */* J* u6 [- }8 s5 n
char track;;       /* 音轨 */
  ^$ Z4 @  q8 w" Q1 a; s8 L9 D0 Achar Genre;        /* 类型 */
/ r) a1 d1 c; o6 }& X0 [
( J: n! Z7 T9 W/ s# J2 w其实,关于最后31个字节还存在另外一个版本,就是30个字节的Comment和一个字节的Genre.
3 ]* Z$ C5 B8 }9 q  f1 V7 l  t  n6 g6 ~5 p
有了上述的这些信息,我们就可以自己写代码,从MP3文件中抓取信息以及修改文件名了。但是,如果真的想写一个播放软件,还是需要读它的数据帧,并进行解码。
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂 踩 分享分享
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2024-9-28 02:15 PM , Processed in 0.162010 second(s), 18 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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