Как использовать модуль эхоподавления в PulseAudio?

Я пытаюсь заставить работать PulseAudio эхоподавитель.

У меня два приложения - рекордер и плеер, оба используют PulseAudio. Я создаю плеер и рекордер так:

 // pulseAudio
 pa_simple *paS=0;
 pa_sample_spec ss;

void initPulseAudio()
 {
     ss.format = PA_SAMPLE_S16LE;
     ss.channels = 1;
     ss.rate = 8000;


     paS = pa_simple_new(NULL,               // Use the default server.
                       "bottomPlayer",           // Our application's name.
                       PA_STREAM_PLAYBACK,
                       NULL,               // Use the default device.
                       "playStream",            // Description of our stream.
                       &ss,                // Our sample format.
                       NULL,               // Use default channel map
                       NULL,               // Use default buffering attributes.
                       NULL               // Ignore error code.
                       );

     if(!paS)
     {
         fprintf(stderr,
                 "unable to create recorder\n");
         myExit(1);
       }
 }

Все работает, кроме эхоподавления. Я включил это с

pactl load-module module-echo-cancel

но нет разницы с этим модулем и без него - эхо существует. Я новичок в PulseAudio и не смог найти хорошее руководство по использованию эхоподавителя. Что я должен добавить или настроить в настройках устройства, чтобы он работал?

ОС - linux, теперь это Ubuntu, но, наконец, это будет openWrt

1 ответ

Решение

Я предполагаю, что вы используете PulseAudio 1.0 или выше. Для потоков проигрывателя и рекордера необходимо установить для свойства filter.want значение echo-cancel. Мы не раскрываем способ сделать это с помощью простого API, поэтому вам нужно будет выбрать более уродливый путь установки переменной среды PULSE_PROP, как этот, прежде чем создавать поток, который сделает свое дело:

setenv("PULSE_PROP", "filter.want=echo-cancel", 1);

PS: Для действительно качественного эхоподавления вам нужен PulseAudio 2.0 или выше с встроенной поддержкой обработки аудио webrtc- насколько легко это получить, зависит от того, упакован ли уже в вашем дистрибутиве или нет.

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