Android 获取 AudioRecord 麦克风音量大小并做选择性发送
?extends:http://blog.csdn.net/alvinhuai/article/details/8955127,http://mikespook.com/2010/11/android-%E5%AE%9E%E6%97%B6%E8%8E%B7%E5%8F%96%E9%BA%A6%E5%85%8B%E9%A3%8E%E8%BE%93%E5%85%A5%E9%9F%B3%E9%87%8F%E7%9A%84%E4%BB%A3%E7%A0%81/
?
?
前幾天做一個關(guān)于錄音并獲取音量大小的模塊,今天寫一個demo和大家分享。如果有各位有更好的方法可以留言提醒我,謝謝。
??? 首先錄音功能很容易實現(xiàn),通過audiorecord或者mediarecorder都可以實現(xiàn),如果要獲取錄音音量的大小,用audiorecord更加方便。實現(xiàn)錄音功能可以大致分為幾個步驟。一 初始化錄音設(shè)備audiorecord。 二 ,開啟一個線程實現(xiàn)錄音功能。 三 獲取錄音的音頻流對它的大小進(jìn)行分析。四 將大小傳遞至主線程使UI做出相應(yīng)的改變。
??? 首先初始化audiorecord?。AudioRecord (int audioSource, int sampleRateInHz, int channelConfig, int audioFormat, int bufferSizeInBytes) ,初始化需要五個參數(shù),audiosource 是指錄制源在此我們選擇麥克風(fēng):MediaRecorder.AudioSource.MIC。??sampleRateInHz?默認(rèn)采樣頻率,以赫茲為單位,官方文檔說44100 為目前所有設(shè)備兼容,但是如果用模擬器測試的話會有問題,所以有的也用8000。 ?channelConfig?,??描述音頻通道設(shè)置?CHANNEL_IN_MONO保證能在所有設(shè)備上工作。audioFormat 音頻流的格式,分為16bit 或8bit目前都支持的是ENCODING_PCM_16BIT. ?bufferSizeInBytes?在錄制過程中,音頻數(shù)據(jù)寫入緩沖區(qū)的總數(shù)(字節(jié))。?從緩沖區(qū)讀取的新音頻數(shù)據(jù)總會小于此值. 這個值一般通過getMinBufferSize來獲取。getMinBufferSize的參數(shù)可以參照audiorecord的構(gòu)造函數(shù)。在oncreate中執(zhí)行一下代碼。?
try {
??????????????? mMinibuffer = AudioRecord.getMinBufferSize(sampleRates,
??????????????????????????????? AudioFormat.CHANNEL_IN_MONO,
??????????????????????????????? AudioFormat.ENCODING_PCM_16BIT);
??????????????? if(mMinibuffer != AudioRecord.ERROR_BAD_VALUE){
??????????????????????? mRecord = new AudioRecord(MediaRecorder.AudioSource.MIC,
????????????????????????????????????? sampleRates[i],
????????????????????????????????????? AudioFormat.CHANNEL_IN_MONO,
????????????????????????????????????? AudioFormat.ENCODING_PCM_16BIT,
????????????????????????????????????? mMinibuffer);
??????????????? }
??????????? } catch (IllegalArgumentException e) {
??????????????? ;
??????????? }
這是audiorecord的初始化,下面可以實現(xiàn)錄音
public class RecordThread extends Thread{
??????? private boolean mIsRun = false;
??????? public RecordThread(){
??????????? super();
??????? }
??????? public void run(){
??????????? super.run();
??????????? MainActivity.this.mRecord.startRecording();
??????????? byte[]? byte_buffer = new byte[mMinibuffer];
??????????? mIsRun = true;
??????????? while(mIsRun){
??????????????? int r = mRecord.read(byte_buffer,0,mMinibuffer);
??????????????? int mShortArrayLenght = r/2;
??????????????? short[] short_buffer = new short[mShortArrayLenght];
??????????????? short_buffer = byteArrayToShortArray(byte_buffer,mShortArrayLenght);
??????????????? int max =? 0;
??????????????? if(r > 0){
??????????????????? for(int i=0; i<mShortArrayLenght; i++){
??????????????????????? if(Math.abs(short_buffer[i]) > max){
??????????????????????????? max = Math.abs(short_buffer[i]);
??????????????????????? }
??????????????????? }
??????????????????? Bundle mBundle = new Bundle();
??????????????????? mBundle.putInt(mSendData, max);
??????????????????? Message Msg = new Message();
??????????????????? Msg.what = RECORDSTATE;
??????????????????? Msg.setData(mBundle);
??????????????????? mHandler.sendMessage(Msg);
??????????????? }
??????????? }
??????????? MainActivity.this.mRecord.stop();
??????????? mHandler.sendEmptyMessage(NULLBUFFER);
??????? }
??????? public void stopRecord(){
??????????? mIsRun = false;
??????? }
??? }
這里是寫一個線程實現(xiàn)錄音功能。byte_buffer??保存錄制的音頻流,因為每次錄制次數(shù)很多,我暫時將每次錄音的最大值當(dāng)作這次錄音的音量,然后通過handler將最大值返回給主線程。如果需要停止這個線程可以通過調(diào)用這個線程函數(shù) stopRecord(); 然后我們通過每次得到的音量值,可以通過view的ondraw函數(shù),將音量變化動態(tài)的畫出來。具體代碼不全貼出來的,主要講一下這個思想。 如果有人需要可以直接留言給我, 可以發(fā)給大伙。
轉(zhuǎn)載于:https://www.cnblogs.com/wikiki/p/5340940.html
總結(jié)
以上是生活随笔為你收集整理的Android 获取 AudioRecord 麦克风音量大小并做选择性发送的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: window7怎么打开驱动盘 如何在Wi
- 下一篇: cocos2dx3.0-tinyxml在