Android эхоподавление - PullRequest
       26

Android эхоподавление

2 голосов
/ 23 мая 2011

Я пытаюсь разработать приложение Audio Capture, используя AudioRecord класс из Android API, настройка, как аудио источник MediaRecorder.AudioSource.MIC, приложение работает, но когда я пытаюсь использовать эхоподавление, настройка MediaRecorder.AudioSource.VOICE_COMMUNICATION как источник, когда объект AudioRecorder создано, генерируется исключение IllegalArgumentException, но я не знаю почему:

Мой код:

private static final int SAMPLE_RATE = 16000;
private static final int BIT_ENCODING = AudioFormat.ENCODING_PCM_16BIT;
private static final int CHANNEL_CONFIGURATION = AudioFormat.CHANNEL_CONFIGURATION_MONO;

private int m_i32BufferSize;

private AudioRecord m_AudioRecorder;

public caudioCapture ()
{
    super ();

    m_i32BufferSize = AudioRecord.getMinBufferSize(SAMPLE_RATE, CHANNEL_CONFIGURATION, BIT_ENCODING);

    //Create audio recorder object 
    try
    {
        m_AudioRecorder = new AudioRecord (MediaRecorder.AudioSource.VOICE_COMMUNICATION,SAMPLE_RATE,CHANNEL_CONFIGURATION,BIT_ENCODING,m_i32BufferSize);

    }
    catch (IllegalArgumentException e)
    {
        throw new IllegalArgumentException("Bad arguments on AudioRecorder creation", e);
    }

В моем манифесте Android есть:

использует разрешение android: name = "android.permission.RECORD_AUDIO"

Может быть, это потому, что я использую Samsung Galaxy Tab P1000, и он работает с Android 2.2? Есть идеи?

Большое спасибо

Ответы [ 2 ]

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

Я наконец-то смог заставить эхоподавление работать на моем процессоре Arm5 (WM8650).Ниже приведены шаги, которые я предпринял.

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

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

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

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

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

1 голос
/ 01 июня 2011

Да, это правильно.Проблема в том, что вы используете Android 2.2.Новый VOICE_COMMUNICATION появился в Android 3.0.При запуске на более старых версиях вы получите исходный код DEFAULT.

...