8

Speex コーデック ライブラリでアコースティック エコー キャンセレーション (AEC) を実行しようとしています。Speex のドキュメントによると、次の 2 つの呼び出しを実行する必要があります。

 speex_echo_playback(echo_state, echo_frame); 

オーディオ フレームが再生されるたびに、

 speex_echo_capture(echo_state, input_frame, output_frame);

キャプチャされたすべてのフレームに対して。

私は DirectSound を使用しているので、プライマリ DirectSound バッファを speex_echo_playback の呼び出しで echo_frame として使用できると考えていました。

  DWORD offset = 0;
  DWORD length = 0;
  LPVOID block1, block2;
  DWORD length1, length2;
  DWORD flags = DSBLOCK_ENTIREBUFFER;

  HRESULT hr = primary_buffer->Lock(
        offset
      , length
      , &block1
      , &length1
      , &block2
      , &length2
      , flags
      );

  // Would like to convert the buffer into a form that
  // speex_echo_capture() can use.
  // Why does length1 == length2 == 0 always? 

  hr = primary_buffer->Unlock( block1, length1, block2, length2 );

ドキュメントには、これらは書き込み専用ポインターであると書かれていますが、バッファ データを自分で使用する方法はありませんか?

これは基本的に私がバッファを作成する方法です:

  CComPtr< IDirectSoundBuffer > primary_buffer;
  DSBUFFERDESC primarydesc = { sizeof( DSBUFFERDESC ),
      DSBCAPS_PRIMARYBUFFER | DSBCAPS_CTRL3D | DSBCAPS_LOCHARDWARE,
      0, 0, NULL, DS3DALG_HRTF_LIGHT };
  HRESULT hr = directsound_->CreateSoundBuffer(
      &primarydesc, &primary_buffer, NULL );

DirectSound バッファ自体を使用する代わりに、speex_decode() の出力を使用して、独自のソフトウェア ミキシングを行う方法があるようです。

Speex と DirectSound を連携させるための指針や提案はありますか? 助けてくれてありがとう。

4

1 に答える 1

3

私はこれを一度やったことがあります。しかし、私のアプローチは次のとおりでした。

プライマリ バッファーを直接使用したことはありません。代わりに、1 つのセカンダリ バッファーのみを使用しました。再生スレッドとキャプチャ スレッドの 2 つのスレッドがありました。また、別の speex 関数 - speex_echo_cancellationを使用しました。

したがって、私の再生スレッドでは、現在の再生フレームをグローバル バッファに保存し、speex_echo_cancellation 関数と呼ばれるキャプチャ スレッドで、現在のキャプチャ フレームと以前に保存された再生フレームを保存しました。

Windows XP もサポートする必要があったため、DMO は適用できませんでした。

また、speex メーリング リストのアーカイブを参照するか、ここで購読して、より興味深い情報を入手することもできます。

幸運を、

アンソニー

于 2011-07-28T03:27:09.850 に答える