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
, Когда мне не нужно аудио или оно приостановлено, я просто выбрасываю данные.
Я не наблюдал сильного разряда батареи, когда всегда был на аудиозаписи. Хотя это может быть и не лучший способ решить эту проблему, но это определенно было приемлемым обходным путем для меня.