安卓上的WebRTC AEC

4
我正在为Android开发SIP软电话应用程序,但面临着回声抑制问题。我已经尝试使用Speex解决此问题,但并未成功。因此,我接下来的尝试是使用WebRTC AEC(声学回声消除),但我找不到任何有关如何使用它的文档。
在我的应用中,音频由Java中的AudioTrack和AudioRecord类管理,但发送和接收的套接字位于C代码中(与JNI集成)。 WebRTC是一个大型项目,我只想集成AEC模块。
是否有人知道我必须包括哪些文件,编译器需要哪些标志,要进行哪些函数调用等?我有CSipSimple代码,该代码也使用WebRTC(但也用于其他用途),但我不知道如何简单和正确地包含和使用它。
谢谢。
3个回答

10

你需要以下文件:

aec/modules/audio_processing/aec/aec_core_sse2.c
aec/modules/audio_processing/aec/aec_core.c
aec/modules/audio_processing/aec/aec_rdft_sse2.c
aec/modules/audio_processing/aec/aec_rdft.c
aec/modules/audio_processing/aec/aec_resampler.c
aec/modules/audio_processing/aec/echo_cancellation.c
aec/modules/audio_processing/utility/ring_buffer.c
aec/modules/audio_processing/utility/delay_estimator.c
aec/modules/audio_processing/utility/delay_estimator_wrapper.c
aec/system_wrappers/source/cpu_features.cc
aec/common_audio/signal_processing/randomization_functions.c

使用方法:

void * aec = 0;
int status = WebRtcAecm_Create(&aec);
status = WebRtcAecm_Init(aec, 8000 /* sample rate */);

// Buffer the far end frames
int status = WebRtcAecm_BufferFarend(
    aec, play_frm, 160
);

// Cancel echo
status = WebRtcAecm_Process(
    aec, (WebRtc_Word16 *)buf, (WebRtc_Word16 *)buf,
    tmp_frm, 160,
    echo_tail / tail_factor
);

0

注意:下面提到的Android版本是4.1(JellyBean)

回复可能已经晚了。然而,对于任何对dbaustista的问题感兴趣的人,请考虑以下内容:

AEC由AudioEffect类建模。因此,需要将AEC AudioEffect对象添加到RecordThread的“效果链”中。我相信AEC的实现内置于libaudioprocessing库中。请参见下面的附加说明。

/system/etc/audio_effects.conf
libraries {
...
   pre_processing {
     path /system/lib/soundfx/libaudiopreprocessing.so
   }
}

界面

media/AudioEffect.h

示例

下面的示例向您展示如何将一个AudioEffect对象添加到PlaybackThread中。类似的逻辑也可以应用于RecordThread,即将AEC对象添加到RecordThread的效果链中。

mediaframeworktest/functional/audio/MediaAudioEffectTest.java

      AudioTrack track = new AudioTrack(
                                  AudioManager.STREAM_MUSIC,
                                  44100,
                                  AudioFormat.CHANNEL_OUT_MONO,
                                  AudioFormat.ENCODING_PCM_16BIT,
                                  AudioTrack.getMinBufferSize(44100,
                                  AudioFormat.CHANNEL_OUT_MONO,
                                  AudioFormat.ENCODING_PCM_16BIT),
                                  AudioTrack.MODE_STREAM);
      assertNotNull(msg + ": could not create AudioTrack", track);
      AudioEffect effect = new AudioEffect(AudioEffect.EFFECT_TYPE_ENV_REVERB,
              AudioEffect.EFFECT_TYPE_NULL,
              0,
              0);

      track.attachAuxEffect(effect.getId());
      track.setAuxEffectSendLevel(1.0f);

AEC配置选项

待办事项:添加AEC的示例配置


我从未成功地使用Speex回声消除(有很多噪音)。请参考我的答案,了解如何包含WebRTC中的AEC。 - junglecat
谢谢。顺便提一下:SSE2适用于x86架构。如果在基于ARM的平台上工作,您将需要使用“aec”m”源文件。更好的方法是,您可以链接到已经集成的“libaudiopreprocessing”。 - Keo Malope
我正在使用类似以下的代码: AudioSource audioSource = factory.createAudioSource(new MediaConstraints()); localMS.addTrack(factory.createAudioTrack("ARDAMSa0", audioSource)); 我是通过Peerconnectionfactory创建了audiosource,并将其添加到mediastream track中。那么在这种情况下,我该如何使用你的代码呢? - umerk44

0

这并不回答你的问题,但如果你在webrtc.org上找不到需要的内容,可以尝试加入discuss-webrtc讨论组。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接