http://www.mikespook.com/index.php/archives/762
Android 上有一些很有趣的應用,例如《吹裙子》、《吹氣球》之類的。利用的是即時擷取麥克風輸入音量,然後進行相應的處理。網上也不少人問如何處理這個事情,也有一些解答,不過都沒有實際的代碼。簡單摸索了一下,寫了個小 Demo 試了試,果然可以。給大家共用一下。
不解釋代碼了,大家看注釋。
import android.media.AudioFormat; |
import android.media.AudioRecord; |
import android.media.MediaRecorder; |
public class RecordThread extends Thread { |
private static int SAMPLE_RATE_IN_HZ = 8000; |
private boolean isRun = false; |
bs = AudioRecord.getMinBufferSize(SAMPLE_RATE_IN_HZ, |
AudioFormat.CHANNEL_CONFIGURATION_MONO, |
AudioFormat.ENCODING_PCM_16BIT); |
ar = new AudioRecord(MediaRecorder.AudioSource.MIC, SAMPLE_RATE_IN_HZ, |
AudioFormat.CHANNEL_CONFIGURATION_MONO, |
AudioFormat.ENCODING_PCM_16BIT, bs); |
byte[] buffer = new byte[bs]; |
int r = ar.read(buffer, 0, bs); |
for (int i = 0; i < buffer.length; i++) { |
// 這裡沒有做運算的最佳化,為了更加清晰的展示代碼 |
v += buffer[i] * buffer[i]; |
// 平方和除以資料總長度,得到音量大小。可以擷取白色雜訊值,然後對實際採樣進行標準化。 |
// 如果想利用這個數值進行操作,建議用 sendMessage 將其拋出,在 Handler 裡進行處理。 |
Log.d("spl", String.valueOf(v / (float) r)); |
// 在調用本線程的 Activity 的 onPause 裡調用,以便 Activity 暫停時釋放麥克風 |
// 在調用本線程的 Activity 的 onResume 裡調用,以便 Activity 恢複後繼續擷取麥克風輸入音量 |
This entry was posted on Monday, November 8th, 2010 at 20:02 and is filed under android. You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own