1. 程式人生 > >MP3檔案結構解析(超詳細)

MP3檔案結構解析(超詳細)

1. MP3檔案結構解析
1.1. 概述
1.1.1. 音訊相關術語

ü  ID3:
一般位於一個mp3檔案的開頭或末尾的若干位元組內,記錄該mp3檔案的歌手、標題、專輯名稱、年代、風格等資訊,ID3分位兩個版本,V1版ID3在檔案末尾的固定128位元組,以TAG字元開頭,若沒有則認為無ID3V1資訊,V2版ID3位於mp3的開頭,長度可變。
ü  取樣率:
每秒從連續訊號中提取並組成離散訊號的取樣個數,它用赫茲(Hz)來表示,取樣率是指將模擬訊號轉換成數字訊號時的取樣頻率,也就是單位時間內取樣多少點,取樣頻率越高聲音的還原就越真實越自然,在當今的主流採集卡上,取樣頻率一般共分為22.05KHz、44.1KHz、48KHz三個等級,22.05KHz只能達到FM廣播的聲音品質,44.1KHz則是理論上的CD音質界限,48KHz則更加精確一些。
ü  位元率:
位元率是指每秒傳送的位元(bit)數。單位為bps(Bit Per Second),位元率越高,傳送的資料越大。在音訊、視訊領域,位元率常翻譯為位元速率,位元率表示經過編碼(壓縮)後的音、視訊資料每秒鐘需要用多少個位元來表示,而位元就是二進位制裡面最小的單位,要麼是0,要麼是1。位元率與音、視訊壓縮的關係,簡單的說就是位元率越高,音訊、視訊的質量就越好,但編碼後的檔案就越大;如果位元率越少則情況剛好相反。
位元率=取樣率*取樣位數*聲道數
ü  位元速率/碼流/位率:
是指音訊、視訊檔案在單位時間內使用的資料流量,通俗一點的理解就是取樣率,是音訊、視訊編碼中質量控制中最重要的部分,一般我們用的單位是Kb/s、Mb/s。一般來說碼流越大,壓縮比就越小,質量就越高。碼流越大,說明單位時間內取樣率越大,資料流,精度就越高,處理出來的檔案就越接近原始檔案
ü  編碼:
從資訊理論的觀點來看,描述信源的資料是資訊和資料冗餘之和,即:資料=資訊+資料冗餘。音訊訊號在時域和頻域上具有相關性,也即存在資料冗餘。將音訊作為一個信源,音訊編碼的實質是減少音訊中的冗餘。
自然界中的聲音非常複雜,波形極其複雜,通常我們採用的是脈衝程式碼調製編碼,即PCM編碼。PCM通過抽樣、量化、編碼三個步驟將連續變化的模擬訊號轉換為數字編碼
ü  解碼:
編碼的逆過程
1.1.2. MP3簡述

MP3全稱為MPEG Audio Layer 3,它是一種高效的計算機音訊編碼方案,它以較大的壓縮比將音訊檔案轉換成較小的副檔名為.mp3的檔案,基本保持原始檔的音質,MP3是ISO/MPEG標準的一部分,
ISO/MPEG標準描述了使用高效能感知編碼方案的音訊壓縮,此標準一直在不斷更新以滿足“質高量小”的追求,現已形成MPEG Layer1、Layer2、Layer3三種音訊編解碼方案,分別對應MP1、MP2、MP3 這三種聲音檔案
MPEG(Moving Picture Expert Group)是ISO下的一個動態影象專家組,它指定的MPEG標準廣泛的應用於各種多媒體中,MPEG標準包括視訊和音訊標準,其中音訊標準已制定出MPEG-1、MPEG-2、MPEG-2 ACC、MPEG-4。MPEG-1和MPEG-2標準使用同一個音訊編解碼族Layer1、2、3,MP3絕大多數使用的是MPEG1標準
MP3音訊壓縮包含編碼和解碼兩部分,編碼是將原始訊號轉換成電平訊號的過程,解碼即是逆過程,MP3 採用了感知音訊編碼(PerceptualAudio Coding)這一失真演算法。人耳感受聲音的頻率範圍是20Hz-20kHz,MP3截掉了大量的冗餘訊號和無關的訊號,編碼器通過混合濾波器組將原始聲音變換到頻率域,利用心理聲學模型,估算剛好能被察覺到的噪聲水平,再經過量化,轉換成Huffman編碼,形成MP3位流。解碼器要簡單得多,它的任務是從編碼後的譜線成分中,經過反量化和逆變換,提取出聲音訊號。
MP3檔案資料由多個幀組成,幀是MP3檔案最小組成單位。每個幀又由幀頭、附加資訊和聲音資料組成。每個幀播放時間是0.026秒,其長度隨位率的不同而不等。有些MP3檔案末尾有些額外位元組存放非聲音資料的說明資訊。
1.2. MP3檔案結構

