2011-06-27 79 views
2

我需要在我的應用程序中實現一個功能,用於通過麥克風讀取聲音強度。但我不知道該怎麼做,請問有人可以幫我嗎?只需要讀取聲音的強度,不要識別任何單詞。如何在Android中使用麥克風強度? (語音)

據我所知,我不得不使用AudioRecord類,但我不知道什麼是必須寫入我的代碼的步驟,因爲我不知道是否真的有必要將一點聲音保存到SD卡中然後在讀取該信號的最大值之後將其轉換爲PCM。

+0

按強度你是指體積(振幅)還是頻率或某種組合? – mjr

回答

2

AudioRecord類將讓您錄製到緩衝區中。然後,您可以選擇處理緩衝區或將其保存到SD卡,具體取決於您的需要。你想要做什麼完全取決於你的應用程序。處理後你需要數據嗎?或者是你所需要的處理結果?你打算播放錄音嗎?

的如何使用AudioRecord A類簡單的例子如下:

AudioRecord recorder = new AudioRecord(MediaRecorder.AudioSource.MIC, 
sampleRate, AudioFormat.CHANNEL_IN_STEREO, 
AudioFormat.ENCODING_PCM_16BIT, bufferSize); 

recorder.startRecording(); 

short buf[] = new short[buffersize]; 
int n = 0; 
while(<some condition>) { 
    n = recorder.read(buf, 0, bufferSize); 
    process(buf); 
} 

recorder.stop(); 
recorder.release(); 

你顯然希望把上面的代碼在一個線程的主UI線程之外。

您需要確保無論您在進行的任何操作都足夠快,以便在緩衝區填滿之前重新讀取數據,否則您將丟棄數據。採樣率和緩衝區大小將取決於您如何處理數據以及您的延遲要求是什麼。

後,你得到所有的工作,你可以決定你想要把手機變成「免提電話」,以獲得通過MIC更好的增益:

AudioManager amAudioManager; 
amAudioManager =  (AudioManager)getSystemService(Context.AUDIO_SERVICE); 
amAudioManager.setMode(AudioManager.MODE_IN_CALL); 
amAudioManager.setSpeakerphoneOn(true); 

是的,你必須把在IN_CALL中撥打電話以啓用揚聲器電話。是的,有些手機顯然禁用IN_CALL時記錄的功能。