AudioRecord buffer filled with zeros

北城以北 提交于 2019-12-12 05:25:41

问题


Why is the audioData short[] buffer I create in the code below filled with 0 upon each

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

?

The size of the buffer (audioData.length) is NOT ZERO which means that the buffer is NOT EMPTY, it's just filled with zeros.

I've tried changing the FREQUENCY to 8000 -> no change.

I'm implementing the Echoprint library - please refer to this for more information on this should you require it.

Proof from LogCat that the audioData buffer is filled with zeros:

// ...
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();
}

回答1:


I found that I did in fact record some data - it was just the section I chose to display that only recorded zeros. I prove this by summarizing all entries into the audioData array and dividing it by the number of entries into the array. The result was -3.455619047619048.



来源:https://stackoverflow.com/questions/15245699/audiorecord-buffer-filled-with-zeros

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!