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。
編譯成功的話可以看到以下畫面:
然而,現實總是不會如此順利。如果編譯過程有問題發生,請繼續按照以下方式修改。
沒有「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。