在講述正文以前首先介紹有關音頻的一些知識。
1、riff/wav/pcm/raw/aac/mp3
riff其實就是一種文件描述的格式;pcm就是媒體文件數據的元數據,直接記錄聲音的內容;wav文件就採用了riff的描述,前面44字節就是riff描述內容,wav=riff+pcm;raw=pcm;mp3是一種音頻的壓縮編碼,就是將pcm通過算法進行壓縮;aac也是一種高級音頻編碼,相對於mp3,aac格式的音頻更佳,文件更小,不足之處在於它屬於有損壓縮的格式。
2、MediaRecorder/audioRecord區別
MediaRecorder是系統提供常用的錄音類,該類可以實現音頻錄製生成文件;audioRecord也是系統提供的錄音類,但是它可以直接捕獲音頻流,開發者可以實時隨意處理其內容,常見場景比如語音聊天/tom貓/k歌。
介紹完基礎知識,下面進入正文,如何實時錄製mp3音頻,現如今轉化音頻爲MP3的框架使用的最多的是lame框架(利用C語言是實現的),在Android和IOS中均可使用。
我們使用的是lame框架進行mp3的格式轉換,由於它是C語言編寫的,無法在Android中直接使用,我們必須使用Jni的方法來調用lame,在這裏就不介紹Jni的使用方法了,使用Jni的方法我們主要是爲了得到一個So文件,得到So文件以後,我們load至系統中就可以調用對應的方法,這裏我使用的一個現成的so文件來進行lame框架中格式轉化的方法,下面進入詳細的代碼。
一、引入So文件
使用So文件必須將So文件引入至系統中,在這裏簡要介紹一下如何在Android Stuio中引入so文件,有兩種方式:
(1)按照As中默認路徑存放,將so文件存放至main文件夾(與java文件文件夾同級)下,與原先eclipse一樣即可
(2)配置so文件的存放路徑,將配置寫在app的android節點之下,具體代碼如下:
android{
...
/*將so文件放置libs文件夾時,需要配置,防止main/jniLibs時一定不能配置 */
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
}
引入so文件的項目圖:
二、工具類源碼代碼結構
引入了so文件以後,接下來就是實際上的錄音工具類的編寫了,首先貼上錄音工具類的代碼結構圖。
三、源碼解析
待續…
四、總結
本項目主要使用的jni的方法調用libmp3的框架來進行實時的錄音錄製,使用的技術主要有jni、AudioRecord等的技術,demo源碼可在Android 實時錄製音頻爲MP3格式demo