网络音频API在播放完毕后会清除源节点吗?

时间:2019-03-17 14:05:44

标签: javascript audio audiocontext audio-source

当用户单击按钮时,会播放声音,如果再次单击它,则会播放相同声音的新实例。

我通过每次单击将新的源节点连接到音频上下文来做到这一点。

现在说用户单击按钮1个小时,是否每个播放完毕的源节点都被删除或保持与音频上下文的连接?

2 个答案:

答案 0 :(得分:1)

这里是relevant specs

  

以下行为提供了AudioNode处于活动状态的条件的规范描述,这意味着它必须由实现保留在图中。在这些条件不适用的情况下,可以通过实现释放AudioNodes。

     

有几种参考类型:

     
      
  1. 遵循普通垃圾回收规则的普通引用。

  2.   
  3. AudioBufferSourceNodes,MediaElementAudioSourceNodes,MediaStreamAudioSourceNodes和OscillatorNodes的播放参考。这些节点在当前正在播放时会保持对自己的播放引用。

  4.   
  5. 一个连接引用,如果另一个AudioNode连接到其一个或多个输入,则发生此引用。与节点的AudioParams的连接并不意味着连接引用。

  6.   
  7. 一个AudioNode自己维护的尾部时间引用,只要它具有尚未发出的任何内部处理状态即可。例如,ConvolverNode的尾巴即使在接收到无声输入后仍会继续播放(想像一下在大型音乐厅中拍手,并继续听到声音在整个音乐厅中回荡)。一些AudioNodes具有此属性。请查看特定节点的详细信息。

  8.   
  9. 只要通过MediaStreamAudioSourceNode播放的基础MediaStreamTrack尚未结束(根据[mediacapture-streams]),MediaStreams都会使MediaStreamAudioSourceNode保持活动状态。

  10.   只要HTMLMediaElement处于将来可能会播放音频的状态,
  11. HTMLMediaElement就会使其关联的MediaElementAudioSourceNode保持活动状态。

  12.   

因此,例如,由于 AudioBufferSourceNode 没有输入(3),所以没有 tail-time (4)没有链接到外部MediaStream(5)或MediaElement(6),如果您未在js代码(1)中保留对该节点的任何引用,并且该节点已经完成播放(2),则可以将其从图形中删除,然后收集垃圾。


还请注意,大多数 source 节点的指纹都很少。

如果我们再次以 AudioBufferSourceNodes 为例,那么您必须了解它们没有复制 AudioBuffer ,它们只是引用了它。
因此,从相同的 AudioBuffer 创建数千个 AudioBufferSourceNodes 很好。

但是从同一个 ArrayBuffer 创建数千个 AudioBuffers ,或从同一文件创建数千个 ArrayBuffers ,或者两者都不是很好,因此请确保在处理click事件时,您要做的就是从现有的 AudioBuffer 创建一个新的 AudioBufferSourceNode

答案 1 :(得分:0)

如果BufferSourceNode仍连接到音频上下文,则不会删除它。您可以使用Firefox Web Audio开发工具或安装Audion Chrome扩展程序进行检查。

您可以在BufferSourceNode使用后添加一个onended函数以断开连接。然后,只要没有其他引用该缓冲区源节点的内容,垃圾收集器就会对其进行清理。

来源:https://developer.mozilla.org/en-US/docs/Web/API/AudioScheduledSourceNode/onended