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
版權宣告:本文為博主原創文章,轉載請附上博文連結!