Задержка инициализации 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 КБ) и сначала запросить более короткие буферы.

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