如何为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
相关产品推荐
相关产品推荐

