更高效的decodeAudioData()?

时间:2015-11-24 11:56:54

标签: javascript google-chrome audio web-audio

我正在使用网络音频api将n声道音频文件解码为单独的声道,然后渲染到画布以直观地创建频率计。

我正在使用decodeAudioData解码字节数组缓冲区,然后在单独的函数中分配给音频缓冲区源节点。

 // load the specified sound
function loadSound(url) {
    var request = new XMLHttpRequest();
    request.open('GET', url, true);
    request.responseType = 'arraybuffer';

    // When loaded decode the data
    request.onload = function () {

        // decode the data
        context.decodeAudioData(request.response, function (buffer) {
            // when the audio is decoded play the sound
            holdingBuffer = buffer;
            setupSound(buffer);
        }, onError);
    }
    request.send();
}

我遇到的问题是,当我尝试解码大约60mb +的音频时,由于内存空间不足,浏览器会崩溃.decodeAudioData函数非常耗费内存!

我想知道是否有人有更高效的解码大型音频文件的经验?

1 个答案:

答案 0 :(得分:4)

问题是解码音频占用的内存量。仅仅为了举例,我假设您的60MB音频文件是MP3。

这显然取决于比特率,但让我们说你的速度是128kbps - 这是相当典型的。这意味着你要加载一小时左右的立体声音频。

但Web Audio API解码为32位,通常为44.1或48kHz(这取决于您的声卡,我记得)。

无论如何,让我们说48位的32位。

这意味着每个通道的速率为每秒32 * 48000位。这是每分钟32 * 48000 * 60位,整个小时32 * 48000 * 60 * 60位。当然,我们乘以2,因为我们假设立体声。

这意味着11059200000总音频数据位 - 这是一个需要加载到内存中的1.3824GB音频缓冲区。所以,基本上 - 这是一大堆记忆。

这里真的没有简单的答案。您可以尝试在服务器上生成波形/光谱仪/任何内容。或者您可以尝试以块的形式加载音频文件,以便您可以单独处理它们(串行)并让垃圾收集。

可能还有其他解决方案,但这些是我们立刻想到的两个解决方案。