1. 程式人生 > >MP3檔案結構及編解碼流程

MP3檔案結構及編解碼流程

  AGENDA
     * MP3簡介
     * MP3檔案結構
        ——Tag_v2(ID3v2)標籤幀
        ——資料幀
        ——Tag_v1(ID3v1)標籤幀
     *MP3編解碼流程
     *MP3檔案的播放流程

一、MP3簡介:
      MP3全稱MPEG 1 audio layer 3,其中MPEG(Moving Picture Experts Group)標準包括視訊和音訊
  標準,其中音訊標準已制定出 MPEG-1、MPEG-2、MPEG-2 AAC和MPEG-4。
      MPEG-1和MPEG-2標準使用同一個音訊編碼解碼族—— Layer1、Layer 2、Layer3。 它根據壓縮質量
  和編碼複雜程度進行劃分的,分別對應MP1、MP2、MP3 這三種聲音檔案,並根據不同的用途,使用不同層
  次的編碼。MPEG 音訊編碼的層次越高,編碼器越複雜,壓縮率也越高
     MPEG-2一個新特點是採用低取樣率擴充套件降低資料流量,另一特點是多通道擴充套件,將主聲道增加為5個。
     MPEG Audio Layer 1、Layer2、Layer3三個層使用相同的濾波器組、位流結構和頭資訊,取樣頻率為
              32KHz、44.1KHz、48KHz。
     Layer 1是為數字壓縮磁帶DCC(Digital Compact Cassette)設計的,資料流384kbps;壓縮率4:1;
     Layer 2在複雜性和效能間作了權衡,資料流量下降到256kbps-192kbps;壓縮率6:1-8:1;
     Layer 3一開始就為低資料流量而設計,資料流量在128kbps-112kbps,壓縮率高達10:1-12:1;
     Layer 3增加了MDCT變換,使其頻率分辨能力是Layer 2的18倍,Layer 3還使用了與MPEG Video
     類似的平均資訊量編碼(Entropy Coding),減少了冗餘資訊。MP3絕大部分使用的是MPEG-1標準。

      MP3的音訊質量取決於它的Bitrate和Sampling frequency,以及編碼器質量。MP3的典型速度介於
  每秒128到320kb之間(此處有問題)。取樣頻率也有32,44.1,48 kHz三種頻率,比較常見的是採用CD
  取樣頻率——44.1kHz。常用的編碼器是LAME,它完全遵循LGPL的MP3編碼器,有著良好的速度和音質。
      MP3 對音訊訊號採用的是有失真壓縮方式,為了降低聲音失真度,MP3採取了“感官編碼技術”,即它
  丟掉脈衝編碼調製(PCM)音訊資料中對人類聽覺不重要得資料,從而達到了較高的壓縮比,即編碼時先對
  音訊檔案進行頻譜分析,然後用過濾器濾掉噪音電平,接著通過量化的方式將剩下的每一位打散排列,最後
  形成具有較高壓縮比的MP3 檔案,並使壓縮後的檔案在回放時能夠達到比較接近原音源的聲音效果。

           
二.整個MP3 檔案結構:

      MP3檔案是由幀(frame)構成,幀是MP3檔案的最小組成單位。每幀都包含幀頭,並可以計算幀的長度。根據幀的性質不同,檔案主要分為三個部分,TAG_V2(ID3V2)標籤幀,資料幀和TAG_V1(ID3V1) 標籤幀。並非每個MP3檔案都有ID3v2,但是資料幀和ID3v1幀是必須的。ID3v2在檔案頭,以字串“ID3”為標誌,包含了演唱者,作曲,專輯等資訊,長度不固定,擴充套件了ID3V1的資訊量。ID3v1在檔案結尾,以字串“TAG”為標記,其長度是固定的128個位元組,包含了演唱者、歌名、專輯、年份等資訊。

    1. ID3V2 標籤
     ID3V2到現在一共有四個版本,但流行的播放軟體一般只支援第三版,既ID3V2.3。每個ID3V2.3 的標籤都有一個標籤頭和若干個標籤幀或一個擴充套件標籤頭組成。關於曲目的資訊如標題、作者等都存放在不同的標籤幀中,擴充套件標籤頭並不是必要的,但每個標籤至少要有一個標籤幀。標籤頭和標籤幀一起順序存放在MP3 檔案的首部。
