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

为什么js振荡器在使用后会停止播放声音?

师曦
2023-03-14

我正在尝试用js制作一架简单的钢琴,但我不想使用音频样本,而是想以编程方式生成声音。要播放单个声音,我正在使用此博客中的此代码 https://marcgg.com/blog/2016/11/01/javascript-audio/

var context = new AudioContext()
var o = context.createOscillator()
var  g = context.createGain()
o.connect(g)
g.connect(context.destination)
o.start(0)
g.gain.exponentialRampToValueAtTime(0.00001, context.currentTime + 5)

我发现在玩了大约50次之后,这种方法停止工作。运行此代码时不播放声音,context.currentTime 不会更改并保持 0。如何在不停止播放声音的情况下修复它?

共有1个答案

姜楷
2023-03-14

不要为每个音符创建一个新的AudioContext;创建一个并将其用于所有音符。这不仅可以节省资源;如果你决定要这样做,它还有助于在精确的时间播放多个音符。

您还在积累仍在播放的振荡器,只是非常安静。您需要在某个时候停止它们。好消息是,Web Audio API旨在使执行此操作变得容易:

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

  • 当使用web audio API制作振荡器时,我总是听到当停止它时的咔嗒声。我四处寻找,但没有一个解决办法对我有效。我尝试了所有的实现从我如何避免这种‘咔哒’声音时,我停止播放一个声音?和更多 我读到一个解决方案是等待下一个零振幅值,然后立即停止播放。有没有一种方法可以使用web audio API做到这一点? 我正在考虑为我的项目切换到Tone.js,因为声音不需要点击就可以播放。他们是如何解决

  • 如何在曲目播放期间添加CSS类“playSound”?

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

  • 在我的手机和模拟器上,这似乎发生了15次中的1次。音响池将播放声音约3秒,然后停止。当我播放声音时,我反复得到这个消息,我理解这只是意味着不能使用低延迟模式。当声音停止时,不再产生这些警告。 我同时播放了很多片段,所以我明白这可能是一个问题,但我没有注意到播放的片段数量和这个错误之间的关系。然而,我读到和体验到的是,如果我试图播放太多的片段,声音池会开始跳过它们,但它不会一起停止。因此,我想知道这

  • 当类初始化时,我试图播放铃声,并使用滑块按钮关闭。播放器在初始化时成功创建,但由于某些原因,由于以下错误,无法使用滑块按钮关闭它。 E/flutter(6529):[ERROR: flutter/lib/ui/ui_dart_state.cc(166)]未处理的异常:缺少插件异常(未找到实现方法hasVibrator对通道振动)E/flutter(6529):#0方法通道。_invokeMetho