Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

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

MP3文件格式解析2

[複製鏈接]
跳轉到指定樓層
1#
發表於 2007-4-11 05:00:36 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
2,      MP3文件格式 : ~+ J2 ]% k( x8 \, Y8 T1 _
' E: z2 ?0 L9 `8 a! H1 K
用一个二进制查看器(比如Ultra-Edit)打开一个MP3文件,就能看到一大堆看似杂乱无序的数据。但只要用心了解就会知道,其实,这一切都是有章可循的。3 i  J9 c4 s* d3 q' C0 y1 d

5 p2 m: C( s& v# Q0 Z3 P- SMP3文件是由帧(frame)构成,帧是MP3文件的最小组成单位。每帧都包含帧头,并可以计算帧的长度。根据帧的性质不同,文件主要分为三个部分,ID3v2标签帧,数据帧和ID3v1标签帧。并非每个MP3文件都有ID3v2,但是数据帧和ID3v1帧是必须的。ID3v2在文件头,以字符串“ID3”为标志,包含了演唱者,作曲,专辑等信息,长度不固定,扩展了ID3V1的信息量。ID3v1在文件结尾,以字符串“TAG”为标记,其长度是固定的128个字节,包含了演唱者、歌名、专辑、年份等信息。
6 p0 j! y) A8 u/ U
% a* s( t" b  yI, ID3V2
2 Z& @) B% Y4 N5 M- u
) {' Z: P) u+ _5 h- F; z! tID3V2到现在一共有四个版本,但流行的播放软件一般只支持第三版,既ID3V2.3。每个ID3V2.3 的标签都一个标签头和若干个标签帧或一个扩展标签头组成。关于曲目的信息如标题、作者等都存放在不同的标签帧中,扩展标签头和标签帧并不是必要的,但每个标签至少要有一个标签帧。标签头和标签帧一起顺序存放在MP3 文件的首部。
: J2 t% s5 K: v$ ]  c5 Q$ C3 K: V+ ?9 m
标签头
' P- R; K6 m5 |; M/ s2 G- }: c1 J6 n0 J' I6 _/ c! U  z5 N
长度为10个字节,位于文件首部,其数据结构如下: - T+ X) |6 w+ V2 |2 Y" G. K

/ c, `1 s; ^* M! O5 l0 Zchar Header[3]; /* 字符串 "ID3" */0 }* @; v0 M! K+ I1 g

$ A: t+ d5 t8 M3 Schar Ver;       /* 版本号ID3V2.3 就记录3 */ 8 ?& M, P, j3 e+ U
( K% j- `4 E3 w2 v5 K5 p0 _# ^
char Revision;  /* 副版本号此版本记录为0 */ 1 |; L" A& R2 W  L& y7 }& g9 b

