【问题标题】:Web Audio API: Why can you only start sources once?Web Audio API:为什么只能启动一次源?
【发布时间】:2020-03-22 21:35:53
【问题描述】:

假设您使用 Web Audio API 播放纯音:

ctx = new AudioContext();
src = ctx.createOscillator();
src.frequency = 261.63; //Play middle C
src.connect(ctx.destination);
src.start();

但是,稍后您决定要停止声音:

src.stop();

从现在开始,src 完全没用了;如果你尝试重新启动它,你会得到:

src.start()
VM564:1 Uncaught DOMException: Failed to execute 'start' on 'AudioScheduledSourceNode': cannot call start more than once.
    at <anonymous>:1:5

如果您正在制作一个小型在线键盘,那么您会不断地打开和关闭音符。从音频节点图中删除旧对象,创建一个全新的对象,然后connect() 将其放入图中,(然后稍后丢弃该对象)似乎真的很笨重,而只打开和关闭它会更简单需要时。

Web Audio API 做这样的事情有什么重要原因吗?或者有什么更简洁的方法可以重新启动音频源?

【问题讨论】:

标签: javascript web audio


【解决方案1】:

这正是网络音频 api 的工作方式。诸如振荡器节点和音频缓冲源节点之类的声音发生器节点旨在一次性使用。每次你想播放你的振荡器时,你都必须创建它并设置它,就像你说的那样。我知道这看起来很麻烦,但是您可以将其抽象为 play() 方法来为您处理这些细节,这样您就不必在每次播放振荡器时都考虑它。另外,不要担心创建这么多节点对性能的影响。网络音频 api 旨在以这种方式使用。

如果您只想在互联网上制作音乐,并且对学习网络音频 api 的来龙去脉不感兴趣,那么您可能有兴趣使用我编写的一个库,它可以让这样的事情变得更容易: https://github.com/rserota/wad

【讨论】:

    【解决方案2】:

    我正在开发一个 12 复音合成器,每个复音有 2 个振荡器。

    我现在从不停止 Osc。我断开了Osc的。您可以通过setTimeout 做到这一点。 For the Time 从 amp Enveloop 中为这套 Osc 选择最长的释放阶段(1 of 2)。减去AudioContext.currentTime(),乘以 1000(setTimeout 适用于毫秒,网络音频适用于秒。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-31
      相关资源
      最近更新 更多