標籤頭
長度為10個位元組,位於檔案首部,其資料結構如下:
char Header[3]; /* 字串 "ID3" */
char Ver;       /* 版本號ID3V2.3 就記錄3 */
char Revision; /* 副版本號此版本記錄為0 */
char Flag;    /* 存放標誌的位元組,這個版本只定義了三位,很少用到,可以忽略 */
char Size[4]; /* 標籤大小,除了標籤頭的10 個位元組的標籤幀的大小 */標籤大小為四個位元組,但每個位元組只用低7位,最高位不使用,恆為0,其格式如下:
0xxxxxxx 0xxxxxxx 0xxxxxxx 0xxxxxxx


    ——標籤幀
    每個標籤幀都有一個10位元組的幀頭和至少一個位元組的不固定長度的內容組成。它們是順序存放在檔案中,由各自特定的標籤幀頭來標記幀的開始。其幀的結構如下:
char FrameID[4];   /*用四個字元標識一個幀,說明其內容 */
char Size[4];  /* 幀內容的大小,不包括幀頭,不得小於1 */
char Flags[2]; /* 存放標誌,只定義了6 位,此處不再說明 */
常用幀標識:
TIT2:標題
TPE1:作者
TALB:專輯
TRCK: 音軌,格式:N/M,N表示專輯中第幾首,M為專輯中歌曲總數
TYER:年份
TCON:型別
COMM:備註,格式:“eng/0備註內容”,其中eng表示所使用的語言
幀大小為四個位元組所表示的整數大小。

2.資料幀
    資料幀往往有多個,至於有多少,由檔案大小和幀大小來決定。每個幀 都有一個幀頭HEADER,長度是4BYTE(32bit),幀頭後面可能有兩個位元組的CRC 校驗,這兩個位元組的是否存在決定於HEADER 資訊的第16bit, 為0 則幀頭後面無校驗,為1 則有校驗,校驗值長度為2 個位元組,緊跟在HEADER 後面,接著就是幀的實體資料 ,也就是MAIN_DATA了,格式如下:
    HEADER
    CRC(free)
    MAIN_DATA
    4 BYTE
   0 OR 2 BYTE

----幀頭HEADER的詳細結構為:


-----MAIN_DATA:
      MAIN_DATA 部分長度是否變化決定於HEADER 的bitrate是否變化,一首MP3 歌曲,它有三個版本:96Kbps(96 千位元位每秒)、128Kbps 和192Kbps。Kbps (位元位速率), 表明了音樂每秒的資料量,Kbps 值越高,音質越好,檔案也越大,MP3標準規定,不變的bitrate 的MP3 檔案稱作CBR,大多數MP3 檔案都是CBR 的,而變化的bitrate 的MP3 檔案稱作VBR, 每個 的長度都可能是變化的。
———— C,LAME標籤幀
      當你真的開啟一個MP3檔案的時候,你會發現第一幀並不是真正的資料幀,而是LAME編碼的標誌幀。
這裡牽涉到兩個概念:CBR和VBR。它還存放了MP3檔案裡幀的總個數,和100個位元組的播放總時間分段的幀的INDEX,還有其他一些引數;
          
1)CBR:表示位元率不變,也就是每幀的長度是一致的,它以字串“INFO”為標記。只要知道檔案總長度
       和幀長,即可由播放每幀需26ms 計算得出mp3 播放的總時間,也可通過計數幀的個數控制快進、快退
       慢放等操作。
2)VBR:VBR是 Variable BitRate的簡稱,也就是每幀的位元率和幀的長度是變化的,是XING 公司推出的
       演算法,所以在MP3 的 裡會有“XING"這個關鍵字(現在很多流行的小軟體也可以進行VBR 壓縮,它們
       是否遵守這個約定,那就不得而知了),它存放在MP3 檔案中的第一個有效幀裡,它標識了這個MP3
       檔案是VBR 的。同時第一個 裡存放了MP3 檔案的 幀的總個數,這就很容易獲得了播放總時間,同時
       還有100 個位元組存放了播放總時間的100 個時間分段的幀的INDEX,假設4 分鐘的MP3 歌曲,
       240S, 分成100 段,每兩個相鄰INDEX 的時間差就是2.4S, 所以通過這個INDEX,只要前後處理少  
       數的,就能快速找出我們需要快進的 頭。除了INDEX,還有其他的一些引數,這被稱為Zone A,傳統  
       Xing VBR標籤資料,共120個位元組。 在二進位制文字編輯器裡我們還可看到一個字串“LAME”,並且
       後面清楚地跟著版本號。這就是20個位元組的Zone B初始LAME資訊,表示該檔案是用LAME編碼技術。
       接下來一直到該幀結束就是Zone C-LAME標籤。
     
   長度由幀頭計算得出 :
