Как синхронизировать AudioRecord и AudioTrack - PullRequest
3 голосов
/ 19 мая 2010

Есть ли способ синхронизировать захват и воспроизведение аудиоданных в Android?

Мне нужно выполнить некоторую обработку сигнала (эхоподавление и т. Д.), Которая требует синхронизации на уровне выборки.

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

Любая помощь или подсказка очень ценится. Заранее спасибо.

-flesym

1 Ответ

1 голос
/ 19 августа 2011

Мне удалось настроить эхоподавление на мой процессор Arm5 (WM8650). Ниже приведены шаги, которые я предпринял:

  1. Я обернул Speex JNI и вызвал процедуры обработки эха перед отправкой кадров PCM в кодировщик. Эхо не было отменено независимо от того, какие настройки Speex я пробовал.

  2. Поскольку Speex очень чувствителен к задержке между воспроизведением и эхо-кадрами, я создал очередь и поставил в очередь все пакеты, отправленные в AudioTrack. Размер очереди должен быть примерно равен размеру внутреннего буфера AudioTrack. Таким образом, пакет отправлялся на echo_playback примерно в то время, когда AudioTrack отправлял пакеты на звуковую карту из своего внутреннего буфера. При таком подходе задержка была удалена, но эхо все еще не было отменено

  3. Я завернул часть эхоподавления WebRtc с JNI и вызвал ее методы перед отправкой пакетов в кодировщик. Эхо все еще присутствовало, но библиотека явно пыталась его отменить.

  4. Я применил метод буфера, описанный в P2, и он наконец начал работать. Задержка должна быть скорректирована для каждого устройства, хотя. Также обратите внимание, что в WebRtc есть мобильная и полная версия эхоподавления. Полная версия существенно замедляет процессор и, вероятно, должна работать только на ARM7. Мобильная версия работает, но с более низким качеством

Надеюсь, это кому-нибудь поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...