0

以下のコードで作成したバッファがそれぞれaudioData short[]で満たされるのはなぜですか0

samplesIn += mRecordInstance.read(audioData, samplesIn, bufferSize - samplesIn);

?

バッファーのサイズ ( audioData.length) は NOT ZERO です。これは、バッファーが空ではなく、ゼロで埋められていることを意味します。

に変更してみましFREQUENCY8000->変更なし。

私は、Echoprint ライブラリを実装しています。これについての詳細は、必要に応じてこちらを参照してください。

audioDataバッファがゼロで埋められていることを LogCat から証明します。

// ...
public final static int LISTENING_PASS_TIME = 20;
// cap to 30 seconds max, 10 seconds min.
public final static int MAX_LISTENING_PASS_TIME = 30;
public final static int MIN_LISTENING_PASS_TIME = 10;

private final int FREQUENCY = 11025;
private final int CHANNEL = AudioFormat.CHANNEL_IN_MONO;
private final int ENCODING = AudioFormat.ENCODING_PCM_16BIT;    

private Thread thread;
private volatile boolean isRunning = false;
AudioRecord mRecordInstance = null;

private short audioData[];
private int bufferSize; 
private int secondsToRecord;
private volatile boolean continuous;

public void stop() {
    this.continuous = false;
    if (mRecordInstance != null)
        mRecordInstance.stop();     
}

public void run() {
    this.isRunning = true;
    try {
        // create the audio buffer & get the minimum buffer size
        int minBufferSize = AudioRecord.getMinBufferSize(FREQUENCY,
                CHANNEL, ENCODING);
        Log.d("Fingerprinter", "minBufferSize: " + minBufferSize);

        // and the actual buffer size for the audio to record frequency *
        // seconds to record.
        bufferSize = Math.max(minBufferSize, this.FREQUENCY
                * this.secondsToRecord);
        Log.d("Fingerprinter", "bufferSize: " + bufferSize);

        audioData = new short[bufferSize];

        // start recorder
        mRecordInstance = new AudioRecord(MediaRecorder.AudioSource.MIC,
                FREQUENCY, CHANNEL, ENCODING, minBufferSize);

        // start recording
        willStartListening();

        mRecordInstance.startRecording();
        boolean firstRun = true;
        do {
            try {
                willStartListeningPass();

                long time = System.currentTimeMillis();
                // fill audio buffer with mic data.
                int samplesIn = 0;
                do {
                    samplesIn += mRecordInstance.read(audioData, samplesIn,
                            bufferSize - samplesIn);

                    if (mRecordInstance.getRecordingState() == AudioRecord.RECORDSTATE_STOPPED)
                        break;
                } while (samplesIn < bufferSize);
                Log.d("Fingerprinter",
                        "Audio recorded: "
                                + (System.currentTimeMillis() - time)
                                + " millis");

                // see if the process was stopped.
                if (mRecordInstance.getRecordingState() == AudioRecord.RECORDSTATE_STOPPED
                        || (!firstRun && !this.continuous))
                    break;

                // debugging: print audioData short[]
                Log.d("Fingerprinter", "Audio Data Content:");

                // String audioDataContent = "";
                for (int i = 100; i < 110; i++) {
                    // audioDataContent = i + ":" + audioData[i];
                    Log.d("Fingerprinter", i + ":" + audioData[i]);
                }

                Log.d("Fingerprinter", "samplesIn: " + samplesIn);

                firstRun = false;

                didFinishListeningPass();
            } catch (Exception e) {
                e.printStackTrace();
                Log.e("Fingerprinter", e.getLocalizedMessage());

                didFailWithException(e);
            }
        } while (this.continuous);
    } catch (Exception e) {
        e.printStackTrace();
        Log.e("Fingerprinter", e.getLocalizedMessage());

        didFailWithException(e);
    }

    if (mRecordInstance != null) {
        mRecordInstance.stop();
        mRecordInstance.release();
        mRecordInstance = null;
    }
    this.isRunning = false;

    didFinishListening();
}
4

1 に答える 1

0

実際にいくつかのデータを記録したことがわかりました。記録したのは、表示するために選択したセクションだけでしたzeros。これを証明するには、すべてのエントリをaudioData配列にまとめ、それを配列のエントリ数で割ります。結果は でした-3.455619047619048

于 2013-03-10T19:11:46.687 に答える