使用 MediaRecorder
我从设备的麦克风捕获声音。我只需要分析声音的音量(声音响度),而不将声音保存到文件中。
两个问题:
- 如何在给定时刻获取声音的响度?
- 如何在不保存声音到文件的情况下进行分析?
谢谢。
使用mRecorder.getMaxAmplitude();
如果只需要分析声音而不保存,你只需使用mRecorder.setOutputFile("/dev/null");
以下是一个例子,希望对您有所帮助。
public class SoundMeter {
private MediaRecorder mRecorder = null;
public void start() {
if (mRecorder == null) {
mRecorder = new MediaRecorder();
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
mRecorder.setOutputFile("/dev/null");
mRecorder.prepare();
mRecorder.start();
}
}
public void stop() {
if (mRecorder != null) {
mRecorder.stop();
mRecorder.release();
mRecorder = null;
}
}
public double getAmplitude() {
if (mRecorder != null)
return mRecorder.getMaxAmplitude();
else
return 0;
}
}
int sampleRate = 8000;
try {
bufferSize = AudioRecord.getMinBufferSize(sampleRate, AudioFormat.CHANNEL_IN_MONO,
AudioFormat.ENCODING_PCM_16BIT);
audio = new AudioRecord(MediaRecorder.AudioSource.MIC, sampleRate,
AudioFormat.CHANNEL_IN_MONO,
AudioFormat.ENCODING_PCM_16BIT, bufferSize);
} catch (Exception e) {
android.util.Log.e("TrackingFlow", "Exception", e);
}
接着,当您准备好时,您需要开始录制:
audio.startRecording();
short[] buffer = new short[bufferSize];
int bufferReadResult = 1;
if (audio != null) {
// Sense the voice...
bufferReadResult = audio.read(buffer, 0, bufferSize);
double sumLevel = 0;
for (int i = 0; i < bufferReadResult; i++) {
sumLevel += buffer[i];
}
lastLevel = Math.abs((sumLevel / bufferReadResult));
代码在这里:https://github.com/garytse89/Amplify/tree/master/Android%20Code/src/com/garytse89/allin
只需浏览与相关的MediaRecorder对象有关的部分即可。