LAME是一款高品質的MP3編碼器(Encoder),普遍認為經由LAME轉換出來的MP3檔案,可以維持住較好的音質。LAME為跨平台的開源軟體,在Android系統上如果要將聲音訊號或是檔案轉成MP3格式,也可以使用LAME來達成。



LAME的輸出品質可以直接從音樂檔案的頻譜看出來,可以參閱這篇文章來學習如何判斷MP3檔案的音質。

LAME

LAME是以C/C++實作出來的函式庫,因此有著不錯的效率。官方網站網址如下:

官方並沒有針對Android平台和Java程式語言做任何的支援,不過也別擔心,LAME非常容易編譯。

編譯LAME For Android

編譯環境:Linux Mint 17 MATE

取得LAME

LAME的原始碼可以直接在官方網站上取得。

加入JNI支援至Android專案

在編譯LAME For Android時,會使用到JNI,所以要讓Android專案能支援JNI。如果您還不知道怎麼樣加入JNI至Android專案中,可以參考這篇文章:

將LAME原始碼目錄放置於Android專案下

把剛才下載下來的LAME原始碼目錄放置在Android的專案下,為了要讓.mk設定檔能直接套用,需確定目錄名稱為「lame」。

加入Android.mk和Application.mk至JNI目錄

在此提供筆者編譯LAME時所使用的Android.mk和Application.mk配置檔案。下載網址:

使用ndk-build來編譯

將終端機下的工作目錄移動到Android專案的目錄下,執行以下指令使用Android NDK開始編譯LAME。

ndk-build

編譯成功的話可以看到以下畫面:

然而,現實總是不會如此順利。如果編譯過程有問題發生,請繼續按照以下方式修改。

沒有「ieee754_float32」型別

編譯時若是出現util.h不認識「ieee754_float32」型別的訊息,如下圖:

要修改lame目錄下,「libmp3lame」目錄裡的「util.h」檔案,將「extern ieee754_float32_t fast_log2(ieee754_float32_t x);」改為「extern float fast_log2(float x);」。

沒有定義「index」或是「bcopy」

編譯時若是出現「bcopy」或是「index」沒有定義的訊息,如下圖:

要修改lame目錄下,「libmp3lame」目錄裡的「id3tag.c」和「machine.h」檔案,將「HAVE_STRCHR」和「HAVE_MEMCPY」的ifdef結構註解掉。

使用LAME For Android

編譯出LAME的.so檔之後,要如何在Android SDK下使用呢?因為LAME官方並未提供任何JNI的支援,所以這部份需要自行實作。要在JNI內使用LAME函式庫的話,可以引入(include)lame目錄下,「include」目錄裡的「lame.h」檔案。使用方法可以直接參考「lame.h」檔案裡的註解。

如果要使用LAME處理PCM資料的話,需注意byte和short之間的轉換,LAME的PCM資料為short(16 bits)格式,因此如果資料來源是byte(8 bits)的話,要將其兩兩合併轉換成short格式,而且還要調換高低位元位置,原本0...7 8...15的資料,要變成8...15 0...7。