APE文件格式解析

一、APE簡單介紹

APE是Monkey’s Audio提供的一種無損壓縮音頻格式。與mp3、ogg有損壓縮方式不同,龐大的WAV音頻文件通過Monkey’Audio軟件進行“瘦身”壓縮, 壓縮比大約爲2 ∶ 1(爲源文件的60%左右)。由於採用特殊算法,保證音質不受損失,通過解壓縮可以得到與源文件一致的品質,即通過Monkey’還原成WAV,還可把APE音頻格式刻錄成CD保存。而還原後的音樂文件與壓縮前一模一樣,沒有任何音質損失,因此可以用他來保存、複製CD。因爲被壓縮後的APE 文件容量要比WAV源文件小一半多,如用於網絡音頻文件傳輸,可以節約傳輸所用的時間且能保持音質。其特點如下所示:

(1)Monkey‘s Audio是高優化和高效率的;

(2)無損壓縮,沒有質量損失;

(3)可以被大多數的流行players和rippers支持,如Media Center、Foobar、WMP、Winamp等;

(4)完全免費和開源。

二、APE文件結構

1、Header句法結構

Header的內容包括:文件的屬性、sound的參數(如聲道數、採樣率等)、內部結構(如幀數、Seek Table,甚至可能包括WAV的header)。Header的句法結構如下圖所示:


2、Header句法元素含義

(1)tag:此元素的值爲四個字符“MAC ”,是APE文件的標誌。可以通過該標誌來判斷一個媒體文件是否爲APE文件。

(2)compression_level:壓縮等級,對應的等級如下所示:


(3)format_flags:APE文件標記,標記了APE文件以及APE編碼格式的一些屬性,如sample的位數、是否含有CRC校驗、是否含有WAVE Header等等。ffmpeg對format_flags值的定義如下所示,這也是在句法結構圖中的那些數字的含義。

#define MAC_FORMAT_FLAG_8_BIT                 1 // is 8-bit [OBSOLETE]
#define MAC_FORMAT_FLAG_CRC                   2 // uses the new CRC32 error detection [OBSOLETE]
#define MAC_FORMAT_FLAG_HAS_PEAK_LEVEL        4 // uint32 nPeakLevel after the header [OBSOLETE]
#define MAC_FORMAT_FLAG_24_BIT                8 // is 24-bit [OBSOLETE]
#define MAC_FORMAT_FLAG_HAS_SEEK_ELEMENTS    16 // has the number of seek elements after the peak level
#define MAC_FORMAT_FLAG_CREATE_WAV_HEADER    32 // create the wave header on decompression (not stored)

(4)seek_table_length:標識了seek_table的長度。在file_version大於等於3980的版本中,seek_table_length是seek_table所佔用的字節數;而在file_version小於3980的版本中,seek_table_length是seek_table包含的數組元素個數,與seek_table包含字節數爲四倍的關係。

(5)seek_table:seek_table中存放的是每個frame在APE文件中的position。但是,在真正去讀取frame的時候,需要考慮四字節對齊的問題。

(6)tatal_frames:包含frame的個數。

(7)blocks_per_frame:標識每個frame包含的block的個數,這隻對前total _frames - 1的frame有效。對於最後一個frame,它所包含的block的個數由句法元素final_frame_blocks的值來指定。

(8)final_frame_blocks:最後一個frame包含的block的個數。

3、APE Tag結構

APE tag用來存放metadata數據,比如歌名、演唱者、專輯名等等,這些信息就稱爲tag(標籤)信息。APE tag有兩個版本,即APEV1與APEV2。APEV1一般放在文件的末尾,而APEV2具有與ID3v2一樣的靈活性和可括展性,字段名可自定義,字段長度可擴展,同時格式定義又不像ID3v2那麼繁瑣。APEV2的格式很簡單,實現起來也很方便,tag存放位置是可選的,既可以在文件頭也可以在文件尾。APEV1與APEV2的區別主要有兩個方面:

(a)APEV1使用的是ACSII編碼,二APEV2使用的是UTF-8編碼,使得可以實現unicode支持。

(b)APEV2標準裏增加了一個APE Tags Header,APEV1裏面沒有。

APEV1與APEV2的結構分別如下圖所示:

(1)APE Tags Header

APE Tags Header只在APEV2中才有,其內容包括整個tag的長度、item的個數等。最開始是固定的8個字符“APETAGEX”,用來標識tag header的開始。APE Tags Header與APE Tags Footer的結構相似,唯一的不同就是Tags Flag中的一個bit,這也是用於區分APE Tags Header與APE Tags Footer的一個標記。APE Tags Header的結構如下所示:

(2)APE Tag Item

APE Tag Item存在於APEV1和APEV2中,其結構如下所示:

(3)APE Tags Footer

APE Tags Footer與APE Tags Header的結構相似,但它可以存在於APEV1和APEV2中。唯一的不同就是Tags Flag中的一個bit位,這也是用於區分APE Tags Header與APE Tags Footer的一個標記。最開始是固定的8個字符“APETAGEX”,用來標識tag footer的開始。APE Tags Footer的結構如下所示:

(4)一個簡單的示例

上面的幾個圖來自wiki,可能有點抽象。我們以一個簡單的示例來說明一下,這樣比較直觀。如下圖所示,圖爲在Linux平臺用ghex打開的一個APE文件。

從圖中可以看出,該tag爲APEV2 tag。

a、APE Tags Header

首先是APE Tags Header,從圖中可以很容易的找到,以“APTTAGEX”開始,然後是4個字節的version,0x00 00 07 D0,即version爲2000。

然後是四個字節的tag size,爲0x00 00 00 72,即整個APE tag包括114個字節,其中不包括APE Tags Header的長度。可以從圖中數一下,確實是114個字節。

在然後的四個字節是item的個數,0x00 00 00 03,即包括三個item。

緊接着是4個字節的flags,爲0xA0 00 00 00。

最後是reserved的8個字節,全部爲0。

b、APE Tag Item

由對APE Tags Header的分析可以知道,該tag中包括了三個item,從圖中也可以看的出來,分別爲Title、Artist和Album。我們可以以Title這個item爲例進行分析。APE Tags Header爲固定的32個字節,因此,跳過32個字節之後便是Title這個item的內容。

首先是四個字節的length,0x00 00 00 0C,即爲12個字節。這個12表示該item的value佔12個字節。

然後是四個字節的flags,這裏爲0x00 00 00 00。

接着是item的key,這裏爲Title,是ASCII編碼。item的key後面是一個字節的標誌位,爲0x00,用於標識item的key結束。

最後是item的value,由上面的分析可以知道爲12個字節。

c、APE Tags Footer

APE Tags Footer的結構和APE Tags Header的結構是一樣的,而且內容幾乎一樣,唯一的區別就在於flag。APE Tags Header的flag爲0xA0 00 00 00,而APE Tags Footer的flag爲0x80 00 00 00。查看了幾個APE文件,APE Tags Header的flag都爲0xA0 00 00 00,而APE Tags Footer的flag都爲0x80 00 00 00,這兩個flag的值可能是固定的值(個人猜測),以此來區分APE Tags Footer與APE Tags Header。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章