ios - 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;
}
解决方案
如果您的内置 AEC 不起作用,则意味着您的回声行为很可能不是微不足道的,您应该寻找比 Speex 更强大的解决方案。谷歌回声消除软件找不到替代品。
推荐阅读
- datepicker - 如何使用角度日、月和年分开从数据选择器中获取值
- php - 尝试从 docker hub 上的官方 blackfire/blackfire 映像为 BlackFire 构建本地 Docker 映像
- python - 随机通道中的后台任务 Discord.py
- java - Camel SFTP Producer 重试特定类型的错误
- vue.js - 组件数据已更新但无法使用
- google-compute-engine - 在 Google Compute Engine 启动脚本上切换用户
- python - Python在html中提取表格的标题
- postgresql - 来自 sql 工作台的 pg_restore 显示带有 DB 标识符的 -U 语法错误
- reactjs - ReactJS 从“反应”问题导入反应
- database - 如何在 MongoDB 上进行旋转?