我试图在 Android 上获得麦克风的振幅级别,如下所示:
MediaRecorder recorder = new MediaRecorder();
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
Timer timer = new Timer();
timer.scheduleAtFixedRate(new RecorderTask(recorder), 0, 1000);
private class RecorderTask extends TimerTask {
private MediaRecorder recorder;
public RecorderTask(MediaRecorder recorder) {
this.recorder = recorder;
}
public void run() {
Log.v("MicInfoService", "amplitude: " + recorder.getMaxAmplitude());
}
}
不幸的是,这始终只返回 0。
看来要让这个工作,我必须真正开始录音。那是对的吗?
如果是这样,我是否需要记录500ms,获取幅度,停止记录并重复?
最后,我必须记录到文件中吗?我不需要保存这个音频文件,难道我不能在不录音的情况下获取当前实时麦克风输入的当前振幅或自上次调用以来的最高振幅吗?
任何帮助表示赞赏,谢谢。
Toumal 的解决方案有效,但是我无法获得足够高的刷新率以满足我的需求。所以我最终使用了Toumal 链接的SoundMeter.java类,但对其进行了修改以使用此答案中的代码
这是我使用的代码,它提供了更好的刷新率:
import android.media.AudioFormat; import android.media.AudioRecord; import android.media.MediaRecorder; public class SoundMeter { private AudioRecord ar = null; private int minSize; public void start() { minSize= AudioRecord.getMinBufferSize(8000, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT); ar = new AudioRecord(MediaRecorder.AudioSource.MIC, 8000,AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT,minSize); ar.startRecording(); } public void stop() { if (ar != null) { ar.stop(); } } public double getAmplitude() { short[] buffer = new short[minSize]; ar.read(buffer, 0, minSize); int max = 0; for (short s : buffer) { if (Math.abs(s) > max) { max = Math.abs(s); } } return max; } }