我正在为 Android 开发 SIP软电话应用,并面临回音消除问题。我试图用 Speex 解决它但没有成功。所以我的下一个镜头是 WebRTC AEC (声学回声消除),但我找不到任何关于如何使用它的文档。
在我的应用程序中,音频使用Java中的AudioTrack和AudioRecord类进行管理,但发送和接收的套接字采用C代码(与JNI集成)。 WebRTC是一个大型项目,我只想集成AEC模块。
有人知道我必须包含哪些文件,编译器需要哪些标志,哪些函数调用,等等?我有CSipSimple代码,它也使用WebRTC(但也用于其他用途),我找不到包含和使用它的简单方法。
感谢。
答案 0 :(得分:9)
您需要以下文件:
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
);
答案 1 :(得分:0)
这不能解答您的问题,但如果您无法在webrtc.org找到所需内容,请尝试discuss-webrtc群组。
答案 2 :(得分: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 /功能/音频/ 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的示例配置