当用户单击按钮时,会播放声音,如果再次单击它,则会播放相同声音的新实例。
我通过每次单击将新的源节点连接到音频上下文来做到这一点。现在说用户单击按钮1个小时,是否每个播放完毕的源节点都被删除或保持与音频上下文的连接?
答案 0 :(得分:1)
这里是relevant specs:
以下行为提供了AudioNode处于活动状态的条件的规范描述,这意味着它必须由实现保留在图中。在这些条件不适用的情况下,可以通过实现释放AudioNodes。
有几种参考类型:
遵循普通垃圾回收规则的普通引用。
AudioBufferSourceNodes,MediaElementAudioSourceNodes,MediaStreamAudioSourceNodes和OscillatorNodes的播放参考。这些节点在当前正在播放时会保持对自己的播放引用。
一个连接引用,如果另一个AudioNode连接到其一个或多个输入,则发生此引用。与节点的AudioParams的连接并不意味着连接引用。
一个AudioNode自己维护的尾部时间引用,只要它具有尚未发出的任何内部处理状态即可。例如,ConvolverNode的尾巴即使在接收到无声输入后仍会继续播放(想像一下在大型音乐厅中拍手,并继续听到声音在整个音乐厅中回荡)。一些AudioNodes具有此属性。请查看特定节点的详细信息。
- 只要HTMLMediaElement处于将来可能会播放音频的状态,
只要通过MediaStreamAudioSourceNode播放的基础MediaStreamTrack尚未结束(根据[mediacapture-streams]),MediaStreams都会使MediaStreamAudioSourceNode保持活动状态。
HTMLMediaElement就会使其关联的MediaElementAudioSourceNode保持活动状态。
因此,例如,由于 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