Android中无法实例化JEqualizer的Delphi FMX音频录制问题
Delphi 11 FMX Android 音频录制问题排查与解决
一、解决 TJEqualizer 初始化异常(Error: -3)
Error -3 对应 Android 原生的 EFFECT_ERROR_NO_INIT,核心原因是设备不支持该音效组件或 Session 关联逻辑错误,可按以下步骤处理:
- 先校验设备支持性:实例化 TJEqualizer 前,必须先通过 Android 原生 API 判断设备是否支持均衡器音效,避免直接实例化抛出异常:
if TJAudioEffect.JavaClass.isEffectTypeSupported(TJEqualizer.JavaClass.EFFECT_TYPE_EQUALIZER) then begin // 再进行 TJEqualizer 初始化操作 FEqualizer := TJEqualizer.JavaClass.init(0, FAudioRecord.getAudioSessionId); end else begin // 设备不支持均衡器,跳过或给出提示 end; - 确认 SessionID 的有效性:必须在
AudioRecord成功初始化并调用startRecording后,再获取其AudioSessionId,不能使用提前预设的数值。 - 补全必要权限:除了
MODIFY_AUDIO_SETTINGS,务必确保已申请并授予RECORD_AUDIO权限(Android 6.0+ 需运行时申请)。
二、音频电平异常(过高/过低/低频衰减)的排查与修复
电平异常通常源于系统默认的音频处理(自动增益、降噪、厂商音效),可通过以下方式禁用或调整:
- 关闭自动增益控制与降噪:在初始化
AudioRecord后,通过原生参数强制关闭系统自带的音频处理:var LAudioRecord: JAudioRecord; begin // 初始化 AudioRecord 完成后执行 LAudioRecord.setParameters(StringToJString('noise_suppression=off;gain_control=off;acoustic_echo_canceler=off')); end; - 调整音频录制模式:将音频模式切换为
MODE_IN_COMMUNICATION,部分设备会在该模式下禁用消费级音效处理:var LAudioManager: JAudioManager; begin LAudioManager := TJAudioManager.Wrap(TAndroidHelper.Context.getSystemService(TJContext.JavaClass.AUDIO_SERVICE)); LAudioManager.setMode(TJAudioManager.JavaClass.MODE_IN_COMMUNICATION); end; - 使用 RAW 音频格式:若上述方法无效,可尝试使用
AudioRecord的 RAW 格式(需设备支持),直接读取未经过系统处理的原始音频数据,规避系统音效干扰。
三、额外注意事项
- 不同 Android 厂商(小米、华为、三星等)可能有自定义音频处理逻辑,部分设备无法完全禁用系统音效,需针对特定机型适配。
- 测试务必使用真实设备,模拟器音频处理逻辑与真机差异较大,无法复现真实问题。
内容的提问来源于stack exchange,提问作者lefjucabro
相关产品推荐
相关产品推荐

