Задержка инициализации Android AudioRecord
Вот пример соответствующего кода, над которым я работаю:
AudioRecord recorder = setupAudio();
recorder.startRecording();
Метод SetupAudio:
public AudioRecord setupAudio() {
AudioRecord recorder;
minBufferSizeInBytes = AudioRecord.getMinBufferSize(
RECORDER_SAMPLERATE, AudioFormat.CHANNEL_IN_MONO,
AudioFormat.ENCODING_PCM_16BIT);
Log.e("MoverAudio","BufferSize: " + minBufferSizeInBytes);
recorder = new AudioRecord(MediaRecorder.AudioSource.CAMCORDER,
RECORDER_SAMPLERATE, AudioFormat.CHANNEL_IN_MONO,
AudioFormat.ENCODING_PCM_16BIT, minBufferSizeInBytes);
return recorder;
}
RECORDER_SAMPLERATE = 8000;
Я пытаюсь выяснить, есть ли способ улучшить время, необходимое для инициализации.
В настоящее время я тестирую его с 3 устройствами со следующими результатами:
Galaxy S3
- setupAudio: ~200 мс
- startRecording(): ~280 мс
Galaxy S3 mini
- setupAudio: ~ 10 мс
- startRecording(): ~290 мс
Galaxy Nexus
- setupAudio: ~ 10 мс
- startRecording(): ~235 мс
BufferSizes:
- Нексус: 704
- с3: 1024
- s3 mini: 640
Тем не менее, можно использовать только данные из галактического узла. Для целей моего приложения я должен быть в состоянии получить аудио данные как можно скорее. С текущими значениями только Nexus находится в пределах приемлемого времени.
S3 mini может показаться быстрым, поскольку он занимает чуть больше, чем Nexus, однако первые ~200 мс сэмпла указаны как 0, поэтому его нельзя использовать.
Из того, что я понимаю после анализа собранных данных, звук на S3 и S3 mini кажется каким-то образом отфильтрован, поскольку результирующее БПФ намного более чистое, а низкочастотные звуки всегда гораздо менее заметны. Вот пример записи звука S3mini и Galaxy Nexus:
http://img41.imageshack.us/img41/4177/ox7h.png S3 Mini
http://img690.imageshack.us/img690/8717/iya6.png Galaxy Nexus
1 ответ
Если вы запрашиваете длинный буфер, то вам придется ждать, пока ОС заполнит его с текущей частотой дискретизации. Если вы запрашиваете частоту дискретизации, отличную от того, на котором работает аппаратный АЦП, вам придется дополнительно дождаться задержки фильтра ресэмплера. Различные устройства Android и версии ОС могут поддерживать разные минимальные размеры буфера и частоту дискретизации аппаратного обеспечения.
Один из способов скрыть задержку - начать запись раньше в жизненном цикле приложения и просто выбрасывать аудиосэмплы, пока приложение не понадобится. Тогда нет никаких накладных расходов при запуске.
Добавлено: на некоторых версиях устройств / ОС данные могут быть действительно записаны в более длинные буферы драйвера ОС с некоторой аппаратной частотой дискретизации (например, 4096 при 44,1 кГц или 48 кГц) и только после того, как пара этих буферов заполнена, преобразованы в другую выборку. скорость, и нарезанный в более короткие запрошенные длины буфера, с помощью звуковой команды начинают отправку данных в приложение. Чтобы обойти, если это возможно, вам может понадобиться изменить ОС и написать свой собственный драйвер АЦП. Но попробуйте использовать более высокую частоту дискретизации (44,1 КБ или 48 КБ) и сначала запросить более короткие буферы.