4

我喜欢网络音频 API。可能性非常大。话虽如此,它仍处于早期阶段。最让我担心的是,我不知道如何释放不再需要的缓冲区/声音。因为我将混合来自通过 websocket 连接的音乐家 / DJ / 主持人的现场声音,所以声音缓冲区总是带有新的声音。

以下代码模拟连续加载新缓冲区的播放。我需要网络音频 api 来添加效果混合,这样每个人都可以通过他的表演听到现场结果。

不幸的是,这段代码吃掉了整个内存并导致移动和桌面 safari 崩溃。我不知道在播放这些大缓冲区后如何释放它们,我不再需要它们。我真的需要在内存中加载新的大数据。有人知道吗?否则我会卡在播放的前 8 个文件无法再加载。

var context = new webkitAudioContext();
var total=0;

function onTouchStart(){
    setInterval(function(){
    total+=10;
    source = context.createBufferSource();    
    source.connect(context.destination); // simulates loading large file
    source.buffer=context.createBuffer(1, 10*1024*1024, context.sampleRate);
    source.noteOn(0);
    source.noteOff(0); // acording to w3c spec resources should be deleted immediately.
    // making source property and call delete or =null will release nether source or buffer i am desperate.
    console.log(total,'mb'); //
    },1000);
}

document.addEventListener( "touchstart", onTouchStart );
document.addEventListener( "click", onTouchStart );
4

1 回答 1

2

JavaScript 中的内存管理使用垃圾收集,这使得术语“立即”相对。直到 webkit 认为是时候释放缓冲区才真正释放。您可以通过在 Chrome 开发人员工具中进行时间线记录来查看此操作(但不确定在 Safari 中是否有任何方法可以这样做)。查看这篇文章以了解如何做到这一点:https ://developers.google.com/chrome-developer-tools/docs/timeline

此外,由于您将事件侦听器附加到文档,每次点击设备时都会开始另一轮间隔,因此如果您碰巧触摸它两次,您将创建双倍数量的缓冲区,即表示每秒 20mb。

话虽如此,您在实际播放真实文件时是否尝试过?您可能不会遇到这个问题,因为垃圾收集器将能够在文件播放时跟上。10mb 大的 mp3 或 ogg 是几分钟的音频。

希望有帮助!

于 2013-01-11T18:14:22.083 回答