mp3格式音频文件结构解析图_mp3文件结构(在哪可以免费下载mp3格式的歌曲)
一、概述
Layer-3 音頻文件,MPEG(Moving Picture Experts Group) 在漢語中譯為活動圖像專家組,特指活動影音壓縮標準,MPEG音頻文件是MPEG1 標準中的聲音部分,也叫MPEG 音頻層,它根據壓縮質量和編碼復雜程度劃分為三層,即Layer-1、Layer2、Layer3,且分別對應MP1、MP2、MP3 這三種聲音文件,并根據不同的用途,使用不同層次的編碼。
MPEG 音頻編碼的層次越高,編碼器越復雜,壓縮率也越高,MP1 和MP2 的壓縮率分別為4:1 和6:1-8:1,而MP3 的壓縮率則高達10:1-12:1,也就是說,一分鐘CD 音質的音樂,未經壓縮需要10MB的存儲空間,而經過MP3 壓縮編碼后只有1MB 左右。不過MP3 對音頻信號采用的是有損壓縮方式,為了降低聲音失真度,MP3采取了“感官編碼技術”,即編碼時先對音頻文件進行頻譜分析,然后用過濾器濾掉噪音電平,接著通過量化的方式將剩下的每一位打散排列,最后形成具有較高壓縮比的MP3 文件,并使壓縮后的文件在回放時能夠達到比較接近原音源的聲音效果。
二、整個MP3 文件結構:
MP3 文件大體分為三部分:TAG_V2(ID3V2),音頻數據,TAG_V1(ID3V1)
a). ID3V2 在文件開始的位置,包含了作者,作曲,專輯等信息,長度不固定,擴展了ID3V1 的信息量。
b). 一系列的音頻數據的幀,在文件的中間位置,個數由文件大小和幀長決定;
每個幀的長度可能不固定,也可能固定,由位率bitrate決定
每個幀又分為幀頭和數據實體兩部分
幀頭記錄了mp3 的位率,采樣率,版本等信息,每個幀之間相互獨立。
c). ID3V1在文件結尾的位置,包含了作者,作曲,專輯等信息,長度為128Byte。
|
ID3V2 |
包含了作者,作曲,專輯等信息,長度不固定,擴展了ID3V1的信息量。 |
|
Frame . . . Frame |
一系列的幀,個數由文件大小和幀長決定 每個FRAME的長度可能不固定,也可能固定,由位率bitrate決定 每個FRAME又分為幀頭和數據實體兩部分 幀頭記錄了mp3的位率,采樣率,版本等信息,每個幀之間相互獨立。 |
|
ID3V1 |
包含了作者,作曲,專輯等信息,長度為128BYTE。 |
表格2.1
1、ID3V2
ID3V2 到現在一共有4 個版本,但流行的播放軟件一般只支持第3 版, 既ID3v2.3。
由于ID3V1 記錄在MP3 文件的末尾,ID3V2就只好記錄在MP3 文件的首部了(如果有一天發布ID3V3,真不知道該記錄在哪里)。也正是由于這個原因,對ID3V2 的操作比ID3V1 要慢。而且ID3V2 結構比ID3V1 的結構要復雜得多,但比前者全面且可以伸縮和擴展。
下面就介紹一下ID3V2.3:
每個ID3V2.3 的標簽都一個標簽頭和若干個標簽幀或一個擴展標簽頭組成。關于曲目的信息如標題、作者等都存放在不同的標簽幀中,擴展標簽頭和標簽幀并不是必要的,但每個標簽至少要有一個標簽幀。標簽頭和標簽幀一起順序存放在MP3 文件的首部。
1、標簽頭
在文件的首部順序記錄10 個字節的ID3V2.3 的頭部。數據結構如下:
char Header[3]; /*必須為”ID3″否則認為標簽不存在*/
char Ver; /*版本號ID3V2.3 就記錄3*/
char Revision; /*副版本號此版本記錄為0*/
char Flag; /*存放標志的字節,這個版本只定義了三位,稍后詳細解說*/
char Size[4]; /*標簽大小,包括標簽頭的10 個字節和所有的標簽幀的大小*/
圖2.1
藍色部分即為ID3V2.3的頭部:前4個字節就是 ID30x03(第3版)
第5個字節:副版本號,為0
注:文中關于mp3文件數據截圖均為“紫藤花.mp3”文件中的數據截圖
1)標志字節
標志字節一般為0,定義如下:
abc00000
a — 表示是否使用Unsynchronisation(這個單詞不知道是什么意思,字典里也沒有找到,一般不設置)
b — 表示是否有擴展頭部,一般沒有(至少Winamp 沒有記錄),所以一般也不設置
c — 表示是否為測試標簽(99.99%的標簽都不是測試用的啦,所以一般也不設置)
第6個字節:存放標志的字節,只定義了三位,這里值為0
2)標簽大小
一共四個字節,但每個字節只用7位,最高位不使用恒為0。所以格式如下
0xxxxxxx 0xxxxxxx 0xxxxxxx 0xxxxxxx
計算大小時要將0 去掉,得到一個28 位的二進制數,就是標簽大小(不懂為什么要這樣做),計算公式如下:
int total_size;
total_size =
(Size[0]&0x7F)*0x200000+ (Size[1]&0x7F)*0x400 + (Size[2]&0x7F)*0x80 +(Size[3]&0x7F)
第7到10字節:表示ID3標簽的大小,這里為
total_size=(0x00&0x7F)*0x200000+(0x00&0x7F)*0x400+(0x2F&0x10)*0x80 +(0x76 &072)
= 0x872 =2162
注意:這里的幀大小,并不包含幀頭的10個字節,只表示幀內容的大小
2、標簽幀
每個標簽幀都有一個10 個字節的幀頭和至少一個字節的不固定長度的內容組成。它們也是順序存放在文件中,和標簽頭和其他的標簽幀也沒有特殊的字符分隔。得到一個完整的幀的內容只有從幀頭中的到內容大小后才能讀出,讀取時要注意大小,不要將其他幀的內容或幀頭讀入。
幀頭的定義如下:
char ID[4]; /*用四個字符標識一個幀,說明其內容,稍后有常用的標識對照表*/
char Size[4]; /*幀內容的大小,不包括幀頭,不得小于1*/
char Flags[2]; /*存放標志,只定義了6 位,稍后詳細解說*/
圖2.2
藍色部分是一個歌曲標題的標簽幀
1)幀標識
用四個字符標識一個幀,說明一個幀的內容含義,常用的對照如下:
TIT2=標題表示內容為這首歌的標題,下同
TPE1=作者
TALB=專集
TRCK=音軌格式:N/M 其中N 為專集中的第N 首,M為專集中共M 首,N和M 為ASCII 碼表示的數字
TYER=年代是用ASCII 碼表示的數字
TCON=類型直接用字符串表示
COMM=備注格式:”eng\0備注內容”,其中eng 表示備注所使用的自然語言
注:更多的幀標識說明見附錄一。
前4個字節為幀標識,這里是54 49 5432(TIT2) 是標題的標簽幀
2)大小
這個可沒有標簽頭的算法那么麻煩,每個字節的8 位全用,格式如下
xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx
算法如下:
int FSize;
FSize = Size[0]*0x100000000 + Size[1]*0x10000+ Size[2]*0x100 + Size[3];
第5到8字節為標簽幀的大小,這里為
FSize = 0x00*0x100000000+ 0x00*0x10000 + 0x00*0x100 + 0x24 = 0x24 = 36
注意:這里的幀大小,并不包含幀頭的10個字節,只表示幀內容的大小
3)標志
只定義了6 位,另外的10 位為0,但大部分的情況下16 位都為0 就可以了。格式如下:
abc00000ijk00000
a — 標簽保護標志,設置時認為此幀作廢
b — 文件保護標志,設置時認為此幀作廢
c — 只讀標志,設置時認為此幀不能修改(但我沒有找到一個軟件理會這個標志)
i — 壓縮標志,設置時一個字節存放兩個BCD 碼表示數字
j — 加密標志(沒有見過哪個MP3 文件的標簽用了加密)
k — 組標志,設置時說明此幀和其他的某幀是一組
值得一提的是winamp 在保存和讀取幀內容的時候會在內容前面加個”\0”,并把這個字節計算在幀內容的大小中。
第9到10字節為標簽幀的標記,如上所述,這里為00
幀內容是歌曲標題,標題的36個字節的內容為:紫藤花☆ゞ忍音.地帶[renyin.12u.cn]
2、音頻數據幀
每個幀都有一個幀頭Header,長度是4Byte(32bit),幀頭后面可能有兩個字節的CRC 校驗值,這兩個字節的是否存在決定于Header 信息的第16bit,為0 則幀頭后面無校驗,為1 則有校驗,校驗值長度為2 個字節,緊跟在Header 后面,接著就是幀的實體數據了,格式如下:
1、 幀頭格式
幀頭長4字節,對于固定位率的MP3文件,所有幀的幀頭格式一樣其數據結構如下(注:此結構要自己定義):
typedef struct frameHeader
{
unsigned int sync1:8; //同步信息1
unsigned int error_protection:1; //CRC校驗
unsigned int layer:2; //層
unsigned int version:2; //版本
unsigned int sync2:3; //同步信息2
unsigned int extension:1; //版權
unsigned int padding:1; //填充空白字
unsigned int sample_rate_index:2; //采樣率索引
unsigned int bit_rate_index:4; //位率索引
unsigned int emphasis:2; //強調方式
unsigned int original:1; //原始媒體
unsigned int copyright:1; //版權標志
unsigned int mode_extension:2; //擴展模式,僅用于聯合立體聲
unsigned int channel_mode:2; //聲道模式
}FHEADER, *LPHEADER;
MP3幀頭字節說明
請見:mp3音頻數據幀幀頭及VBR頭字節使用說明.xls
圖 2.3
第1幀數據:幀頭為 FF FB 9004
1111 11111111 1011 1001 0000 0000 0010
前11位:同步信息
第12到13位:版本,其值為11 ->MPEG 1
第14到15位:層,其值為01->Layer 3
第16位:CRC檢驗標識,其值為1 ->不校驗
第17到20位:位率,其值為1001,從前面可知本幀為V1,L3類型, ->128K
第21到22位:采樣率,其值為00,從前面知本幀為 MPEG 1-> 44.1K
第23位:幀長調節,其值為0 ->無需調整
第24位:未使用
第25到26位:聲道模式,其值為00->立體聲Stereo
第27到28位:擴充模式,當聲道模式為01(聯合立體聲)時才使用,此處未使用
第29位:版權,其值為0->無版權
第30位:原版標志,其值為1->是原版文件
第31到32位:強調方式,其值為00->未定義
1)計算幀長度
我們首先區分兩個術語:幀大小和幀長度。幀大小即每幀采樣數表示一幀中采樣的個數,這是恒定值。其值如下表所示
|
MPEG 1 |
MPEG 2(LSF) |
MPEG 2.5(LSF) |
|
|
Layer 1 |
384 |
384 |
384 |
|
Layer 2 |
1152 |
1152 |
1152 |
|
Layer 3 |
1152 |
576 |
576 |
幀長度是壓縮時每一幀的長度,包括幀頭。它將填充的空位也計算在內。LayerI的一個空位長4字節,LayerII和LayerIII的空位是1字節。當讀取MPEG文件時必須計算該值以便找到相鄰的幀。注意:因為有填充和比特率變換,幀長度可能變化。
從頭中讀取比特率,采樣頻率和填充的值后可以進行計算,
LyaerI使用公式:
幀長度(字節) = (( 每幀采樣數/ 8 * 比特率 ) / 采樣頻率 ) + 填充 * 4
LyerII和LyaerIII使用公式:
幀長度(字節)= (( 每幀采樣數/ 8 * 比特率 ) / 采樣頻率 ) + 填充
例:
LayerIII 比特率 128000,采樣頻率 44100,填充0 =〉幀大小 417字節;
如圖 2.3中,比特率為128K,采樣率為44.1K,填充0,則其幀長度為:
(1152 / 8 * 128K)/44.1K = 417 (字節)
2)每幀的持續時間
每幀的持續時間可以通過計算獲得,下面給出計算公式
每幀持續時間(毫秒) = 每幀采樣數 / 采樣頻率 * 1000
如圖 2.3中,其每幀時間為:
1152 / 44.1K * 1000 = 26.12 (約等于26ms)
如果是MPEG2 Layer III 采樣率為16KHz的話那一幀要持續36毫秒,這個相差還是蠻大的,所以還是應該通過計算來獲的。
3)CRC校驗
如果幀頭的校驗位為0,則幀頭后就有一個16位的CRC值,這個值是big-endian的值,把這個值和該幀通過計算得出的CRC值進行比較就可以得知該幀是否有效。
4)幀數據
在幀頭后邊是Side Info(姑且稱之為通道信息)。對標準的立體聲MP3文件來說其長度為32字節。通道信息后面是Scale factor(增益因子)信息。當解碼器在讀到上述信息后,就可以進行解碼了。圖 2.3中地址為0x880到0x89F(含),此處數據全為0。
對于mp3來說現在有兩種編碼方式,一種是CBR,也就是固定位率,固定位率的幀的大小在整個文件中都是是固定的(公式如上所述),只要知道文件總長度,和從第一幀幀頭讀出的信息,就都可以通過計算得出這個mp3文件的信息,比如總的幀數,總的播放時間等等,要定位到某一幀或某個時間點也很方便,這種編碼方式不需要文件頭,第一幀開始就是音頻數據。另一種是VBR,就是可變位率,VBR是XING公司推出的算法,所以在MP3的FRAME里會有“Xing”這個關鍵字(也有用”Info”來標識的,現在很多流行的小軟件也可以進行VBR壓縮,它們是否遵守這個約定,那就不得而知了),它存放在MP3文件中的第一個有效幀的數據區里,它標識了這個MP3文件是VBR的。同時第一個幀里存放了MP3文件的幀的總個數,這就很容易獲得了播放總時間,同時還有100個字節存放了播放總時間的100個時間分段的幀索引,假設4分鐘的MP3歌曲,240S,分成100段,每兩個相鄰INDEX的時間差就是2.4S,所以通過這個INDEX,只要前后處理少數的FRAME,就能快速找出我們需要快進的幀頭。其實這第一幀就相當于文件頭了。不過現在有些編碼器在編碼CBR文件時也像VBR那樣將信息記入第一幀,比如著名的lame,它使用”Info”來做CBR的標記。
5)VBR頭
這里列出VBR的第一幀存儲文件信息的頭的格式。有兩種格式,一種是常見的XINGHeader(頭部包含字符‘Xing’),另一種是VBRIHeader(頭部包含字符‘VBRI’)鑒于VBRIHeader不常見,下面只說XINGHeader:
XING Header的起始位置,相對于第一幀幀頭的位置,單位是字節
36-39 “Xing” 文件為MPEG1并且不是單聲道(大多數VBR的mp3文件都是如此)
21-24 “Xing” 文件為MPEG1并且是單聲道
21-24 “Xing” 文件為MPEG2并且不是單聲道
13-16 “Xing” 文件為MPEG2并且是單聲道
具體的VBR頭格式說明
請見:mp3音頻數據幀幀頭及VBR頭字節使用說明.xls
在VBR格式的第一幀中,XING Header包括幀頭一共最多只需要156個字節就夠了,當然也可以在XING Header后面存儲編碼器的信息,比如lame在其后就是存儲其版本,這需要給第一幀留足夠的空間才行。
3、ID3v1
ID3V1標準并不周全,存放的信息少,無法存放歌詞,無法錄入專輯封面、圖片等。ID3V2是一個相當完備的標準,但給編寫軟件帶來困難,雖然贊成此格式的人很多,在軟件中絕大多數MP3仍在使用ID3V1標準。ID3v1標簽包含藝術家,標題,唱片集,發布年代和流派。另外還有額外的注釋空間。位于音頻文件的最后固定為128字節。可以讀取該文件的最后這128字節獲得標簽。
ID3V1結構如下:
AAABBBBB BBBBBBBB BBBBBBBB BBBBBBBB
BCCCCCCC CCCCCCCC CCCCCCCC CCCCCCCD
DDDDDDDD DDDDDDDD DDDDDDDD DDDDDEEE
EFFFFFFF FFFFFFFF FFFFFFFF FFFFFGHI
表3.1 ID3 V1.0文件尾說明
|
字節 |
長度 (字節) |
說 明 |
|
1-3(A) |
3 |
存放“TAG”字符,表示ID3 V1.0標準,緊接其后的是歌曲信息。 |
|
4-33(B) |
30 |
歌名 |
|
34-63(C) |
30 |
作者 |
|
64-93(D) |
30 |
專輯名 |
|
94-97(E) |
4 |
年份 |
|
98-125(F) |
28 |
附注 |
|
126(G) |
1 |
保留位 |
|
127(H) |
1 |
音軌號 |
|
128(I) |
1 |
MP3音樂類別,共147種。 |
ID3V1 的各項信息都是順序存放,沒有任何標識將其分開,比如標題信息不足30 個字節,則使用”\0”填充,數據結構定義如下:
typedef struct tagID3V1
{
charHeader[3]; /*標簽頭必須是”TAG”否則認為沒有標簽*/
charTitle[30]; /*標題*/
charArtist[30]; /*作者*/
charAlbum[30]; /*專集*/
charYear[4]; /*出品年代*/
charComment[28]; /*備注*/
charreserve; /*保留*/
chartrack; /*音軌*/
charGenre; /*類型*/
}ID3V1, *pID3V1;
注:流派使用原碼表示說明見附錄二
附錄一:幀標識的含義
4). Declared ID3v2 frames
Thefollowing frames are declared in this draft.
AENCAudio encryption
APICAttached picture
COMMComments
COMRCommercial
ENCREncryption method registration
EQUAEqualization
ETCOEvent timing codes
GEOBGeneral encapsulated object
GRIDGroup identification registration
IPLSInvolved people list
LINKLinked information
MCDIMusic CD identifier
MLLT MPEGlocation lookup table
OWNEOwnership
PRIVPrivate
PCNT Playcounter
POPMPopularimeter
POSSPosition synchronisation
RBUFRecommended buffer size
RVADRelative volume adjustment
RVRBReverb
SYLTSynchronized lyric/text
SYTCSynchronized tempo codes
TALBAlbum/Movie/Show title
TBPM BPM(beats per minute)
TCOMComposer
TCONContent type
TCOPCopyright message
TDAT Date
TDLYPlaylist delay
TENCEncoded by
TEXTLyricist/Text writer
TFLT Filetype
TIME Time
TIT1Content group deion
TIT2Title/songname/content deion
TIT3Subtitle/Deion refinement
TKEYInitial key
TLANLanguage(s)
TLENLength
TMEDMedia type
TOALOriginal album/movie/show title
TOFNOriginal filename
TOLYOriginal lyricist(s)/text writer(s)
TOPEOriginal artist(s)/performer(s)
TORYOriginal release year
TOWN Fileowner/licensee
TPE1 Leadperformer(s)/Soloist(s)
TPE2Band/orchestra/accompaniment
TPE3Conductor/performer refinement
TPE4Interpreted, remixed, or otherwise modified by
TPOS Partof a set
TPUBPublisher
TRCKTrack number/Position in set
TRDARecording dates
TRSNInternet radio station name
TRSOInternet radio station owner
TSIZ Size
TSRC ISRC(international standard recording code)
TSSESoftware/Hardware and settings used for encoding
TYER Year
TXXX Userdefined text information
UFIDUnique file identifier
USERTerms of use
USLTUnsychronized lyric/text tranion
WCOMCommercial information
WCOPCopyright/Legal information
WOAFOfficial audio file webpage
WOAROfficial artist/performer webpage
WOASOfficial audio source webpage
WORSOfficial internet radio station homepage
WPAYPayment
WPUBPublishers official webpage
WXXX Userdefined URL link
附錄二:流派使用原碼表
/* Standard genres */
0=”Blues”;
1=”ClassicRock”;
2=”Country”;
3=”Dance”;
4=”Disco”;
5=”Funk”;
6=”Grunge”;
7=”Hip-Hop”;
8=”Jazz”;
9=”Metal”;
10=”NewAge”;
11=”Oldies”;
12=”Other”;
13=”Pop”;
14=”R&B”;
15=”Rap”;
16=”Reggae”;
17=”Rock”;
18=”Techno”;
19=”Industrial”;
20=”Alternative”;
21=”Ska”;
22=”Deathl”;
23=”Pranks”;
24=”Soundtrack”;
25=”Euro-Techno”;
26=”Ambient”;
27=”Trip-Hop”;
28=”Vocal”;
29=”Jazz+Funk”;
30=”Fusion”;
31=”Trance”;
32=”Classical”;
33=”Instrumental”;
34=”Acid”;
35=”House”;
36=”Game”;
37=”SoundClip”;
38=”Gospel”;
39=”Noise”;
40=”AlternRock”;
41=”Bass”;
42=”Soul”;
43=”Punk”;
44=”Space”;
45=”Meditative”;
46=”InstrumentalPop”;
47=”InstrumentalRock”;
48=”Ethnic”;
49=”Gothic”;
50=”Darkwave”;
51=”Techno-Industrial”;
52=”Electronic”;
53=”Pop-Folk”;
54=”Eurodance”;
55=”Dream”;
56=”SouthernRock”;
57=”Comedy”;
58=”Cult”;
59=”Gangsta”;
60=”Top40″;
61=”ChristianRap”;
62=”Pop/Funk”;
63=”Jungle”;
64=”NativeAmerican”;
65=”Cabaret”;
66=”NewWave”;
67=”Psychadelic”;
68=”Rave”;
69=”Showtunes”;
70=”Trailer”;
71=”Lo-Fi”;
72=”Tribal”;
73=”AcidPunk”;
74=”AcidJazz”;
75=”Polka”;
76=”Retro”;
77=”Musical”;
78=”Rock&Roll”;
79=”HardRock”;
Winamp擴充了這個表
80=”Folk”;
81=”Folk-Rock”;
82=”NationalFolk”;
83=”Swing”;
84=”FastFusion”;
85=”Bebob”;
86=”Latin”;
87=”Revival”;
88=”Celtic”;
89=”Bluegrass”;
90=”Avantgarde”;
91=”GothicRock”;
92=”ProgessiveRock”;
93=”PsychedelicRock”;
94=”SymphonicRock”;
95=”SlowRock”;
96=”BigBand”;
97=”Chorus”;
98=”EasyListening”;
99=”Acoustic”;
100=”Humour”;
101=”Speech”;
102=”Chanson”;
103=”Opera”;
104=”ChamberMusic”;
105=”Sonata”;
106=”Symphony”;
107=”BootyBass”;
108=”Primus”;
109=”PornGroove”;
110=”Satire”;
111=”SlowJam”;
112=”Club”;
113=”Tango”;
114=”Samba”;
115=”Folklore”;
116=”Ballad”;
117=”PowerBallad”;
118=”RhythmicSoul”;
119=”Freestyle”;
120=”Duet”;
121=”PunkRock”;
122=”DrumSolo”;
123=”Acapella”;
124=”Euro-House”;
125=”DanceHall”;
其他擴充
126=”Goa”;
127=”Drum&Bass”;
128=”Club-House”;
129=”Hardcore”;
130=”Terror”;
131=”Indie”;
132=”BritPop”;
133=”Negerpunk”;
134=”PolskPunk”;
135=”Beat”;
136=”ChristianGangstaRap”;
137=”Heavyl”;
138=”Blackl”;
139=”Crossover”;
140=”ContemporaryChristian”;
141=”ChristianRock”;
142=”Merengue”;
143=”Salsa”;
144=”Trashl”;
145=”Anime”;
146=”JPop”;
147=”Synthpop”;
其他任何的數值都認為是“unknown”
總結
以上是生活随笔為你收集整理的mp3格式音频文件结构解析图_mp3文件结构(在哪可以免费下载mp3格式的歌曲)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: localdate计算相差天数_还在苦恼
- 下一篇: Win10升级预览版9926出现0x80