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、MediaElementAudioSourceNodes、MediaStreamAudioSourceNodes和OscillatorNodes的播放参考。这些节点在当前播放时维护对其自身的播放引用

  • 当另一个AudioNode连接到其一个或多个输入时发生的连接参考。连接到节点的AudioParams并不意味着连接引用

  • 一种尾部时间参考,只要音频节点具有尚未发出的任何内部处理状态,它就在自身上保持。例如,卷积节点有一条尾巴,即使在接收到无声输入后仍能继续播放(想象一下在一个大音乐厅中拍手并继续听到声音在整个大厅中回荡)。某些AudioNode具有此属性。请参阅特定节点的详细信息

  • 只要通过MediaStreamAudioSourceNode播放的底层MediaStreamTrack尚未结束(根据[mediacapture streams]),MediaStreams就会使MediaStreamAudioSourceNode保持活动状态

  • 只要HtmlMedia元素处于将来可以播放音频的状态,HtmlMedia元素就会使其关联的MediaElementAudioSourceNode保持活动状态

  • 因此,举例来说,AudioBufferSourceNode由于没有输入(3),没有尾部时间(4),因此不会链接到外部媒体流(5)或媒体元素(6),如果您在js代码(1)中没有保留对该节点的任何引用,并且该节点已完成播放(2),则可以将其从图中删除,然后进行垃圾收集


    还要注意,大多数源节点都有一个非常小的指纹

    如果我们再次以AudioBufferSourceNodes为例,那么您必须了解它们并不复制AudioBuffer,它们只是引用它。
    因此,从同一个AudioBuffer创建数千个AudioBufferSourceNodes就可以了


    但是,从同一个ArrayBuffer创建数千个AudioBuffers,或者从同一个文件创建数千个ArrayBuffers,或者两者都创建并不好,因此请确保在处理click事件时,只需创建一个新的AudioBufferSourceNode,从预先存在的音频缓冲区。

    在浏览器上点击cntrl+shift+i以显示开发工具-->网络->执行单击并观察流量---然后您就掌握了回答此问题的技能,并将您带到了其他问题的大路上。我们在连接上没有反向引用的原因就是允许对节点进行垃圾收集一旦我们处理完它们。如果不是的话,我会很惊讶。也许你应该责怪你的开发工具/扩展保留了对这些节点的引用。我现在所做的就是调用一个
    play(buffer)
    函数,创建一个带有引用的音频缓冲区的源节点,然后将其连接到上下文。如果我理解正确的话,因为源节点没有在任何地方被引用,它将被垃圾收集,因为它在代码中的任何地方都没有引用,对吗?是的,这是正确的。一旦播放完毕,创建多个音频上下文如何?这是一个坏习惯吗?我需要使用两个。是的,音频上下文几乎不与硬件链接,因此最好避免同时使用太多的内容,一些浏览器甚至对可以同时使用的上下文数量设置了限制。但是我想不出为什么你在自己的代码中需要不止一个上下文。我试图通过做一个鼓机来练习web音频API。所以我的问题是,如果用户选择了一些以前录制的曲目,然后同时播放,他仍然可以使用PAD,当他暂停这些相同的曲目时也是如此。经过一些研究,我终于想出了使用两个音频上下文的主意,一个用于pad,一个用于录制的曲目,这样我就可以通过调用
    tracksContext.suspend()
    tracksContext.resume()
    ,以及
    tracksContext.close()
    在没有播放曲目时关闭上下文来分别暂停它们。