35

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

2 つの質問:

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

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

4

3 に答える 3

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

    }
}
于 2013-01-06T11:38:23.353 に答える
8

データをファイルに保存せずにマイクから直接取得したサウンドのサンプルを分析する場合は、次のように 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 変数に割り当てます。詳細については、この投稿を参照してください。

よろしく!

于 2014-01-03T22:10:06.260 に答える
3

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

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 オブジェクトに関係する部分に目を通すだけです。

于 2013-03-25T10:48:31.343 に答える