4

私はAndroid 用のSIP ソフトフォンアプリを開発しており、エコー キャンセルの問題に直面しています。Speexを使用して解決しようとしましたが、成功しませんでした。私の次のショットはWebRTC AEC (Acoustic Echo Cancellation) ですが、使用方法に関するドキュメントが見つかりません。

私のアプリでは、オーディオは Java の AudioTrack および AudioRecord クラスで管理されていますが、送受信するソケットは C コード (JNI と統合) にあります。WebRTC はメガ プロジェクトであり、AEC モジュールのみを統合したいと考えています。

インクルードする必要があるファイル、コンパイラに必要なフラグ、実行する関数呼び出しなどを知っている人はいますか? WebRTCも使用するCSipSimpleコードがありますが(ただし、他の用途にも使用されます)、それを含めて使用する簡単で適切な方法がわかりません。

ありがとう。

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

注:以下で参照されているAndroidのバージョンは4.1(JellyBean)です。

応答が遅すぎる可能性があります。ただし、dbaustistaの質問への回答に関心がある場合は、次のことを検討してください。

AECはAudioEffectクラスによってモデル化されています。したがって、AECAudioEffectオブジェクトを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の構成例を追加

于 2012-12-20T22:24:29.720 に答える
0

これはあなたの質問の答えにはなりませんが、必要なものがwebrtc.orgで見つからない場合は、 discuss-webrtcグループを試してください。

于 2012-10-11T09:00:28.203 に答える