MP3檔案大體上分為三個部分:ID3V2+音訊資料+ID3V1
         1.3. ID3V2解析

ID3V2一共有四個版本,ID3V2.1/2.2/2.3/2.4,目前流行的播放軟體一般只支援第三版即ID3V2.3,由於ID3V1記錄在檔案的末尾處,ID3V2就只能記錄在檔案的首部了,也是因為這個原因,對ID3V2的操作比ID3V1要慢,而且ID3V2的結構比ID3V1的結構複雜的多,但是ID3V2可以記錄更多的資訊,長度可變
ID3V2.3由一個標籤頭和若干個標籤幀或者一個擴充套件標籤頭組成,至少要有一個標籤幀,每一個標籤幀記錄一種資訊,例如作曲、標題等
1.3.1. 標籤頭

位於檔案開始處,長度為10位元組,結構如下:
char Header[3];    /*必須為“ID3”否則認為標籤不存在*/ 
char Ver;         /*版本號ID3V2.3 就記錄3*/ 
char Revision;     /*副版本號此版本記錄為0*/ 
char Flag;        /*標誌位元組,只使用高三位,其它位為0 */ 
char Size[4];      /*標籤大小*/
注:標籤大小,不能確定具體包括哪些內容,解析歌曲檔案後,發現沒有哪些位元組之和會等於該值,詳見下面的例項分析
標誌位元組一般為0,定義如下(abc000000B)
a:表示是否使用Unsynchronisation
b:表示是否有擴充套件頭部,一般沒有,所以一般也不設定
c:表示是否為測試標籤,99.99%的標籤都不是測試標籤,不設定
標籤大小共四個位元組,每個位元組只使用低7位,最高位不使用恆為0,計算時將最高位去掉,得到28bit的資料,計算公式如下:
Size=(Size[0]&0x7F)*0x200000+(Size[1]&0x7F)*0x400+(Size[2]&0x7F)*0x80+(Size[3]&0x7F)
以《金南玲 - 逆流成河.mp3》為例,使用WinHex工具開啟如下,讀者可自己對照上述結構,本章結束會給出詳細的結構分析

1.3.2. 標籤幀

每個標籤幀都有10個位元組的幀頭(和標籤頭不是一個東西,雖然他們剛好都是10位元組,標籤頭只有一個,每個標籤幀都有一個幀頭)和至少一個位元組的內容構成,標籤幀與標籤頭/其他標籤幀無特殊位元組分割,只能通過幀頭資訊來確定幀內容的大小。
幀頭長度10位元組,定義如下:
char ID[4]; /*標識幀,說明其內容,例如作者/標題等*/ 
char Size[4]; /*幀內容的大小,不包括幀頭,不得小於1*/ 
char Flags[2]; /*標誌幀,只定義了6 位*/ 
標識幀,常見的內容如下:
TIT2=標題
TPE1=作者
TALB=專集
TRCK=音軌格式:N/M 其中N為專集中的第N首,M為專集中共M首,N和M    為ASCII 碼錶示的數字 
TYER=年代是用ASCII 碼錶示的數字 
TCON=型別直接用字串表示 
COMM=備註格式:"eng\0備註內容",其中eng 表示備註所使用的自然語言 
幀內容大小,計算公式如下:
Size = Size[0]*0x100000000 + Size[1]*0x10000+ Size[2]*0x100 +Size[3];
標誌幀,使用每個位元組的高三位,其他位均為0(abc00000B xyz00000B)
a -- 標籤保護標誌,設定時認為此幀作廢
b -- 檔案保護標誌,設定時認為此幀作廢
c -- 只讀標誌,設定時認為此幀不能修改 
x -- 壓縮標誌,設定時一個位元組存放兩個BCD 碼錶示數字 
y-- 加密標誌 
z-- 組標誌,設定時說明此幀和其他的某幀是一組
1.4. 音訊資料解析

每個幀都有一個幀頭,長度是四個位元組,幀後面可能有2位元組的CRC校驗,取決於幀頭的第16位,為0則無校驗,為1則有校驗,後面是可變長度的附加資訊,對於標準的MP3檔案來說,其長度是32位元組,緊接其後的是壓縮的聲音資料,當解碼器讀到此處時就進行解碼了。
1.4.1. 資料幀幀頭

