4

我正在为Android开发一个SIP 软电话应用程序,并面临回声消除问题。我尝试使用Speex解决它,但没有成功。所以我的下一个镜头是WebRTC AEC(声学回声消除),但我找不到任何关于如何使用它的文档。

在我的应用程序中,音频由 Java 中的 AudioTrack 和 AudioRecord 类管理,但发送和接收的套接字在 C 代码中(与 JNI 集成)。WebRTC 是一个大型项目,我只想集成 AEC 模块。

有人知道我必须包含哪些文件,编译器需要哪些标志,要执行哪些函数调用,等等?我有 CSipSimple 代码,它也使用 WebRTC(但也用于其他用途),我找不到包含和使用它的简单和正确的方法。

谢谢。

4

3 回答 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
);
于 2013-02-04T18:11:45.233 回答
0

这不能回答您的问题,但如果您在webrtc.org上找不到您需要的内容,请尝试使用Discussion -webrtc组。

于 2012-10-11T09:00:28.203 回答
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 的效果链。

媒体框架测试/功能/音频/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 配置选项

TODO:添加 AEC 的示例配置

于 2012-12-20T22:24:29.720 回答