【问题标题】:WebRTC AEC on AndroidAndroid 上的 WebRTC AEC
【发布时间】:2012-10-10 11:55:53
【问题描述】:

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

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

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

谢谢。

【问题讨论】:

    标签: java android c webrtc aec


    【解决方案1】:

    您需要以下文件:

    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
    );
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        注意:下面引用的 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 配置选项

        TODO:添加 AEC 的示例配置

        【讨论】:

        • 我从来没有让 Speex 回声消除工作得很好(很多噪音)。请参阅我关于如何包含 WebRTC 的 AEC 的答案。
        • 谢谢。旁注:SSE2 适用于 x86 架构。如果在基于 ARM 的平台上工作,则必须使用 aec"m" 源文件。更好的是,您可以链接到已经集成的“libaudiopreprocessing”
        • 我正在使用类似这样的东西 AudioSource audioSource = factory.createAudioSource(new MediaConstraints()); localMS.addTrack(factory.createAudioTrack("ARDAMSa0", audioSource));我已经使用 Peerconnectionfactory 创建了音频源并将其添加到媒体流轨道中。那么我如何在那种情况下使用你的代码呢?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多