HTML5音频淡入淡出本质是通过GainNode动态调节gain值实现,需用setValueAtTime与linearRampToValueAtTime等调度方法平滑过渡,避免突变;淡出后须调用stop()或pause()并重置时间。

HTML5 音频淡入淡出效果本质是动态调节音量增益(gain),而 GainNode 正是 Web Audio API 中专用于控制音量的节点,它通过平滑改变 gain 参数值实现渐变效果。
GainNode 的基础作用与连接方式
GainNode 是一个音频处理节点,不产生声音,只按比例缩放输入信号的振幅。它必须插入在音频源(如 AudioBufferSourceNode 或 MediaElementAudioSourceNode)和目的地(audioContext.destination)之间才能生效。
- 创建方式:
const gainNode = audioContext.createGain(); - 连接顺序示例:
source.connect(gainNode).connect(audioContext.destination); - 关键属性:
gainNode.gain是一个AudioParam,支持时间参数化调度(如setValueAtTime、linearRampToValueAtTime)
淡入:从静音到目标音量的线性/指数上升
淡入即让增益从 0(无声)平滑升至 1(原始音量)或指定值。直接设 gain.value = 0 再调用 linearRampToValueAtTime 即可,但要注意避免突变导致爆音。
- 推荐做法:先用
setValueAtTime(0, startTime)设定起始值,再用linearRampToValueAtTime(1, startTime + duration) - 更自然的听感可用
exponentialRampToValueAtTime(需起始值 > 0,例如从0.001开始) - 注意:不能对
gain.value直接赋值后立刻启动淡入——必须用调度方法,否则会跳变
淡出:从当前音量渐降至零并停止播放
淡出常用于优雅结束音频。除调节增益外,还需在增益归零后调用 stop()(对 AudioBufferSourceNode)或暂停媒体元素(对 <audio>)。
立即学习“前端免费学习笔记(深入)”;
- 典型流程:在触发淡出时,获取当前
gain值(或设为当前目标值),然后调度下降曲线至 0 - 示例:
gainNode.gain.setValueAtTime(currentGain, audioContext.currentTime);gainNode.gain.exponentialRampToValueAtTime(0.001, audioContext.currentTime + fadeDuration);gainNode.gain.setValueAtTime(0, audioContext.currentTime + fadeDuration); - 为防数值下溢,最后一步设为 0,并在
fadeDuration结束后调用source.stop()
注意事项与常见陷阱
GainNode 淡入淡出看似简单,但实际容易因时序、节点复用或参数冲突出错。
- 每个
AudioBufferSourceNode只能start()一次,重复使用需新建;淡出后不可再start() - 多个调度命令叠加时,需确保时间戳严格递增,否则会抛错或行为异常
- 若音频源来自
<audio>元素,需用MediaElementAudioSourceNode,且淡出后应同步调用audioElement.pause()和audioElement.currentTime = 0(如需重播) - 移动端 Safari 对
exponentialRampToValueAtTime支持较弱,建议降级为线性 ramp 或预设最小值(如 0.0001)避免报错



















