android speex AEC 回音消除。
有时候喇叭声音会被mic录制进去,就会产生回音数据,这是非常让人头疼的,所以去回音在音视频应用中非常重要。
现在主流的回音消除手段有android自带api效果很好,如果其他平台就要使用c库了。有哪些c库具备这个功能webrtc 、 speex等。他们都是开源代码,而且后者还没有专利保护可以随意开鲁。
今天介绍的就是speex方法消除回声。
那么speex消除回声的原理是什么?
从通讯回音产生的原因看,可以分为声学回音(Acoustic Echo)和线路回音(Line Echo),相应的回声消除技术就叫声学回声消除(Acoustic Echo Cancellation,AEC)和线路回声消除(Line Echo Cancellation, LEC)。声学回音是由于在免提或者会议应用中,扬声器的声音多次反馈到麦克风引起的(比较好理解);线路回音是由于物理电子线路的二四线匹配耦合引起的(比较难理解)。
speex使用就是aec算法,下面就看看怎么实现speex库去回声的使用。
官网地址:
speex.org
这里不介绍集成的部分,网上有很多可以参考。
开始编码!
创建变量
SpeexEchoState* m_pState;
SpeexPreprocessState* st;
int m_nFrameSize=160;
int m_nFilterLen=m_nFrameSize*8;
int m_nSampleRate=8000;
int iArg;
初始化
m_pState = speex_echo_state_init(m_nFrameSize, m_nFilterLen);
if(m_pState == NULL)
return -1 ;
st = speex_preprocess_state_init(m_nFrameSize, m_nSampleRate);
if(st == NULL)
return -2 ;
iArg = m_nSampleRate;
speex_echo_ctl(m_pState, SPEEX_ECHO_SET_SAMPLING_RATE, &iArg);
speex_preprocess_ctl(st, SPEEX_PREPROCESS_SET_ECHO_STATE, m_pState);
回声消除
speex_echo_cancellation(m_pState, recordBuffer,
playBuffer, szOutBuffer);
int flag=speex_preprocess_run(st, szOutBuffer);
recordBuffer 是mic录制声音
playBuffer 是扬声器播放声音
szOutBuffer 处理后数据
释放句柄
speex_echo_state_destroy(m_pState);
speex_preprocess_state_destroy(st);
完成!
如果对你有用记得点赞哦!!!.