AGENDA * MP3簡介 * MP3文件結(jié)構(gòu) ——Tag_v2(ID3v2)標(biāo)簽幀 ——數(shù)據(jù)幀 ——Tag_v1(ID3v1)標(biāo)簽幀 *MP3編解碼流程 *MP3文件的播放流程
一、MP3簡介: MP3全稱MPEG 1 audio layer 3,其中MPEG(Moving Picture Experts Group)標(biāo)準(zhǔn)包括視頻和音頻 標(biāo)準(zhǔn),其中音頻標(biāo)準(zhǔn)已制定出 MPEG-1、MPEG-2、MPEG-2 AAC和MPEG-4。 MPEG-1和MPEG-2標(biāo)準(zhǔn)使用同一個音頻編碼解碼族—— Layer1、Layer 2、Layer3。 它根據(jù)壓縮質(zhì)量 和編碼復(fù)雜程度進行劃分的,分別對應(yīng)MP1、MP2、MP3 這三種聲音文件,并根據(jù)不同的用途,使用不同層 次的編碼。MPEG 音頻編碼的層次越高,編碼器越復(fù)雜,壓縮率也越高 MPEG-2一個新特點是采用低采樣率擴展降低數(shù)據(jù)流量,另一特點是多通道擴展,將主聲道增加為5個。 MPEG Audio Layer 1、Layer2、Layer3三個層使用相同的濾波器組、位流結(jié)構(gòu)和頭信息,采樣頻率為 32KHz、44.1KHz、48KHz。 Layer 1是為數(shù)字壓縮磁帶DCC(Digital Compact Cassette)設(shè)計的,數(shù)據(jù)流384kbps;壓縮率4:1; Layer 2在復(fù)雜性和性能間作了權(quán)衡,數(shù)據(jù)流量下降到256kbps-192kbps;壓縮率6:1-8:1; Layer 3一開始就為低數(shù)據(jù)流量而設(shè)計,數(shù)據(jù)流量在128kbps-112kbps,壓縮率高達10:1-12:1; Layer 3增加了MDCT變換,使其頻率分辨能力是Layer 2的18倍,Layer 3還使用了與MPEG Video 類似的平均信息量編碼(Entropy Coding),減少了冗余信息。MP3絕大部分使用的是MPEG-1標(biāo)準(zhǔn)。
MP3的音頻質(zhì)量取決于它的Bitrate和Sampling frequency,以及編碼器質(zhì)量。MP3的典型速度介于 每秒128到320kb之間(此處有問題)。采樣頻率也有32,44.1,48 kHz三種頻率,比較常見的是采用CD 采樣頻率——44.1kHz。常用的編碼器是LAME,它完全遵循LGPL的MP3編碼器,有著良好的速度和音質(zhì)。 MP3 對音頻信號采用的是有損壓縮方式,為了降低聲音失真度,MP3采取了“感官編碼技術(shù)”,即它 丟掉脈沖編碼調(diào)制(PCM)音頻數(shù)據(jù)中對人類聽覺不重要得數(shù)據(jù),從而達到了較高的壓縮比,即編碼時先對 音頻文件進行頻譜分析,然后用過濾器濾掉噪音電平,接著通過量化的方式將剩下的每一位打散排列,最后 形成具有較高壓縮比的MP3 文件,并使壓縮后的文件在回放時能夠達到比較接近原音源的聲音效果。
二.整個MP3 文件結(jié)構(gòu):
MP3文件是由幀(frame)構(gòu)成,幀是MP3文件的最小組成單位。每幀都包含幀頭,并可以計算幀的長度。根據(jù)幀的性質(zhì)不同,文件主要分為三個部分,TAG_V2(ID3V2)標(biāo)簽幀,數(shù)據(jù)幀和TAG_V1(ID3V1) 標(biāo)簽幀。并非每個MP3文件都有ID3v2,但是數(shù)據(jù)幀和ID3v1幀是必須的。ID3v2在文件頭,以字符串“ID3”為標(biāo)志,包含了演唱者,作曲,專輯等信息,長度不固定,擴展了ID3V1的信息量。ID3v1在文件結(jié)尾,以字符串“TAG”為標(biāo)記,其長度是固定的128個字節(jié),包含了演唱者、歌名、專輯、年份等信息。
1. ID3V2 標(biāo)簽 ID3V2到現(xiàn)在一共有四個版本,但流行的播放軟件一般只支持第三版,既ID3V2.3。每個ID3V2.3 的標(biāo)簽都有一個標(biāo)簽頭和若干個標(biāo)簽幀或一個擴展標(biāo)簽頭組成。關(guān)于曲目的信息如標(biāo)題、作者等都存放在不同的標(biāo)簽幀中,擴展標(biāo)簽頭并不是必要的,但每個標(biāo)簽至少要有一個標(biāo)簽幀。標(biāo)簽頭和標(biāo)簽幀一起順序存放在MP3 文件的首部。 標(biāo)簽頭 長度為10個字節(jié),位于文件首部,其數(shù)據(jù)結(jié)構(gòu)如下: char Header[3]; /* 字符串 "ID3" */ char Ver; /* 版本號ID3V2.3 就記錄3 */ char Revision; /* 副版本號此版本記錄為0 */ char Flag; /* 存放標(biāo)志的字節(jié),這個版本只定義了三位,很少用到,可以忽略 */ char Size[4]; /* 標(biāo)簽大小,除了標(biāo)簽頭的10 個字節(jié)的標(biāo)簽幀的大小 */標(biāo)簽大小為四個字節(jié),但每個字節(jié)只用低7位,最高位不使用,恒為0,其格式如下: 0xxxxxxx 0xxxxxxx 0xxxxxxx 0xxxxxxx
——標(biāo)簽幀 每個標(biāo)簽幀都有一個10字節(jié)的幀頭和至少一個字節(jié)的不固定長度的內(nèi)容組成。它們是順序存放在文件中,由各自特定的標(biāo)簽幀頭來標(biāo)記幀的開始。其幀的結(jié)構(gòu)如下: char FrameID[4]; /*用四個字符標(biāo)識一個幀,說明其內(nèi)容 */ char Size[4]; /* 幀內(nèi)容的大小,不包括幀頭,不得小于1 */ char Flags[2]; /* 存放標(biāo)志,只定義了6 位,此處不再說明 */ 常用幀標(biāo)識: TIT2:標(biāo)題 TPE1:作者 TALB:專輯 TRCK: 音軌,格式:N/M,N表示專輯中第幾首,M為專輯中歌曲總數(shù) TYER:年份 TCON:類型 COMM:備注,格式:“eng/0備注內(nèi)容”,其中eng表示所使用的語言 幀大小為四個字節(jié)所表示的整數(shù)大小。
2.數(shù)據(jù)幀 數(shù)據(jù)幀往往有多個,至于有多少,由文件大小和幀大小來決定。每個幀 都有一個幀頭HEADER,長度是4BYTE(32bit),幀頭后面可能有兩個字節(jié)的CRC 校驗,這兩個字節(jié)的是否存在決定于HEADER 信息的第16bit, 為0 則幀頭后面無校驗,為1 則有校驗,校驗值長度為2 個字節(jié),緊跟在HEADER 后面,接著就是幀的實體數(shù)據(jù) ,也就是MAIN_DATA了,格式如下: HEADER CRC(free) MAIN_DATA 4 BYTE 0 OR 2 BYTE
----幀頭HEADER的詳細結(jié)構(gòu)為:

