AudioRecord возвращает некоторые пустые данные после запуска

Я написал стандартный код для получения данных с микрофона с помощью AudioRecord. Вот мой код:

AudioReceiver() {
    int minHardwareBufferSize = AudioRecord.getMinBufferSize(SAMPLE_RATE,
            CHANNEL_CONFIG, AUDIO_FORMAT);
    Log.d(TAG, "minHardwareBufferSize = " + minHardwareBufferSize);
    int bufferSizeBytes = (minHardwareBufferSize > MIN_BUFFER_SIZE_BYTES) ?
            minHardwareBufferSize : MIN_BUFFER_SIZE_BYTES;
    bufferSizeShorts = bufferSizeBytes / 2;

    //резервируем буфер с запасом в 2 раза
    audioRecorder = new AudioRecord(MediaRecorder.AudioSource.MIC,
            SAMPLE_RATE, CHANNEL_CONFIG, AUDIO_FORMAT, bufferSizeBytes * 2);

    testStack = new short[bufferSizeShorts * 4];
    Arrays.fill(testStack, (short) 2000);
}


boolean startReceive() {
    audioRecorder.startRecording();
    isReceiving = true;
    int recordingState = audioRecorder.getRecordingState();
    Log.d(TAG, "recordingState = " + recordingState);
    new Thread(receivingRunnable).start();
    return (recordingState == AudioRecord.RECORDSTATE_RECORDING);
}


boolean stopReceive() {
    isReceiving = false;
    audioRecorder.stop();
    int recordingState = audioRecorder.getRecordingState();
    Log.d(TAG, "recordingState = " + recordingState);
    return (recordingState == AudioRecord.RECORDSTATE_STOPPED);
}


private Runnable receivingRunnable = new Runnable() {
    @Override
    public void run() {
        int readCount = 0;
        short[] dataBuffer = new short[bufferSizeShorts];
        while (isReceiving) {
            testBusy = true;
            for (int j = 0; j < 4; j++) {
                readCount = audioRecorder.read(dataBuffer, 0, dataBuffer.length);
                Log.d(TAG, "receive " + readCount + " bytes");
                System.arraycopy(dataBuffer, 0, testStack, bufferSizeShorts * j, readCount);
            }
            isReceiving = false;
            testBusy = false;
        }
    }
};

Но я заметил, что после первого запуска функции startReceive, в начале буфера testStack, остаются пустые данные (около 1000 выборок на Nexus 4, см. График данных).

График данных

Между инициализацией AudioReceiver и запуском startReceive проходит много времени. Что может быть причиной проблемы?

1 ответ

Кажется, что задержка вызвана тем, что ОС требуется время для повторной выборки данных, и трудно обеспечить единую частоту выборки для всех устройств. Также упоминается в других сообщениях. Итак, я вместо этого переместил свою логику записи звука в активность onCreate, Когда мне не нужно аудио или оно приостановлено, я просто выбрасываю данные.

Я не наблюдал сильного разряда батареи, когда всегда был на аудиозаписи. Хотя это может быть и не лучший способ решить эту проблему, но это определенно было приемлемым обходным путем для меня.

Другие вопросы по тегам