首页 > 解决方案 > iOS - 如何使用 speex 解决回声问题?

问题描述

我的App调用对讲有回音,我用过native方法,但是没用,想用speex的回音消除,但是遇到了一些问题,在speex的回音消除中,需要三个参数, ref、echo和End,我只有bufferList.mBuffers[0].mData这个变量,不知道另外两个参数要代替什么?

OSStatus recordingCallback(void *inRefCon, AudioUnitRenderActionFlags *ioActionFlags, const AudioTimeStamp *inTimestamp, UInt32 inBusNumber, UInt32 inNumberFrames, AudioBufferList *ioData) {
AudioProcessor *audioProcessor = (__bridge AudioProcessor *)inRefCon;
AudioBufferList bufferList;
bufferList.mNumberBuffers = 1;
bufferList.mBuffers[0].mData = NULL;
OSStatus status = AudioUnitRender(audioProcessor.audioUnit, ioActionFlags, inTimestamp, inBusNumber, inNumberFrames, &bufferList);
if (status != noErr) {
    return status;
}
SpeexEchoState *echo_state = speex_echo_state_init(bufferList.mBuffers[0].mDataByteSize, 882);
SpeexPreprocessState *den = speex_preprocess_state_init(bufferList.mBuffers[0].mDataByteSize, 44100);
short *ref_buf = (short*)bufferList.mBuffers[0].mData;
short *echo_buf = (short*)malloc(bufferList.mBuffers[0].mDataByteSize);
short *endbuf = (short*)malloc(bufferList.mBuffers[0].mDataByteSize);
speex_echo_cancellation(echo_state,
                        (spx_int16_t*)ref_buf,
                        (spx_int16_t*)echo_buf,
                        (spx_int16_t*)endbuf);
speex_preprocess_run(den, (spx_int16_t*)endbuf);
[audioProcessor.delegate processAudioData:endbuf dataSize:bufferList.mBuffers[0].mDataByteSize];
free(ref_buf);
free(echo_buf);
free(endbuf);

return noErr;

}

标签: iosobjective-cspeex

解决方案


如果您的内置 AEC 不起作用,则意味着您的回声行为很可能不是微不足道的,您应该寻找比 Speex 更强大的解决方案。谷歌回声消除软件找不到替代品。


推荐阅读