【问题标题】:How to release buffers in Web Audio Api?如何在 Web Audio Api 中释放缓冲区?
【发布时间】:2021-01-25 18:50:32
【问题描述】:

我喜欢网络音频 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 );

【问题讨论】:

    标签: html webkit web-audio-api


    【解决方案1】:

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

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

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

    希望有帮助!

    【讨论】:

    • 是的,对象的生命周期至关重要——尤其是“源”对象及其 .buffer。如果它受到严格限制,Javascript GC 应该为您清理。在现实世界中,不确定您是否会快速使用/释放这么多 10Mb 缓冲区?
    • 问题是我将通过 websockets 混合来自多个音乐家/人类扬声器的实时音频数据。所以是的,我需要能够快速释放不再需要的旧大数据,因为 ipad2 中的内存例如只适合 8x10m 文件,而且我被它们困住了,无法摆脱它们来加载新文件。我很绝望:(
    猜你喜欢
    • 1970-01-01
    • 2013-10-16
    • 2018-01-25
    • 2016-04-26
    • 2015-08-30
    • 2018-01-20
    • 2015-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多