1

バッファをマイク入力で埋めて内容を分析しようとしています。私はバッファを作成します:

    int bufferSize=AudioRecord.getMinBufferSize(8000,AudioFormat.CHANNEL_IN_MONO,
            AudioFormat.ENCODING_PCM_16BIT);
    short[] buffer1 = new short[bufferSize];

次に、Recorder という別のクラスに、次の関連コードがあります。

public short[] fillBuffer(short[] audioData, int bufferSize) {

    AudioRecord recorder = new AudioRecord(AudioSource.MIC, 8000, AudioFormat.CHANNEL_IN_MONO,
            AudioFormat.ENCODING_PCM_16BIT, bufferSize); // instantiate the
                                                            // AudioRecorder

    if (recorder.getRecordingState() == android.media.AudioRecord.RECORDSTATE_STOPPED)
        recorder.startRecording(); // check to see if the Recorder
                                    // has stopped or is not
                                    // recording, and make it
                                    // record.

    recorder.read(audioData, 0, bufferSize); // read the PCM
                                                // audio data
                                                // into the
                                                // audioData
                                                // array

    if (recorder.getState() == android.media.AudioRecord.RECORDSTATE_RECORDING)
        recorder.stop(); // stop the recorder

    return audioData;

}

次に、私が呼び出すと:

recorder.fillBuffer(buffer1, bufferSize);

出力をログに記録すると、バッファが有効なオーディオデータと思われるもので半分いっぱいになっているが、ゼロで半分いっぱいになっていることが常に示されます。

通常の半分のサイズのバッファを作成するとエラーが発生したので、実際にはゼロを格納していることがわかります。バッファサイズの奇妙さだけではありません。ここで明らかに間違ったことをしていますか?Java にはかなり精通していますが、これが初めての Android アプリケーションであることを覚えておいてください。

4

3 に答える 3

3

私は同じ問題を抱えています、それは次の理由によると思います:

  • getMinBufferSize はサイズをバイト単位で返します
  • AudioRecord コンストラクターはサイズをバイト単位で受け入れます。

  • 読み取り機能はオーバーロードされており、バイトとショートを受け入れることができます。あなたの audioData 変数は短いので、短いバッファーサイズも期待されています。唯一のことは、現在バッファーサイズをバイト単位で指定しているため、実際に指定されたバッファーサイズは 2 倍大きすぎます! (ショート = 2x バイト)

私がしたことは、読み取り関数で buffersize を 2 で除算することです。ここで解決したようですが、もう少しテストする必要があります。

お役に立てれば ;)

乾杯、

マルセル

于 2012-12-03T22:47:08.537 に答える
2

私は実際にこれを解決したかもしれないと思います。これは以前に Windows WaveIn を使用して C++ で記述し、バッファーに短い int 配列を使用したので、当然ここでそれを実行しようとしました。ただし、ドキュメントをもう一度読んだ後、byte[] 配列が必要なようです。変更後、動作するようです。助けてくれてありがとう、みんな!

于 2012-11-25T07:05:24.130 に答える
0

ドキュメントAudioRecord.readは、読み取ったバイト数を返すことを示唆しているようです。の戻り値で何もしていないように見えるAudioRecord.readので、おそらく使用されたバッファの終わりを過ぎて読んでいるだけです。

バッファを埋める場合は、次のように変更AudioRecord.Readします。

int offset = 0, read = 1;
while (offset < bufferSize)
{
    read = recorder.read(audioData, offset, bufferSize);
    offset += read;
    if (read <= 0) break;
}
于 2012-11-25T02:20:24.277 に答える