1)每幀的播放時間:無論幀長是多少,每幀的播放時間都是26ms;
2)資料幀大小:
         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
其資料結構如下:
char Header[3];          /* 標籤頭必須是"TAG"否則認為沒有標籤 */
char Title[30];         /* 標題 */
char Artist[30];        /* 作者 */
char Album[30];         /* 專集 */
char Year[4];           /* 出品年代 */
char Comment[28];       /* 備註 */
char reserve;           /* 保留 */
char track;             /* 音軌 */
char Genre;             /* 型別 */
其實,關於最後31個位元組還存在另外一個版本,就是30個位元組的Comment和一個位元組的Genre.
有了上述的這些資訊,我們就可以自己寫程式碼,從MP3檔案中抓取資訊以及修改檔名了。但是,如果真的想寫一個播放軟體,還是需要讀它的資料幀,並進行解碼。

     三.MP3編碼與解碼流程

    MP3音訊壓縮包含編碼和解碼兩個部分。編碼是將WAV檔案中的資料轉換成高壓縮率的位流形式,解碼是接受位流並將其重建到WAV檔案中。MP3 採用了感知音訊編碼(Perceptual Audio Coding)這一失真演算法。人耳感受聲音的頻率範圍是20Hz-20kHz,MP3截掉了大量的冗餘訊號和無關的訊號,編碼器通過混合濾波器組將原始聲 音變換到頻率域,利用心理聲學模型,估算剛好能被察覺到的噪聲水平,再經過量化,轉換成Huffman編碼,形成MP3位流。解碼器要簡單得多,它的任務 是從編碼後的譜線成分中,經過反量化和逆變換,提取出聲音訊號。
MP3的解碼總體上可分為9個過程:位元流分析,霍夫曼編碼,逆量化處理,立體聲處理,頻譜重排列,抗鋸齒處理,IMDCT變換,子帶合成,PCM輸出。
簡要描述一下MP3的壓縮流程:聲音是一個模擬訊號,對聲音進行取樣,量化,編碼將得到PCM資料。PCM又稱為脈衝調製資料,是計算機可以播放的最原始資料,也是mp3壓縮的源,為了達到更大的資料壓縮率,MPEG錶針採用了子帶編碼技將PCM資料分成32個子帶,每個子帶都是獨立編碼的,然後將資料變換到頻域下分析,MPEG採用的是改進的離散餘弦變換,也可以使用傅立葉變換,再下來為了重建立體聲進行了頻域按特定規則的排列,隨後立體聲處理,處理後的資料按照協議定義進行量化。為了達到更大的壓縮,再進行霍夫曼編碼。最後將一些係數與主資訊融合形成MP3檔案。
解碼是編碼的反過程大概如下:
所謂位元流分解是指將mp3檔案以二進位制方式開啟,然後根據其壓縮格式的定義,依次從這個mp3檔案中取出頭資訊,邊資訊,比例因子資訊等。這些資訊都是後面的解碼過程中需要的。霍夫曼編碼是一種無失真壓縮編碼,屬於熵編碼[平均資訊量編碼(Entropy Coding)]。Mp3的解碼可以通過公式實時進行資料的解碼,但往往採用的是通過查表法實現解碼(節省了CPU時間資源)。
  MP3的技術亮點--MDCT (修正的離散餘弦變換):
修正的離散餘弦變換(MDCT)是指將一組時域資料轉換成頻域資料,以得知時域變化情況。MDCT是對DCT演算法的改進。早期的快速演算法是快速付立葉變換(FFT),但FFT有複數運算,MDCT都是實數運算,便於程式設計。
在 壓縮音訊資料時,先將原始聲音資料分成固定的分塊,然後做順向MDCT(Forward MDCT)將每塊的值轉換為512個MDCT係數,解壓時,經反向MDCT(Inverse MDCT)將512個係數還原成原始聲音資料,前後的原始聲音資料是不一致的,因為在壓縮過程中,去掉了冗餘和不相關資料。FMDCT變換公式為:
k=0,1,…,N/2-1
式中N是轉換視窗長度,即每塊樣本點數,N=8,16,…,1024,2048。
n0=(N/2+1)/2,X(n)為時域值,X(k)為頻域值。若N取1024點,則轉換成512個頻域值。
IMDCT變換公式為:
      n=0,1,…,N-1
