Javascript web音频api是否在播放结束后清除源节点?
当用户单击按钮时,会播放一个声音,如果他再次单击按钮,则会播放该声音的新实例 我通过在每次单击时将一个新的源节点连接到音频上下文来实现这一点Javascript web音频api是否在播放结束后清除源节点?,javascript,audio,audiocontext,audio-source,Javascript,Audio,Audiocontext,Audio Source,当用户单击按钮时,会播放一个声音,如果他再次单击按钮,则会播放该声音的新实例 我通过在每次单击时将一个新的源节点连接到音频上下文来实现这一点 现在假设用户单击该按钮1小时,是否每个已完成播放的源节点都会被删除或保持与音频上下文的连接 如果BufferSourceNode仍连接到音频上下文,则不会删除它。您可以使用Firefox Web音频开发工具或安装Audion Chrome扩展来检查这一点 您可以向BufferSourceNode添加一个onended函数,以便在使用后断开连接。然后,只要没
现在假设用户单击该按钮1小时,是否每个已完成播放的源节点都会被删除或保持与音频上下文的连接 如果BufferSourceNode仍连接到音频上下文,则不会删除它。您可以使用Firefox Web音频开发工具或安装Audion Chrome扩展来检查这一点 您可以向BufferSourceNode添加一个
onended
函数,以便在使用后断开连接。然后,只要没有其他东西引用该缓冲区源节点,它就会被垃圾收集器清除
资料来源:以下是:
以下行为提供了AudioNode活动状态的规范性描述,这意味着必须通过实现将其保留在图形中。在这些条件不适用的情况下,AudioNode可以由实现来释放
有几种类型的参考:
还要注意,大多数源节点都有一个非常小的指纹 如果我们再次以AudioBufferSourceNodes为例,那么您必须了解它们并不复制AudioBuffer,它们只是引用它。
因此,从同一个AudioBuffer创建数千个AudioBufferSourceNodes就可以了
但是,从同一个ArrayBuffer创建数千个AudioBuffers,或者从同一个文件创建数千个ArrayBuffers,或者两者都创建并不好,因此请确保在处理click事件时,只需创建一个新的AudioBufferSourceNode,从预先存在的音频缓冲区。在浏览器上点击cntrl+shift+i以显示开发工具-->网络->执行单击并观察流量---然后您就掌握了回答此问题的技能,并将您带到了其他问题的大路上。我们在连接上没有反向引用的原因就是允许对节点进行垃圾收集一旦我们处理完它们。如果不是的话,我会很惊讶。也许你应该责怪你的开发工具/扩展保留了对这些节点的引用。我现在所做的就是调用一个
play(buffer)
函数,创建一个带有引用的音频缓冲区的源节点,然后将其连接到上下文。如果我理解正确的话,因为源节点没有在任何地方被引用,它将被垃圾收集,因为它在代码中的任何地方都没有引用,对吗?是的,这是正确的。一旦播放完毕,创建多个音频上下文如何?这是一个坏习惯吗?我需要使用两个。是的,音频上下文几乎不与硬件链接,因此最好避免同时使用太多的内容,一些浏览器甚至对可以同时使用的上下文数量设置了限制。但是我想不出为什么你在自己的代码中需要不止一个上下文。我试图通过做一个鼓机来练习web音频API。所以我的问题是,如果用户选择了一些以前录制的曲目,然后同时播放,他仍然可以使用PAD,当他暂停这些相同的曲目时也是如此。经过一些研究,我终于想出了使用两个音频上下文的主意,一个用于pad,一个用于录制的曲目,这样我就可以通过调用tracksContext.suspend()
和tracksContext.resume()
,以及tracksContext.close()
在没有播放曲目时关闭上下文来分别暂停它们。