Android:没有录音的示例麦克风可以获得实时幅度/电平?

Tom*_*Tom 17 java media android record microphone

我试图在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());
    }
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,这只会一直返回0.

看来为了实现这一点,我必须真正开始录制.那是对的吗?

如果是这样,我是否需要录制500ms,获得振幅,停止录制并重复?

最后,我是否必须录制到文件?我不需要保存这个音频文件,我不能只是获取当前幅度或自上次调用当前直播麦克风输入以来没有录音的最高幅度?

任何帮助表示赞赏,谢谢.

Ben*_*ser 14

来自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;
    }

}
Run Code Online (Sandbox Code Playgroud)


Tou*_*mal 6

是的,你必须先调用recorder.start(),你也不要忘记最后调用recorder.stop()!

有关示例应用程序,请参阅http://code.google.com/p/android-labs/source/browse/trunk/NoiseAlert/src/com/google/android/noisealert/,您可能需要查看SoundMeter. java和NoiseAlert.java

  • 显然可以使用 AudioRecord 代替,无需录制文件 (2认同)
  • 您可以将音频/媒体输出重定向到 /dev/null 并防止以这种方式发生任何实际录制。还要确保使用 recorder.prepare(),否则它将无法工作。 (2认同)