web-dev-qa-db-ja.com

android:サウンドレベルを検出する

MediaRecorderを使用して、デバイスのマイクからサウンドをキャプチャします。取得したサウンドから、サウンドをファイルに保存せずに、音量(サウンドの音量)を分析するだけで済みます。

2つの質問:

  1. ある瞬間の音の大きさを取得するにはどうすればよいですか?
  2. サウンドをファイルに保存せずに分析するにはどうすればよいですか?

ありがとうございました。

31
Zelter Ady
  1. mRecorder.getMaxAmplitude();を使用します

  2. 必要なものをすべて保存せずにサウンドを分析するには、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;

    }
}
43
Ana Llera

データをファイルに保存せずにマイクから直接取得した音のサンプルを分析する場合は、次のようにAudioRecordオブジェクトを使用する必要があります。

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

最後のコードは、すべての異なるサンプルの振幅を組み合わせ、平均をlastLeveL変数に割り当てます。詳細については、この post にアクセスしてください。

よろしく!

6
Martin Cazares

サウンドレコーディングのソースコードアプリをいくつか試してみましたが、取得に時間がかかりました。

GoogleのNoiseAlertソースコード-SoundMeterコードをコピーできます。これは私が使用したものです。

getMaxAmplitudeの範囲は0から32768です。気にしなかったEMAのもの。

メインアクティビティでは、MediaRecorderオブジェクトを宣言し、アンナが引用したとおりにそのstart()関数を呼び出す必要があります。

詳細については、私のプロジェクトを参照してください: http://kaitagsd.wordpress.com/2013/03/25/arduino-project-amplify-part-2-ie-how-to-transmit-send -data-from-Android-to-arduino-bluesmirf-silver-using-bluetooth / BlueToothを介して音の振幅の値を送信する必要がある場所。

正確なコードはこちら: https://github.com/garytse89/Amplify/tree/master/Android%20Code/src/com/garytse89/allin

関連付けられたMediaRecorderオブジェクトと関係がある部分をざっと見てください。

3
Gary