class RecordThread extends Thread {
private AudioRecord ar;
private int bs;
private final int SAMPLE_RATE_IN_HZ = 8000;
private boolean isRun = false;
public RecordThread() {
super();
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);
}
public void run() {
super.run();
ar.startRecording();
// 用於讀取的
short[]
buffer = new short[bs];
isRun = true;
while (isRun) {
int r = ar.read(buffer, 0, bs);
int v = 0;
// 將 buffer 內容取出,進行平方和運算
for (int i = 0; i < buffer.length; i++) {
// 這裡沒有做運算的最佳化,為了更加清晰的展示代碼
v += buffer<i> * buffer<i>;
}
//value 的 值 控制 為 0 到 100 之間 0為最小 》= 100為最大!!
int value = (int) (Math.abs((int)(v /(float)r)/10000) >> 1);
Log.d("111", "v = " + v);
// 平方和除以資料總長度,得到音量大小。可以擷取白色雜訊值,然後對實際採樣進行標準化。
// 如果想利用這個數值進行操作,建議用 sendMessage 將其拋出,在 Handler 裡進行處理。
Log.d("222", String.valueOf(v / (float) r));
double dB = 10*Math.log10(v/(double)r);
Log.d("333", "dB = " + dB);
Message msg = new Message();
msg.what = 3;
msg.arg1 = value;
mHandler.sendMessage(msg);
}
ar.stop();
}
public void pause() {
// 在調用本線程的 Activity 的 onPause 裡調用,以便 Activity 暫停時釋放麥克風
isRun = false;
}
public void start() {
// 在調用本線程的 Activity 的 onResume 裡調用,以便 Activity 恢複後繼續擷取麥克風輸入音量
if (!isRun) {
super.start();
}
}
}</i></i>