2016-10-29 8 views
0

Я пытаюсь воспроизвести необработанные звуковые данные с помощью класса AudioTrack в Android, я использую метод write, но я заметил, что есть латентность между возвратом метода записи и воспроизведением фактического звука, сделать это просто давайте использовать AudioRecord класс как следующий код psedu:Задержка Android AudioTrack с воспроизведением

//init AudioTrack 
//init AudioRecord 
while(true){ 
    byte [] buffer = new byte[1000]; 
    int read = audioRecord(buffer,0,1000); 
    audioTrack.write(buffer,0,read); 
} 

Я ожидаю, чтобы получить задержку, которая read/sample rate секунд, но фактический звук воспроизводится после того, как и дополнительное около 0,5 секунд, мне очень нужно аудио в играть с минимальной задержкой, так же как у кого-то есть объяснение того, что происходит, и есть ли какое-либо доступное решение, или я должен принять это, поскольку это ха rdware проблема?

ответ

1

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

На Android, чтобы достичь наименьшей задержки, вам необходимо использовать Open SL ES API, который доступен для собственного (C++) кода через NDK. Единственный механизм со стороны Java, который может обеспечить низкую задержку, - это класс SoundPool, но он имеет ограничения в отношении того, какие звуки вы можете играть.

Для получения дополнительной информации см the page on high-performance audio, а также проверить этот SO ответ: Low-latency audio playback on Android

+0

он говорит: «Как OpenSL ES является родным C API, не являющиеся Dalvik потоки приложения, которые требуют OpenSL ES не имеют Dalvik связанных накладные расходы, такие как паузы для сбора мусора. Однако дополнительных преимуществ производительности для использования OpenSL ES не существует. В частности, использование OpenSL ES не приводит к снижению задержки звука, более высоким приоритетам планирования и т. д., чем то, что платформа как правило, обеспечивает ». – ammcom

+0

Java VM (в современных версиях Android это называется ART) накладные расходы могут быть значительными. Для достижения низкой латентности вам может потребоваться, чтобы ваш обратный вызов звука был надежно на 250 Гц, поэтому ваш обратный вызов будет иметь меньше времени в 4 мс, поэтому каждый микросекунда рассчитывает, и вы не хотите, чтобы они были потрачены на JNI или GC. –

 Смежные вопросы

  • Нет связанных вопросов^_^