-----MAIN_DATA: MAIN_DATA 部分長度是否變化決定于HEADER 的bitrate是否變化,一首MP3 歌曲,它有三個版本:96Kbps(96 千比特位每秒)、128Kbps 和192Kbps。Kbps (比特位速率), 表明了音樂每秒的數(shù)據(jù)量,Kbps 值越高,音質(zhì)越好,文件也越大,MP3標(biāo)準(zhǔn)規(guī)定,不變的bitrate 的MP3 文件稱作CBR,大多數(shù)MP3 文件都是CBR 的,而變化的bitrate 的MP3 文件稱作VBR, 每個 的長度都可能是變化的。 ———— C,LAME標(biāo)簽幀 當(dāng)你真的打開一個MP3文件的時候,你會發(fā)現(xiàn)第一幀并不是真正的數(shù)據(jù)幀,而是LAME編碼的標(biāo)志幀。 這里牽涉到兩個概念:CBR和VBR。它還存放了MP3文件里幀的總個數(shù),和100個字節(jié)的播放總時間分段的幀的INDEX,還有其他一些參數(shù); 1)CBR:表示比特率不變,也就是每幀的長度是一致的,它以字符串“INFO”為標(biāo)記。只要知道文件總長度 和幀長,即可由播放每幀需26ms 計算得出mp3 播放的總時間,也可通過計數(shù)幀的個數(shù)控制快進、快退 慢放等操作。 2)VBR:VBR是 Variable BitRate的簡稱,也就是每幀的比特率和幀的長度是變化的,是XING 公司推出的 算法,所以在MP3 的 里會有“XING"這個關(guān)鍵字(現(xiàn)在很多流行的小軟件也可以進行VBR 壓縮,它們 是否遵守這個約定,那就不得而知了),它存放在MP3 文件中的第一個有效幀里,它標(biāo)識了這個MP3 文件是VBR 的。同時第一個 里存放了MP3 文件的 幀的總個數(shù),這就很容易獲得了播放總時間,同時 還有100 個字節(jié)存放了播放總時間的100 個時間分段的幀的INDEX,假設(shè)4 分鐘的MP3 歌曲, 240S, 分成100 段,每兩個相鄰INDEX 的時間差就是2.4S, 所以通過這個INDEX,只要前后處理少 數(shù)的,就能快速找出我們需要快進的 頭。除了INDEX,還有其他的一些參數(shù),這被稱為Zone A,傳統(tǒng) Xing VBR標(biāo)簽數(shù)據(jù),共120個字節(jié)。 在二進制文本編輯器里我們還可看到一個字符串“LAME”,并且 后面清楚地跟著版本號。這就是20個字節(jié)的Zone B初始LAME信息,表示該文件是用LAME編碼技術(shù)。 接下來一直到該幀結(jié)束就是Zone C-LAME標(biāo)簽。 長度由幀頭計算得出 : 1)每幀的播放時間:無論幀長是多少,每幀的播放時間都是26ms; 2)數(shù)據(jù)幀大小: Size = (((MpegVersion == MPEG1 ? 144 : 72) * Bitrate) / SamplingRate) + PaddingBit 例如: Bitrate = 128000, a SamplingRate =44100, and PaddingBit = 1 Size = (144 * 128000) / 44100 + 1 = 417 bytes
3.ID3V1 其數(shù)據(jù)結(jié)構(gòu)如下: char Header[3]; /* 標(biāo)簽頭必須是"TAG"否則認為沒有標(biāo)簽 */ char Title[30]; /* 標(biāo)題 */ char Artist[30]; /* 作者 */ char Album[30]; /* 專集 */ char Year[4]; /* 出品年代 */ char Comment[28]; /* 備注 */ char reserve; /* 保留 */ char track; /* 音軌 */ char Genre; /* 類型 */ 其實,關(guān)于最后31個字節(jié)還存在另外一個版本,就是30個字節(jié)的Comment和一個字節(jié)的Genre. 有了上述的這些信息,我們就可以自己寫代碼,從MP3文件中抓取信息以及修改文件名了。但是,如果真的想寫一個播放軟件,還是需要讀它的數(shù)據(jù)幀,并進行解碼。
三.MP3編碼與解碼流程
MP3音頻壓縮包含編碼和解碼兩個部分。編碼是將WAV文件中的數(shù)據(jù)轉(zhuǎn)換成高壓縮率的位流形式,解碼是接受位流并將其重建到WAV文件中。MP3 采用了感知音頻編碼(Perceptual Audio Coding)這一失真算法。人耳感受聲音的頻率范圍是20Hz-20kHz,MP3截掉了大量的冗余信號和無關(guān)的信號,編碼器通過混合濾波器組將原始聲 音變換到頻率域,利用心理聲學(xué)模型,估算剛好能被察覺到的噪聲水平,再經(jīng)過量化,轉(zhuǎn)換成Huffman編碼,形成MP3位流。解碼器要簡單得多,它的任務(wù) 是從編碼后的譜線成分中,經(jīng)過反量化和逆變換,提取出聲音信號。 MP3的解碼總體上可分為9個過程:比特流分析,霍夫曼編碼,逆量化處理,立體聲處理,頻譜重排列,抗鋸齒處理,IMDCT變換,子帶合成,PCM輸出。 簡要描述一下MP3的壓縮流程:聲音是一個模擬信號,對聲音進行采樣,量化,編碼將得到PCM數(shù)據(jù)。PCM又稱為脈沖調(diào)制數(shù)據(jù),是計算機可以播放的最原始數(shù)據(jù),也是mp3壓縮的源,為了達到更大的數(shù)據(jù)壓縮率,MPEG表針采用了子帶編碼技將PCM數(shù)據(jù)分成32個子帶,每個子帶都是獨立編碼的,然后將數(shù)據(jù)變換到頻域下分析,MPEG采用的是改進的離散余弦變換,也可以使用傅里葉變換,再下來為了重建立體聲進行了頻域按特定規(guī)則的排列,隨后立體聲處理,處理后的數(shù)據(jù)按照協(xié)議定義進行量化。為了達到更大的壓縮,再進行霍夫曼編碼。最后將一些系數(shù)與主信息融合形成MP3文件。 解碼是編碼的反過程大概如下: 所謂比特流分解是指將mp3文件以二進制方式打開,然后根據(jù)其壓縮格式的定義,依次從這個mp3文件中取出頭信息,邊信息,比例因子信息等。這些信息都是后面的解碼過程中需要的?;舴蚵幋a是一種無損壓縮編碼,屬于熵編碼[平均信息量編碼(Entropy Coding)]。Mp3的解碼可以通過公式實時進行數(shù)據(jù)的解碼,但往往采用的是通過查表法實現(xiàn)解碼(節(jié)省了CPU時間資源)。 MP3的技術(shù)亮點--MDCT (修正的離散余弦變換): 修正的離散余弦變換(MDCT)是指將一組時域數(shù)據(jù)轉(zhuǎn)換成頻域數(shù)據(jù),以得知時域變化情況。MDCT是對DCT算法的改進。早期的快速算法是快速付立葉變換(FFT),但FFT有復(fù)數(shù)運算,MDCT都是實數(shù)運算,便于編程。 在 壓縮音頻數(shù)據(jù)時,先將原始聲音數(shù)據(jù)分成固定的分塊,然后做順向MDCT(Forward MDCT)將每塊的值轉(zhuǎn)換為512個MDCT系數(shù),解壓時,經(jīng)反向MDCT(Inverse MDCT)將512個系數(shù)還原成原始聲音數(shù)據(jù),前后的原始聲音數(shù)據(jù)是不一致的,因為在壓縮過程中,去掉了冗余和不相關(guān)數(shù)據(jù)。FMDCT變換公式為: k=0,1,…,N/2-1 式中N是轉(zhuǎn)換視窗長度,即每塊樣本點數(shù),N=8,16,…,1024,2048。 n0=(N/2+1)/2,X(n)為時域值,X(k)為頻域值。若N取1024點,則轉(zhuǎn)換成512個頻域值。 IMDCT變換公式為: n=0,1,…,N-1 MDCT本身并不進行數(shù)據(jù)壓縮,它只是把信號映射到另一個域,量化才使數(shù)據(jù)得到壓縮。在對量化后的變換樣值進行比特分配時要考慮使整個量化塊最小,這就成為有損壓縮了。
四、MP3文件的播放流程
一個完整MP3播放機要分幾個部分:中央處理器、解碼器、存儲設(shè)備、主機通訊端口、音頻DAC和功放、顯示界面和控制鍵。其中中央處理器和解碼器是整個系統(tǒng)的核心。這里的中央處理器我們通常稱為MCU(單片微處理器),簡稱單片機。它運行MP3的整個控制程序,也稱為fireware(或者固件程序)??刂芃P3的各個部件的工作:從存儲設(shè)備讀取數(shù)據(jù)送到解碼器解碼;與主機連接時完成與主機的數(shù)據(jù)交換;接收控制按鍵的操作,顯示系統(tǒng)運行狀態(tài)等任務(wù)。解碼器是芯片中的一個硬件模塊,或者說是硬件解碼(有的MP3播放機是軟件解碼,由高速中央處理器完成)。它可以直接完成各種格式MP3數(shù)據(jù)流的解碼操作,并輸出PCM或I2S格式的數(shù)字音頻信號。
存儲設(shè)備是MP3播放機的重要部分,通常的MP3隨身聽都是采用半導(dǎo)體存儲器(FLASH MEMORY)或者硬盤(HDD)作為儲存設(shè)備的。它通過接受儲存主機通訊端口傳來的數(shù)據(jù)(通常以文件形式),回放的時候MCU讀取存儲器中的數(shù)據(jù)并送到解碼器。數(shù)據(jù)的存儲是要有一定格式的,眾所周知,PC管理磁盤數(shù)據(jù)是以文件形式,MP3也不例外,最常用的辦法就是直接利用PC的文件系統(tǒng)來管理存儲器,微軟操作系統(tǒng)采用的是FAT文件系統(tǒng),這也是最廣泛使用的一種。播放機其中一個任務(wù)就是要實現(xiàn)FAT文件系統(tǒng),即可以從FAT文件系統(tǒng)的磁盤中按文件名訪問并讀出其中的數(shù)據(jù)。
主機通訊端口是MP3播放機與PC機交換數(shù)據(jù)的途徑,PC通過該端口操作MP3播放機存儲設(shè)備中的數(shù)據(jù),拷貝、刪除、復(fù)制文件等操作。目前最廣泛使用的是USB總線,并且遵循微軟定義的大容量移動存儲協(xié)議規(guī)范,將MP3播放機作為主機的一個移動存儲設(shè)備。這里需要遵循幾個規(guī)范:USB通信協(xié)議、大容量移動存儲器規(guī)范和SCSI協(xié)議。
音頻DAC是將數(shù)字音頻信號轉(zhuǎn)換成模擬音頻信號,以推動耳機、功放等模擬音響設(shè)備。這里要介紹一下數(shù)字音頻信號。數(shù)字音頻信號是相對模擬音頻信號來說的。我們知道聲音的本質(zhì)是波,人說能聽到的聲音的頻率在20Hz到20kHz之間,稱為聲波。模擬信號對波的表示是連續(xù)的函數(shù)特性,基本的原理是不同頻率和振幅的波疊加在一起。數(shù)字音頻信號是對模擬信號的一種量化,典型方法是對時間坐標(biāo)按相等的時間間隔做采樣,對振幅做量化。單位時間內(nèi)的采樣次數(shù)稱為采樣頻率。這樣一段聲波就可以被數(shù)字化后變成一串?dāng)?shù)值,每個數(shù)值對應(yīng)相應(yīng)抽樣點的振幅值,按順序?qū)⑦@些數(shù)字排列起來就是數(shù)字音頻信號了。這是ADC(模擬-數(shù)字轉(zhuǎn)換)過程,DAC(數(shù)字-模擬轉(zhuǎn)換)過程相反,將連續(xù)的數(shù)字按采樣時候的頻率順序轉(zhuǎn)換成對應(yīng)的電壓。MP3解碼器解碼后的信息屬于數(shù)字音頻信號(數(shù)字音頻信號有不同的格式,最常用的是PCM和I2S兩種),需要通過DAC轉(zhuǎn)換器變成模擬信號才能推動功放,被人耳所識別。
MP3播放機的顯示設(shè)備通常采用LCD或者OLED等來顯示系統(tǒng)的工作狀態(tài)??刂奇I盤通常是按鈕開關(guān)。鍵盤和顯示設(shè)備合起來構(gòu)成了MP3播放機的人機交互界面。
MP3播放機的軟件結(jié)構(gòu)跟硬件是相對應(yīng)的,即每一個硬件部分都有相應(yīng)的軟件代碼,這是因為大多數(shù)的硬件部分都是數(shù)字可編程控制的。
總結(jié)一下,最簡化的MP3的工作原理我們可以概括如下:首先將MP3歌曲文件從內(nèi)存中取出并讀取存儲器上的信號→到解碼芯片對信號進行解碼→通過數(shù)模轉(zhuǎn)換器將解出來的數(shù)字信號轉(zhuǎn)換成模擬信號→再把轉(zhuǎn)換后的模擬音頻放大→低通濾波后到耳機輸出口,輸出后就是我們所聽到的音樂了。
|