gpt4 book ai didi

c++ - 使用 Speex 和 DirectSound 的回声消除 (AEC)

转载 作者:可可西里 更新时间:2023-11-01 18:38:51 24 4
gpt4 key购买 nike

我正在尝试使用 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 协同工作有什么建议或建议吗?感谢您的帮助。

最佳答案

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

我从来没有直接使用过主缓冲区。相反,我只使用一个辅助缓冲区。我有两个线程——回放线程和捕获线程。此外,我还使用了另一个 speex 函数 - speex_echo_cancellation .

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

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

您还可以查看 - speex mailing lists archive甚至更好subscribe here获取更多有趣的信息。

祝你好运

安东尼

关于c++ - 使用 Speex 和 DirectSound 的回声消除 (AEC),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/826554/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com