24

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 しか返しません。

これが機能するには、実際に録音を開始する必要があるようです。あれは正しいですか?

その場合、500 ミリ秒記録し、振幅を取得し、記録を停止して繰り返す必要がありますか?

最後に、ファイルに記録する必要がありますか? このオーディオ ファイルを保存する必要はありません。録音せずに、現在のライブ マイク入力の最後の呼び出し以降の現在の振幅または最大振幅を取得することはできませんか?

どんな助けでも大歓迎です、ありがとう。

4

4 に答える 4

19

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

}
于 2014-10-30T04:26:19.473 に答える
7

はい、最初にrecorder.start()を呼び出す必要があり、最後にrecorder.stop()を呼び出すことも忘れないでください!

サンプル アプリケーションについてはhttp://code.google.com/p/android-labs/source/browse/trunk/NoiseAlert/src/com/google/android/noisealert/を参照してください。 java および NoiseAlert.java

于 2011-02-05T15:30:20.173 に答える
2

MediaRecorder の代わりに AudioRecord クラスを使用する

このサイトをチェックしてください: http://www.doepiccoding.com/blog/?p=195、それは素晴らしい説明と動作するコードを提供します:)

于 2016-05-31T10:46:40.983 に答える