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

如何为Android AudioTrack附加多个Aux Effect?相关技术疑问

AudioTrack 多Aux音效相关问题解答

核心疑问解答

1. 能否为AudioTrack附加多个音效?

不行,Android的AudioTrack同一时间只能绑定一个Aux音效实例。每次调用attachAuxEffect()都会覆盖之前绑定的音效ID,最终只有最后一次设置的音效会生效。

2. setAuxEffectSendLevel如何确定作用的音效?

因为AudioTrack同一时间只能绑定一个Aux音效,所以这个方法的发送级别只会作用于当前已绑定的那个音效(也就是最后一次调用attachAuxEffect()设置的音效),不需要额外指定参数。

3. 传入0调用attachAuxEffect会移除哪个音效?

官方文档说传入null音效ID可分离,但实际传入0时,会直接清除当前AudioTrack绑定的唯一那个音效——毕竟同一时间只能绑定一个,不存在“移除其中一个”的情况。如果要切换音效,直接调用attachAuxEffect()传入新的音效ID即可,无需先分离旧的。

4. 原代码无效果的原因

你的代码存在几个关键问题:

  • 重复绑定音效导致最终只有最后一个生效,但后续又调用attachAuxEffect(0)清除了它,等于没有任何音效在工作。
  • 音效创建时的音频会话ID错误:PresetReverb和BassBoost的第二个参数需要传入当前AudioTrack的音频会话ID(通过audioTrack.getAudioSessionId()获取),你传入的0无法让音效关联到正确的音频流。
  • 代码拼写错误:bb.Id应该是bb.getId(),audioTrack.AttachAuxEffect(0)应该是小写开头的audioTrack.attachAuxEffect(0),Java对大小写敏感,这些错误会导致代码逻辑异常。

原问题代码(含问题标注)

PresetReverb reverb = new PresetReverb(1, 0); // 错误:第二个参数应改为audioTrack.getAudioSessionId()
reverb.setPreset(PresetReverb.PRESET_LARGEHALL);
reverb.setEnabled(true);
audioTrack.attachAuxEffect(reverb.getId());
audioTrack.setAuxEffectSendLevel(1.0f);

BassBoost bb = new BassBoost(0, 0); // 错误:第二个参数应改为audioTrack.getAudioSessionId()
bb.setStrength(1000);
bb.setEnabled(true);
audioTrack.attachAuxEffect(bb.Id); // 错误:应为bb.getId()
audioTrack.setAuxEffectSendLevel(1.0f);

//this code detaches which effect?
audioTrack.AttachAuxEffect(0); // 错误:应为attachAuxEffect(0),执行后会清除当前绑定的低音增强音效

内容的提问来源于stack exchange,提问作者jho

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 15:53:10