首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Web Audio API:为什么只能启动一次源?

Web Audio API:为什么只能启动一次源?
EN

Stack Overflow用户
提问于 2020-03-23 05:35:53
回答 2查看 97关注 0票数 0

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

代码语言:javascript
运行
复制
ctx = new AudioContext();
src = ctx.createOscillator();
src.frequency = 261.63; //Play middle C
src.connect(ctx.destination);
src.start();

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

代码语言:javascript
运行
复制
src.stop();

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

代码语言:javascript
运行
复制
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做这样的事情有什么重要的原因吗?或者,有没有更干净的方法来重新启动音频源?

EN

回答 2

Stack Overflow用户

发布于 2020-03-27 22:18:15

这正是web音频api的工作方式。声音生成器节点,如振荡器节点和音频缓冲源节点,只需使用一次。每次您想要播放您的振荡器,您必须创建它并设置它,就像您所说的。我知道这看起来很麻烦,但是你可以把它抽象成一个play()方法来为你处理这些细节,这样你就不必在每次玩振荡器的时候都去想它了。此外,不要担心创建这么多节点对性能的影响。web音频api就是这样使用的。

如果您只想在internet上制作音乐,而对学习web audio api的细节不感兴趣,那么您可能会对使用我编写的一个库感兴趣,该库使事情变得更简单:https://github.com/rserota/wad

票数 0
EN

Stack Overflow用户

发布于 2020-06-02 21:53:55

我正在研究一个12声道复调合成器与2 Osc每声音。

我现在不会停止Osc,我会断开Osc的连接,你可以通过setTimeout来做到这一点。从amp Enveloop中选择最长的释放阶段(第1个,共2个),减去AudioContext.currentTime(),乘以1000 (setTimeout适用于milisecs,网络音频适用于秒)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60805252

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档