Android应用调用AcousticEchoCanceler.create()失败问题求助
我在Android应用中使用AAudio打开音频流,通过以下代码设置Session ID:
AudioStreamBuilder_setSessionId(builder, AAUDIO_SESSION_ID_ALLOCATE);
打开流后,通过AAudioStream_getSessionId(st->recorderStream)获取到类似35329的Session ID,但调用AcousticEchoCanceler.create(sessionId)时失败,报错信息如下:
AudioEffect E set(): AudioFlinger could not create effect
7b491460-8d4d-11e0-bd61-0002a5d5c51b /
ec7178ec-e5e1-4432-a3f4-4657e6795210, status: -19AudioEffects-JNI E
AudioEffect initCheck failed -3
AudioEffect-JAVA E Error code -3 when initializing AudioEffect.
AcousticEchoCanceler W not enough memory
已确认ActivityManager.MemoryInfo()显示内存充足,且AcousticEchoCanceler.isAvailable()返回true,请问为何创建AcousticEchoCanceler会失败?
可能的原因及解决方案
AAudio流配置与AEC不兼容:AcousticEchoCanceler对音频参数有严格要求,比如采样率(通常需为44100Hz或48000Hz)、声道数(单声道优先)、音频格式。AAudio默认配置可能超出AEC支持范围,需强制设置匹配的参数,例如在构建AAudio流时指定采样率为48000Hz、单声道输入。
Session ID未关联双向流:AEC需要同时绑定录音流和播放流,且两者必须属于同一个音频Session。如果仅创建了录音流,未将对应播放流关联到同一Session,会导致AEC初始化失败。需确保播放、录音流共用同一个Session ID,或在构建AAudio流时明确配置双向流支持。
AAudio低延迟模式与硬件AEC冲突:部分设备的硬件AEC仅支持普通AudioTrack/AudioRecord流,不兼容AAudio的低延迟模式。错误码-19(NO_INIT)和-3(BAD_VALUE)往往指向这类兼容性问题。可尝试将AAudio流的性能模式从
AAUDIO_PERFORMANCE_MODE_LOW_LATENCY改为AAUDIO_PERFORMANCE_MODE_POWER_SAVING,看是否能正常初始化AEC。AudioFlinger实例资源耗尽:设备的AudioFlinger对音频效果实例数量有上限,若其他应用已占用所有AEC实例,会导致创建失败。可重启设备释放资源,或检查应用中是否重复创建未释放的音频效果实例。
内容的提问来源于stack exchange,提问作者Juha

