轉自:http://www.jb51.net/article/64806.htm
public
class
AudioRecordDemo {
private
static
final
String TAG =
"AudioRecord"
;
static
final
int
SAMPLE_RATE_IN_HZ =
8000
;
static
final
int
BUFFER_SIZE = AudioRecord.getMinBufferSize(SAMPLE_RATE_IN_HZ,
AudioFormat.CHANNEL_IN_DEFAULT, AudioFormat.ENCODING_PCM_16BIT);
AudioRecord mAudioRecord;
boolean
isGetVoiceRun;
Object mLock;
public
AudioRecordDemo() {
mLock =
new
Object();
}
public
void
getNoiseLevel() {
if
(isGetVoiceRun) {
Log.e(TAG,
"還在錄着呢"
);
return
;
}
mAudioRecord =
new
AudioRecord(MediaRecorder.AudioSource.MIC,
SAMPLE_RATE_IN_HZ, AudioFormat.CHANNEL_IN_DEFAULT,
AudioFormat.ENCODING_PCM_16BIT, BUFFER_SIZE);
if
(mAudioRecord ==
null
) {
Log.e(
"sound"
,
"mAudioRecord初始化失敗"
);
}
isGetVoiceRun =
true
;
new
Thread(
new
Runnable() {
@Override
public
void
run() {
mAudioRecord.startRecording();
short
[] buffer =
new
short
[BUFFER_SIZE];
while
(isGetVoiceRun) {
//r是實際讀取的數據長度,一般而言r會小於buffersize
int
r = mAudioRecord.read(buffer,
0
, BUFFER_SIZE);
long
v =
0
;
// 將 buffer 內容取出,進行平方和運算
for
(
int
i =
0
; i < buffer.length; i++) {
v += buffer[i] * buffer[i];
}
// 平方和除以數據總長度,得到音量大小。
double
mean = v / (
double
) r;
double
volume =
10
* Math.log10(mean);
Log.d(TAG,
"分貝值:"
+ volume);
// 大概一秒十次
synchronized
(mLock) {
try
{
mLock.wait(
100
);
}
catch
(InterruptedException e) {
e.printStackTrace();
}
}
}
mAudioRecord.stop();
mAudioRecord.release();
mAudioRecord =
null
;
}
}).start();
}
}
