c – 使用Speex和DirectSound进行声学回声消除(AEC)

c – 使用Speex和DirectSound进行声学回声消除(AEC),第1张

概述我正在尝试使用Speex编解码器库执行声学回声消除(AEC).根据Speex文档,我需要执行两个调用: speex_echo_playback(echo_state, echo_frame); 每次播放音频帧时,和 speex_echo_capture(echo_state, input_frame, output_frame); 对于每个捕获的帧. 由于我使用的是DirectSound,我以为我 我正在尝试使用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,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.

您还可以通过0700或更好的方式查看subscribe here以获得更多有趣的信息.

祝好运,

安东尼

总结

以上是内存溢出为你收集整理的c – 使用Speex和DirectSound进行声学回声消除(AEC)全部内容,希望文章能够帮你解决c – 使用Speex和DirectSound进行声学回声消除(AEC)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1238621.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存