我正在使用OfflineAudioContext将WebAudio信号渲染到缓冲区中,以便我可以分析结果。当我反复执行此操作时,似乎从未释放关联的内存,最终导致浏览器选项卡崩溃。
这里是最小复制品:
number = 6
if number > 5 and < 9:
print “Yes”
else:
print “No”
在JS控制台中运行该缓冲区将呈现约100MB的缓冲区,该缓冲区永远不会释放。反复运行它将消耗内存,直到选项卡最终崩溃(在Mac chrome / mozilla,Windows chrome / mozilla / edge中测试)。
如何让浏览器释放与// render 10 minutes of audio into a big buffer
var ctx = new OfflineAudioContext(1, 44100 * 600, 44100)
var osc = ctx.createOscillator()
osc.start()
ctx.startRendering().then(buffer => {
// attempt to clean up
osc.stop()
osc = null
buffer = null
ctx = null
})
相关的内存?
答案 0 :(得分:1)
这是confirmed as a bug,没有解决方法。在修复之前,这似乎是生活中的事实。
答案 1 :(得分:0)
这是一个令人头疼的大问题,但是我终于找到了一种解决方法:创建一个iframe
,在其中运行音频渲染代码,使用postMessage
将结果返回到主窗口,然后立即删除收到结果后,来自DOM的iframe
。这样会清除与其相关的所有资源,包括offlineAudioContext
。
当然,只有在您的用例是执行相对少量的相对较长的渲染时,这才是实际的。
请注意,要高效传输数据,您应该发送ArrayBuffer
个对象,它们是Transferable
:
context.oncomplete = function (e) {
var channels = [];
for (var c = 0; c < e.renderedBuffer.numberOfChannels; c++) {
channels.push(e.renderedBuffer.getChannelData(c));
}
channels = channels.map( function(c) {return c.buffer;} );
window.parent.postMessage({
action:'renderResult',
data: channels
}, "*", channels);
}
并在接收端从它们重新创建Float32Arrays。