前言:在android開發中,實現錄音的功能一般有三種方式:1.呼叫系統的錄音器 2.使用mediarecord類實現錄音功能 3.使用audiorecord類。在這裡我就不講前兩種方式的實現了,大家可以在網上查詢相關的內容。這篇文章主要講的是使用audiorecord實現聲音採集。
如果你不需要對採集到的資料進行處理的話,就可以選擇使用前面兩種方式。但是如果你需要將採集到的資料轉化為pcm格式,aac格式,***格式等,就需要使用audiorecord類進行採集了。
在使用這個類之前我們先要了解幾個概念:
(1) 取樣率
取樣就是把模擬訊號轉化為數碼訊號的過程。
我們可以把取樣率看作是上圖中,每條紅線的間隔,間隔越密集的時候,取樣率就越高,音訊的音質就越高。
在android手機裝置中,44100khz是可以相容全部手機的取樣率。
(2)量化精度(位寬)
在上圖中,每個紅點表示為量化精度,常見的資料型別大小是,4bit,8bit,16bit,32bit等。
(3)聲道數
(4)buffersizeinbytes
它表示audiorecord內部的音訊緩衝區的大小。該緩衝區的值不能低於一幀的「音訊幀」的大小。
一幀音訊幀的大小計算公式是: int size = 取樣率 * 位寬 * 取樣時間 * 通道數
android系統提供了乙個方法獲取buffersizeinbytes的值。即audio.getminbuffersize()。
簡單使用:
1. 建立需要的引數。 如取樣率,聲道數等
2. 獲取緩衝區大小
3. 例項化audiorecord
4. 開始錄製startrecording(),並開啟乙個執行緒用於不斷寫入檔案
5.停止,並釋放資源
接下來咱們上**:
1.建立需要的引數。 如取樣率,聲道數等
private audiorecord maudiorecord;2.獲取緩衝區大小private int msamplerate = 44100;//取樣率
private int mchannelcount = audioformat.channel_in_mono;//雙聲道
private int maudiosource = mediarecorder.audiosource.mic;//麥克風
private int audioformat = audioformat.encoding_pcm_16bit;//量化精度
private int mminbuffersize;
//獲取緩衝區的大小
mminbuffersize = audiorecord.getminbuffersize(msamplerate, mchannelcount, audioformat);
3.例項化audiorecord//audiorecord物件例項化
maudiorecord = new audiorecord(maudiosource, msamplerate, mchannelcount, audioformat, mminbuffersize);
4.開始錄製startrecording(),並開啟乙個執行緒用於不斷寫入檔案
private void recording() catch (ioexception e)
}try
} catch (ioexception e)
}}).start();
}5.停止,並釋放資源
isrecording = false;
maudiorecord.stop();
maudiorecord.release();
maudiorecord = null;
最後:需要申請許可權,申請許可權,申請許可權。重要的事情說三遍。
站在巨人的肩膀上
參考:
AudioRecord 使用小結與注意事項
使用專門的執行緒讀取資料,容易出現buffer overflow。使用 setrecordpositionupdatelistener時,要注意兩個問題 一 1.啟動錄音後,要先read buffer,才會通知啟用 listener。audiorecord startrecording audior...
利用錄音AudioRecord實現吹一吹效果
不錯的創意,記一下,原帖原理其實就是話筒的監聽,需要在androidmanifest.xml中要加入兩個許可權 另外模擬器無法測試,只能用真機才有效果 另外 低於api 14的sdk可能無效,我測試小公尺android2.3.5似乎無效,三星9300 android4.0有效!以下是copy的 留在...
利用錄音AudioRecord實現吹一吹效果
不錯的創意,記一下,url 原帖 url 原理其實就是話筒的監聽,需要在androidmanifest.xml中要加入兩個許可權 另外模擬器無法測試,只能用真機才有效果 另外 低於api 14的sdk可能無效,我測試小公尺android2.3.5似乎無效,三星9300 android4.0有效!以下...