MDCT本身並不進行資料壓縮,它只是把訊號對映到另一個域,量化才使資料得到壓縮。在對量化後的變換樣值進行位元分配時要考慮使整個量化塊最小,這就成為有失真壓縮了。

四、MP3檔案的播放流程

     一個完整MP3播放機要分幾個部分:中央處理器、解碼器、儲存裝置、主機通訊埠、音訊DAC和功放、顯示介面和控制鍵。其中中央處理器和解碼器是整個系統的核心。這裡的中央處理器我們通常稱為MCU(單片微處理器),簡稱微控制器。它執行MP3的整個控制程式,也稱為fireware(或者韌體程式)。控制MP3的各個部件的工作:從儲存裝置讀取資料送到解碼器解碼;與主機連線時完成與主機的資料交換;接收控制按鍵的操作,顯示系統執行狀態等任務。解碼器是晶片中的一個硬體模組,或者說是硬體解碼(有的MP3播放機是軟體解碼,由高速中央處理器完成)。它可以直接完成各種格式MP3資料流的解碼操作,並輸出PCM或I2S格式的數字音訊訊號。

     儲存裝置是MP3播放機的重要部分,通常的MP3隨身聽都是採用半導體儲存器(FLASH MEMORY)或者硬碟(HDD)作為儲存裝置的。它通過接受儲存主機通訊埠傳來的資料(通常以檔案形式),回放的時候MCU讀取儲存器中的資料並送到解碼器。資料的儲存是要有一定格式的,眾所周知,PC管理磁碟資料是以檔案形式,MP3也不例外,最常用的辦法就是直接利用PC的檔案系統來管理儲存器,微軟作業系統採用的是FAT檔案系統,這也是最廣泛使用的一種。播放機其中一個任務就是要實現FAT檔案系統,即可以從FAT檔案系統的磁碟中按檔名訪問並讀出其中的資料。

      主機通訊埠是MP3播放機與PC機交換資料的途徑,PC通過該埠操作MP3播放機儲存裝置中的資料,拷貝、刪除、複製檔案等操作。目前最廣泛使用的是USB匯流排,並且遵循微軟定義的大容量移動儲存協議規範,將MP3播放機作為主機的一個移動儲存裝置。這裡需要遵循幾個規範:USB通訊協議、大容量移動儲存器規範和SCSI協議。

     音訊DAC是將數字音訊訊號轉換成模擬音訊訊號,以推動耳機、功放等模擬音響裝置。這裡要介紹一下數字音訊訊號。數字音訊訊號是相對模擬音訊訊號來說的。我們知道聲音的本質是波,人說能聽到的聲音的頻率在20Hz到20kHz之間,稱為聲波。模擬訊號對波的表示是連續的函式特性,基本的原理是不同頻率和振幅的波疊加在一起。數字音訊訊號是對模擬訊號的一種量化,典型方法是對時間座標按相等的時間間隔做取樣,對振幅做量化。單位時間內的取樣次數稱為取樣頻率。這樣一段聲波就可以被數字化後變成一串數值,每個數值對應相應抽樣點的振幅值,按順序將這些數字排列起來就是數字音訊訊號了。這是ADC(模擬-數字轉換)過程,DAC(數字-模擬轉換)過程相反,將連續的數字按取樣時候的頻率順序轉換成對應的電壓。MP3解碼器解碼後的資訊屬於數字音訊訊號(數字音訊訊號有不同的格式,最常用的是PCM和I2S兩種),需要通過DAC轉換器變成模擬訊號才能推動功放,被人耳所識別。

     MP3播放機的顯示裝置通常採用LCD或者OLED等來顯示系統的工作狀態。控制鍵盤通常是按鈕開關。鍵盤和顯示裝置合起來構成了MP3播放機的人機互動介面。

     MP3播放機的軟體結構跟硬體是相對應的,即每一個硬體部分都有相應的軟體程式碼,這是因為大多數的硬體部分都是數字可程式設計控制的。

    總結一下,最簡化的MP3的工作原理我們可以概括如下:首先將MP3歌曲檔案從記憶體中取出並讀取儲存器上的訊號→到解碼晶片對訊號進行解碼→通過數模轉換器將解出來的數字訊號轉換成模擬訊號→再把轉換後的模擬音訊放大→低通濾波後到耳機輸出口,輸出後就是我們所聽到的音樂了。