当前位置: 首页 > 知识库问答 >
问题:

停止振荡器时的Web音频API单击声音

郭永怡
2023-03-14

当使用web audio API制作振荡器时,我总是听到当停止它时的咔嗒声。我四处寻找,但没有一个解决办法对我有效。我尝试了所有的实现从我如何避免这种‘咔哒’声音时,我停止播放一个声音?和更多

我读到一个解决方案是等待下一个零振幅值,然后立即停止播放。有没有一种方法可以使用web audio API做到这一点?

我正在考虑为我的项目切换到Tone.js,因为声音不需要点击就可以播放。他们是如何解决问题的?

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

共有1个答案

卓学智
2023-03-14

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

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秒开始淡出。您必须适当地选择TimeContant值,以使淡出的速度足够快,但不能快到引起单击。

 类似资料:
  • 在执行此代码时,我会得到这样的错误:“Uncattle TypeError:Failed to execute'linear ramptoValueAtTime'on'AudioParam':The provided double value is non-finite”。 &如果替换ac.endTime只是endTime-“endTime未定义”,则发生错误。也许有人能解释为什么会这样?谢谢

  • 在下面的代码中,我希望在每次按下按钮元素时创建一个分配给o的新振荡器节点,允许多次按下,从而在440处产生多个1秒音调。然而,我发现这个按钮只能按一次以产生一个音调,之后它就会消失,就好像我没有创建新的振荡器节点一样。我正在学习JavaScript,我怀疑它一定是一些微不足道的东西。有人有主意吗? 编辑: 刚找到这个问题解决了这个问题。解决方案是将audio_context.currentTime

  • 这里有一个超级简单的例子,我正在尝试在Chrome的iphone上运行。其他的web音频API示例,比如这个http://alxgbsn.co.uk/wavepad/work,但不包括我的:( 知道怎么了吗? 编辑 总结一下答案: 启动音频以响应用户交互 检查静音开关是否关闭

  • 我正在尝试添加AnalyserNode并将输出声音可视化到我制作的web音频示例中,但我不知道如何实现。我想我没有将正确的源传递给分析器(?) 完整代码如下:https://jsfidle.net/kepin95043/1ub0sjo3/ 谁能帮我找出我做错了什么?提前感谢! PS:用火狐打开吧。对我来说在基于Chromium的浏览器上不起作用。 下面是一个工作示例:https://codepen

  • 在使用Opera44.0时,我正在摆弄音频API,并尝试了一个简单的示例: 它按预期工作,声音播放2秒,然后停止。 然后我试着往上走一点,当一个按钮被点击时播放一个声音: 不管用.单击按钮时调用函数(我在函数中使用进行了检查),但不播放任何声音。我尝试刷新页面,重新启动浏览器..什么都没有。 经过一些研究,我发现当调用时,振荡器会被丢弃,因此每次都必须创建一个新的振荡器。我发现的几乎所有示例都围绕

  • 我正在尝试用js制作一架简单的钢琴,但我不想使用音频样本,而是想以编程方式生成声音。要播放单个声音,我正在使用此博客中的此代码 https://marcgg.com/blog/2016/11/01/javascript-audio/ 我发现在玩了大约50次之后,这种方法停止工作。运行此代码时不播放声音, 不会更改并保持 0。如何在不停止播放声音的情况下修复它?