0

Android デバイスのマイクをサウンド インパクト センサーとして使用したい (一部の音楽視覚化プロジェクトのように)。

例: http://www.youtube.com/watch?v=pJGM3PiYpqk

ここまたはグーグル経由で関連するものを見つけることができませんでした。

ファイルに記録せずに、遅延をできるだけ少なくすることは可能ですか?

4

1 に答える 1

0

私はサウンド処理のプロジェクトに取り組んでいますが、何か役に立つものがあると思います。私が知っているように、電話はサンプリングによってマイクロを介して音をキャプチャし、次に信号を振幅の値にpcm(パルスコード変調)します。私たちの仕事は、レコーダーの構成を設定することです。

    int frequency = 8000;
    int channelConfiguration = AudioFormat.CHANNEL_IN_STEREO;
    int audioEncoding = AudioFormat.ENCODING_PCM_16BIT;
    int blockSize = 256;
    int bufferSize = AudioRecord.getMinBufferSize(frequency,
                channelConfiguration, audioEncoding);

そして、これらの構成でレコーダーの新しいインスタンスを作成します:

    AudioRecord audioRecord = new AudioRecord(
                MediaRecorder.AudioSource.DEFAULT, frequency,
                channelConfiguration, audioEncoding, bufferSize);

次に、これで録音を開始します。

    short[] buffer = new short[blockSize];
    float[] toTransform = new float[blockSize];
    try {
        audioRecord.startRecording();
    } catch (IllegalStateException e) {
        Log.e("Recording failed", e.toString());
    }
    while (check) {
            if(isCancelled()) break;
            int bufferReadResult = audioRecord.read(buffer, 0, blockSize);
            // Your code goes here, buffer now has the value of amplitude of sound that you need.

            publishProgress(result);
        }
        try {
            audioRecord.stop();
        } catch (IllegalStateException e) {
            Log.e("Stop failed", e.toString());
        }

記録は、バックグラウンドで実行されるスレッドまたは asynctask である必要があります。Asynctask を使用して、サウンドがキャプチャされるたびに結果を公開することをお勧めします。録音の制御変数のようなチェック。ボタンを使用してこれを制御できます。

音の振幅を使わず、信号を周波数領域に変換できることも理想です。しかし、振幅を使用する方がはるかに簡単だと思います

于 2014-04-04T14:15:48.297 に答える