首页 > 解决方案 > 停止振荡器时 Web Audio API 点击声音

问题描述

当使用网络音频 API 制作振荡器时,我总是在停止它时听到咔哒声。我已经搜索了周围,但没有一个解决方案对我有用。我尝试了如何在停止播放声音时避免这种“点击”声音中的所有实现?和更多

我读到的一种解决方案是等待下一个零幅度值,然后立即停止播放。有没有办法使用网络音频 api 做到这一点?

我正在考虑为我的项目切换到 Tone.Js,因为声音在没有点击的情况下播放。他们如何解决问题?

我很惊讶没有内置解决方案

标签: web-audio-apitone.js

解决方案


摆脱咔嗒声的最佳方法是淡出信号。这是一个小例子(未经测试):

let c = new AudioContext();
let s = new OscillatorNode(c);
let g = new GainNode(c);
s.connect(g).connect(c.destination);
g.gain.setValueAtTime(1, c.currentTime);
s.start();
// Let's stop the oscillator in 5 sec.
let stopTime = c.currentTime + 5;
s.stop(stopTime);
// Fade out the signal.  Fade out starts 0.25 sec before we stop.
// Then we linearly ramp down to 0 at stopTime
g.gain.setValueAtTime(1, stopTime - 0.25);
g.gain.linearRamptToValueAtTime(0, stopTime);

有不止一种方法可以淡出信号。另一种方法是:

g.gain.setTargetAtTime(0, stopTime - 0.25, .025);

这在停止时间前 0.25 秒开始淡出。您必须适当地选择 timeConstant 值以足够快地淡出但不够快以引起点击。


推荐阅读