You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 01:23:24