【问题标题】:Acoustic Echo Cancellation (AEC) with Speex and DirectSound使用 Speex 和 DirectSound 的声学回声消除 (AEC)
【发布时间】:2009-05-05 19:31:52
【问题描述】:

我正在尝试使用 Speex 编解码器库执行回声消除 (AEC)。根据 Speex 文档,我需要执行两个调用:

 speex_echo_playback(echo_state, echo_frame); 

每次播放音频帧,并且

 speex_echo_capture(echo_state, input_frame, output_frame);

捕捉到的每一帧。

由于我使用的是 DirectSound,我想我可以在调用 speex_echo_playback 时使用主 DirectSound 缓冲区作为 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 协同工作的任何指示或建议?感谢您的帮助。

【问题讨论】:

  • 为什么要使用 DirectSound 的低级 API?你可以写一个效果 DMO 更容易。
  • 感谢您的推荐。您有 DirectX 媒体对象 (DMO) 的基本用法示例吗?我在大量代码基础设施之上工作,所以我不确定使用 DMO 有多容易。
  • > 为什么要使用 DirectSound 的低级 API? - 因为它允许编写可移植的代码。

标签: c++ audio echo directsound speex


【解决方案1】:

我做过一次。但我的方法如下:

我从未直接使用过主缓冲区。相反,我只使用了一个二级缓冲区。我有两个线程——播放线程和捕获线程。另外,我使用了另一个 speex 函数 - speex_echo_cancellation

因此,在我的播放线程中,我将当前播放帧保存在全局缓冲区中,并在名为 speex_echo_cancellation 函数的捕捉线程中保存了当前捕捉帧和先前存储的播放帧。

DMO 不适用于我,因为我还必须支持 Windows XP。

您也可以浏览 speex mailing lists archive 或更好的 subscribe here 以获得更多有趣的信息。

祝你好运,

安东尼

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-26
    • 1970-01-01
    • 2017-02-18
    • 2012-04-22
    • 1970-01-01
    相关资源
    最近更新 更多