幀頭長4位元組,結構如下:
typedef FrameHeader 
{
unsigned int sync:11;                        //同步資訊
unsigned int version:2;                      //版本
unsigned int layer: 2;                           //層
unsigned int error protection:1;           // CRC校驗
unsigned int bitrate_index:4;              //位率
unsigned int sampling_frequency:2;         //取樣頻率
unsigned int padding:1;                    //幀長調節
unsigned int private:1;                       //保留字
unsigned int mode:2;                         //聲道模式
unsigned int mode extension:2;        //擴充模式
unsigned int copyright:1;                           // 版權
unsigned int original:1;                      //原版標誌
unsigned int emphasis:2;                  //強調模式
}HEADER, *LPHEADER;
詳細說明:
1.4.2. 幀長度與真大小

幀大小即每幀的取樣數,表示一幀資料中取樣的個數,該值是恆定的,如下表所示:

幀長度是壓縮時每一幀的長度,包括幀頭的4個位元組。它將填充的空位也計算在內。Layer 1的一個空位長4位元組,Layer 2和Layer 3的空位是1位元組。當讀取MPEG檔案時必須計算該值以便找到相鄰的幀。注意:因為有填充和位元率變換,幀長度可能變化
計算公式如下:
Layer 1:Len(位元組) = ((每幀取樣數/8*位元率)/取樣頻率)+填充*4
Layer2/3:Len(位元組) = ((每幀取樣數/8*位元率)/取樣頻率)+填充
例:MPEG1 Layer3 位元率128000,取樣率44100,填充0,幀長度為:((1152/8*128K)/44.1K+0=417位元組
1.4.3. 幀持續時間

計算公式:
每幀持續時間(毫秒) = 每幀取樣數 / 取樣頻率 * 1000
例:1152/441000*1000=26ms
1.4.4. 幀資料

在幀頭後邊是Side Info(姑且稱之為通道資訊)。對標準的立體聲MP3檔案來說其長度為32位元組。當解碼器在讀到上述資訊後,就可以進行解碼了。
對於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的標記。
1.4.5. VBR標頭檔案

VBR檔案頭位於MP3檔案中第一個有效幀的資料區,詳細結構如下:
1.5. ID3V1解析

ID3 V1.0標準並不周全,存放的資訊少,無法存放歌詞,無法錄入專輯封面、圖片等。V2.0是一個相當完備的標準,但給編寫軟體帶來困難,雖然贊成此格式的人很多,在軟體中真正實現的卻極少。絕大多數MP3仍使用ID3 V1.0標準。此標準是將MP3檔案尾的最後128個位元組用來存放ID3資訊
1.6. 附錄
1.6.1. 幀標識

AENC:Audioencryption 
APIC:Attached picture
COMM:Comments 
COMR:Commercial 
ENCR:Encryptionmethod registration 
EQUA:Equalization 
ETCO:Event timingcodes 
GEOB:Generalencapsulated object 
GRID:Groupidentification registration 
IPLS:Involvedpeople list 
LINK:Linkedinformation 
MCDI:Music CDidentifier 
MLLT:MPEGlocationlookup table 
OWNE:Ownership 
PRIV:Private 
PCNT:Playcounter 
POPM:Popularimeter
POSS:Positionsynchronisation 
RBUF:Recommendedbuffer size 
RVAD:Relativevolume adjustment 
RVRB:Reverb 
SYLT:Synchronizedlyric/text 
SYTC:Synchronizedtempo codes 
TALB:Album/Movie/Showtitle 
TBPM:BPM(beats perminute) 
TCOM:Composer 
TCON:Content type 
TCOP:Copyrightmessage 
TDAT:Date
TDLY:Playlistdelay 
TENC:Encoded by 
TEXT:Lyricist/Textwriter 
TFLT:Filetype 
TIME:Time
TIT1:Content groupdeion 
TIT2:Title/songname/contentdeion 
TIT3:Subtitle/Deionrefinement 
TKEY:Initial key 
TLAN:Language(s) 
TLEN:Length 
TMED:Media type 
TOAL:Originalalbum/movie/show title 
TOFN:Originalfilename 
TOLY:Originallyricist(s)/text writer(s) 
TOPE:Originalartist(s)/performer(s) 
TORY:Originalrelease year 
TOWN:Fileowner/licensee
TPE1:Leadperformer(s)/Soloist(s)
TPE2:Band/orchestra/accompaniment
TPE3:Conductor/performerrefinement 
TPE4:Interpreted,remixed, or otherwise modified by 
TPOS:Partof a set 
TPUB:Publisher 
TRCK:Tracknumber/Position in set 
TRDA:Recordingdates 
TRSN:Internetradio station name 
TRSO:Internetradio station owner 
TSIZ:Size
TSRC:ISRC(internationalstandard recording code) 
TSSE:Software/Hardwareand settings used for encoding 
TYER:Year
TXXX:Userdefinedtext information 
UFID:Unique fileidentifier 
USER:Terms of use 
USLT:Unsychronizedlyric/text tranion 
WCOM:Commercialinformation 
WCOP:Copyright/Legalinformation 
WOAF:Officialaudio file webpage 
WOAR:Officialartist/performer webpage 
WOAS:Officialaudio source webpage 
WORS:Officialinternet radio station homepage 
WPAY:Payment 
WPUB:Publishersofficial webpage 
WXXX:UserdefinedURL link 
1.6.2. 音樂型別

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"; 
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";
1.7. 例項分析
1.7.1. 歌曲資訊

1.7.2. 結構解析
1.7.2.1. 標籤頭


標籤頭:10位元組,00H-09H

標籤大小:
Size=(Size[0]&0x7F)*0x200000+(Size[1]&0x7F)*0x400+(Size[2]&0x7F)*0x80+(Size[3]&0x7F)
=(0x07&0x7F)*0x400+(0x34&0x7F)*0x80+(0x60&0x7F)
=0x1C00+0x1A00+0x60
=0x3660=13920
1.7.2.2. TSSE標籤幀


1.7.2.3. COMM標籤幀

 

幀內容大小:
Size = Size[0]*0x100000000 + Size[1]*0x10000+ Size[2]*0x100 +Size[3]
=0x02*0x100+0x07
=0x207=519
1.7.2.4. TALB標籤幀


1.7.2.5. TIT2標籤幀


1.7.2.6. TPE1標籤幀


1.7.2.7. TPOS標籤幀


1.7.2.8. TRCK標籤幀


1.7.2.9. APIC標籤幀


此處省略N多位元組………


幀內容大小:
Size = Size[0]*0x100000000 + Size[1]*0x10000+ Size[2]*0x100 +Size[3]
=0x01*0x10000+0xD3*0x100+0xD7
=0x10000+0xD300+0xD7
=0x1D3D7=119767
1.7.2.10. 未知資料

不清楚該段資料具體作用,目測是填充位元組。
1.7.2.11. 音訊資料

篇幅有限,只分析第一幀資料,其他幀與此無異。


幀頭解析:
FF=11111111 紅色
FB=1111 1011 紅色黑色綠色紫色
E0=1110 
0000 藍色橄欖色深紅色橙色
00=00000000 白色淺綠色深藍色褐色粉紅色
紅色:11位,同步資訊,所有位均為1,第一個位元組恆為FF
黑色:2位,版本,MPEG1
綠色:2位,層,Layer3
紫色:1位,無CRC校驗
藍色:4位,位率,單位是kbps,320
橄欖色:2位,取樣頻率,44.1K
深紅色:1位,用來調整檔案頭長度,無需調整
橙色:1位,保留字,未使用
白色:2位,表示聲道模式,立體聲Stereo
淺綠色:2位,聲道模式為Joint Stereo時才使用
深藍色:1位,檔案是否合法,不合法
褐色:1位,是否原版,非原版
粉紅色:2位,用於聲音經降噪壓縮後再補償的分類,未定義
根據以上資訊可計算:
幀長度=幀頭+通道資訊+幀內容= ((1152/8*320)/44.1=1044位元組
每幀持續時間=1152/44.1*1000=26.12ms
因為該歌曲為CBR即固定位率歌曲,所以每幀的資料長度都是1044位元組,26ms。
1.7.2.12. 其他資料

該歌曲無ID3V1資訊。
最後的320位元組,題主也是笨笨的沒弄懂其具體含義~
1.8. 說明

能夠讀到這裡的讀者,我不得不對你的求知精神與耐心表示肯定,希望這篇文章對您有所幫助
word文件下載地址:http://download.csdn.net/detail/u010650845/9705899
--------------------- 
作者:DarrylQuinn 
來源:CSDN 
原文:https://blog.csdn.net/u010650845/article/details/53520426 
版權宣告:本文為博主原創文章,轉載請附上博文連結!