1

当用户点击一个按钮时,就会播放一个声音,如果他再次点击它,就会播放一个相同声音的新实例。

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

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

4

2 回答 2

3

以下是相关规格

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

有几种类型的参考:

  1. 遵循正常垃圾收集规则的正常引用。

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

  3. 当另一个 AudioNode 连接到它的一个或多个输入时发生的连接引用。与节点的 AudioParams 的连接并不意味着连接引用。

  4. 只要 AudioNode 具有任何尚未发出的内部处理状态,它就会在其自身上维护的尾时间引用。例如,ConvolverNode 有一个尾巴,即使在接收到无声输入后它也会继续播放(想想在一个大型音乐厅里拍手并继续听到整个大厅回响的声音)。一些 AudioNodes 有这个属性。请参阅特定节点的详细信息。

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

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

因此,例如,一个AudioBufferSourceNode,因为它没有输入(3),没有尾部时间(4),所以如果你不保留,则不会链接到外部 MediaStream(5)或 MediaElement(6) js 代码中对节点的任何引用(1),并且节点已完成播放(2),然后可以将其从图中删除,然后进行垃圾收集。


另请注意,无论如何,大多数节点的指纹都很少。

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

但是,从同一个ArrayBuffer创建数千个AudioBuffers,或从同一个文件创建数千个ArrayBuffers,或者两者都不好,所以请确保在处理点击事件时,您所做的只是一个预先存在的音频缓冲区

于 2019-03-20T06:57:31.620 回答
0

如果 BufferSourceNode 仍然连接到音频上下文,则不会删除它。您可以通过使用 Firefox Web Audio 开发工具或安装 Audion Chrome 扩展来检查这一点。

您可以onended向 BufferSourceNode 添加一个函数,以便在使用后断开它。然后,只要没有其他东西引用该缓冲区源节点,它就会被垃圾收集器清理掉。

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

于 2019-03-20T04:47:55.030 回答