如何在Web Audio Api中释放缓冲区?

时间:2013-01-11 14:26:33

标签: html5 webkit web-audio

大家好我喜欢Web Audio Api。可能性太棒了。据说它还处于早期阶段。最让我担心的是我不知道如何释放我不再需要的缓冲区/声音。声音缓冲,总是新的声音,因为我将混音 音乐家/ DJ /主持人通过websockets连接的现场声音

以下代码模拟连续加载新缓冲区的回放。我需要web audio api来添加效果混合,所以每个人都可以通过他的表现听到实时结果

不幸的是,这段代码吞噬了整个ram并崩溃了移动和桌面游戏。我不知道如何在播放后释放那些大缓冲区,我不再需要它们。我真的需要在内存中加载新的大数据。有谁有想法?否则我会遇到前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 );

1 个答案:

答案 0 :(得分:1)

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

此外,由于您将事件监听器附加到文档,因此每次点击设备时都会开始另一轮间隔,因此,如果您碰巧碰了两次,那么您将创建双倍数量的缓冲区,这意味着每秒20mb。

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

希望有所帮助!