$ S% M% b! f0 G& U. tchar Flag;     /* 存放标志的字节,这个版本只定义了三位,很少用到,可以忽略 */ : F! {9 {( G0 E+ v% ^
! J  S' U7 n' c% t  O8 @
char Size[4];  /* 标签大小,除了标签头的10 个字节的标签帧的大小 */
( h9 w+ K2 U5 d" z4 J
8 ~; W% f. H$ d1 ^/ z标签大小为四个字节,但每个字节只用低7位,最高位不使用,�为0,其格式如下:
( [( z# l, U0 R# g/ g; a+ K0 f0xxxxxxx 0xxxxxxx 0xxxxxxx 0xxxxxxx 7 u2 T1 {( a- G. [2 R( b
8 v2 i- M: i/ j+ c! r! u
计算公式如下: ( X0 w0 a5 O" R! a5 c/ r3 E
# y0 D/ u) u3 E8 S7 m) I
ID3V2_frame_size =  (int)(Size[0] & 0x7F) << 21. m$ z" w/ p# R0 r
                  | (int)(Size[1] & 0x7F) << 14
6 N! Z: D: R/ U7 P( ~2 a                  | (int)(Size[2] & 0x7F) << 7
7 g5 j. \( |, s# z                  | (int)(Size[3] & 0x7F) + 10;
7 a* W8 Z. C& W" ^) U9 F
/ S( I* f) S- {$ Q7 N/ Z, y6 l4 E) @ 7 w/ O. L, B% I( \& C, Z5 {
标签帧 ( Y2 m7 ~1 ?4 a3 v( |8 j
6 i8 N, J, h7 Y( w% x7 A
每个标签帧都有一个10字节的帧头和至少一个字节的不固定长度的内容组成。它们是顺序存放在文件中,由各自特定的标签头来标记帧的开始。其帧的结构如下:
; X& T) s1 e2 c  a  A
1 K3 y3 V, v' P( Y$ X4 c7 zchar FrameID[4];   /*用四个字符标识一个帧,说明其内容 */
( S4 N6 Z7 [' {  T* x
% Y3 O$ R& ]) ichar Size[4];      /* 帧内容的大小,不包括帧头,不得小于1 */ 8 c0 K6 |7 V0 h& ?; M* o  \( h

* W5 B, Z& T; X* z3 T+ Tchar Flags[2];     /* 存放标志,只定义了6 位,此处不再说明 */
; d3 R3 n! m* }4 U, q: @8 j% n6 y, V7 J  B- m$ h5 o
常用帧标识: 9 F* B9 @, S8 e0 O; H. N$ Q/ h
5 e6 q3 g+ Y1 e7 S- M% G8 I2 L6 Z; c
TIT2:标题6 a# K( u- ?, }$ \: B5 U0 g& @
TPE1:作者
, i' k1 I8 i; QTALB:专辑6 ]8 o4 z( A- }7 R6 |) `: G2 M. ~
TRCK: 音轨,格式:N/M,N表示专辑中第几首,M为专辑中歌曲总数
3 a" l/ @! a4 @3 M! ?, i( w* q& c2 tTYER:年份
1 p& p# i- W9 o% OTCON:类型
1 ?3 v! J# |8 e3 F% d) _. }% uCOMM:备注,格式:“eng\0备注内容”,其中eng表示所使用的语言
! w7 L: g: |$ S% Q帧大小为四个字节所表示的整数大小。
2 b1 C4 I4 U1 K7 c0 r3 i, w
- L# K: x7 G4 |5 S. C: u* o ) n/ |  `. d8 o( X8 c- g
II, ID3V1 3 N3 d6 H; Q8 _0 h+ h8 Z* J3 e

7 }; W/ a. b! ?其数据结构如下: , e  K9 W7 v7 ^2 E8 d* g5 ~. ]
8 ^  n. J+ i! y
char Header[3];    /* 标签头必须是"TAG"否则认为没有标签 */
! q4 |1 X; i9 o3 \char Title[30];    /* 标题 */
- u$ O) Y0 @$ U; o% R4 }1 j2 Fchar Artist[30];   /* 作者 */- D. d8 d# J+ o0 a- v
char Album[30];    /* 专集 */
5 N' T3 ]% H9 G+ N/ C: q( s: b( Pchar Year[4];      /* 出品年代 */
. Z& {+ S- T) T6 x/ \5 W" c/ Qchar Comment[28]; /* 备注 */
' F5 R2 c; j: m; r& a& ~" Rchar reserve;      /* 保留 */" f3 s1 b0 I$ K2 X0 D
char track;;       /* 音轨 */' B0 ?- E" s5 {) l( V: Z, M" L+ b2 ]
char Genre;        /* 类型 */ . Y, x9 n  ~+ V9 Q6 ^

5 I. Y2 B, U; Q. Q5 {3 j* }* q& t其实,关于最后31个字节还存在另外一个版本,就是30个字节的Comment和一个字节的Genre.
" k; C0 L/ }, K6 u" F4 d* {5 x  l; v4 v. z% X3 l- d5 n
有了上述的这些信息,我们就可以自己写代码,从MP3文件中抓取信息以及修改文件名了。但是,如果真的想写一个播放软件,还是需要读它的数据帧,并进行解码。
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂 踩 分享分享
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

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

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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