createdelay节点本身不产生回声,需配合feedback循环连接才能实现持续回声效果;其本质是延迟信号输出,必须通过gainnode衰减后将输出连回输入构成稳定闭环,且delaytime不得为0、feedback增益建议不超过0.7。

createDelay 节点本身不产生回声,必须配合 feedback 循环连接
很多人以为 createDelay 一接上就自动有回声,其实它只是个“时间搬运工”:输入信号进来,等指定毫秒后再吐出去。要形成持续回声(比如吉他效果器那种一层层淡出的重复),你得把它的输出再连回输入(或前级节点),构成反馈环路。但直接连死循环会爆音甚至崩溃,所以中间必须插入 GainNode 控制衰减量。
- 延迟时间不能为 0 ——
delayNode.delayTime.value = 0会导致静音或不可预测行为,最小建议设为0.001(1ms) - feedback 值别超过
0.95,否则容易啸叫;0.7是较安全的起始值 - Web Audio API 不允许直接把
delayNode输出连回自身输入,必须用中间节点(如gainNode)中转
正确连接顺序:source → gain → delay → destination + loopback
典型回声链路不是线性单向的,而是带分支的闭环。关键在于把 delayNode 的输出同时送往两个地方:主输出(听得到的延迟声),以及通过 gainNode 衰减后送回延迟节点的输入(维持循环)。
const context = new (window.AudioContext || window.webkitAudioContext)(); const delayNode = context.createDelay(); const feedbackGain = context.createGain(); delayNode.delayTime.value = 0.3; // 300ms 延迟 feedbackGain.gain.value = 0.7; // 每次循环衰减 30% // 主信号流 source.connect(delayNode); delayNode.connect(context.destination); // 反馈回路(必须经 gainNode) delayNode.connect(feedbackGain); feedbackGain.connect(delayNode); // 这里形成闭环
延迟时间太短(
人耳分辨“两个声音”需要约 30–50ms 间隔。如果 delayTime.value 设成 0.005(5ms),你听到的不是清晰回声,而是原始声音和延迟声叠加产生的相位抵消/增强,表现为金属感、空洞感——这就是梳状滤波(comb filtering)。这在混音中有时用来做特殊音效,但不是你要的回声。
- 想模拟真实房间反射:用
0.03–0.1(30–100ms) - 想做明显节奏回声(如鼓点拍子):常用
0.25、0.5、1.0等整数倍秒数 - 移动端 Safari 对
delayTime动态修改支持较弱,建议初始化时设好,避免运行时频繁改值
注意 suspend/resume 生命周期,避免 iOS 上无声
iOS Safari 要求音频上下文必须由用户手势触发才能播放。如果你在页面加载后立刻创建 AudioContext 并连接节点,但没在按钮点击等事件里调用 context.resume(),整个链路会静音——即使控制台没报错,delayNode 也完全不工作。
- 永远在用户交互(如
click或touchstart)回调里调用context.resume() - 不要在
DOMContentLoaded或load事件里启动音频上下文 - 检查
context.state,如果是suspended就说明还没 resume,别急着连节点
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











