使用Web Audio API缓冲音频

时间:2014-06-14 16:01:28

标签: javascript html5 audio websocket web-audio

我有一个来自桌面应用程序的传入实时流,通过websocket连接到我的网页。 我将PCM流转换为float 32数组。当我开始跟踪时,我听到了毛刺,所以我创建了一个bufferArray来存储流的一部分,然后再播放它。 我得到的问题是,在创建缓冲区后,我无法将任何块添加到数组中。

这里我从套接字连接接收数据并将其存储在数组中。在开始播放之前,我等待100块。

 sock.onmessage = function(e) {
        var samples = e.data;
        obj = JSON.parse(samples);

        stream = stream.concat(obj);

        if(j == 1000){
            console.log(stream);
            playPcm(stream);
        }

        console.log(j);
        j ++;
    }

此方法处理音频块

function playPcm(data){
    var audio = new Float32Array(data);
    var source = context.createBufferSource();
    var audioBuffer = context.createBuffer(1, audio.length, 44100);

    audioBuffer.getChannelData(0).set(audio);
    // console.log(audioBuffer);

    source.buffer = audioBuffer;


    source.connect(context.destination);

    source.start(AudioStart);
    AudioStart += audioBuffer.duration;
}

我读到了scriptProcessorNode,但无法弄清楚如何处理它。现在我几乎陷入困境,因为我对Web Audio API不是很熟悉。

1 个答案:

答案 0 :(得分:3)

请勿尝试继续编辑相同的缓冲区 - 您将无法修改播放缓冲区(它有时会在Chrome中运行,但这是一个错误)。您应该将第一组块缓冲到一个缓冲区中,就像现在一样,以获得一些延迟空间,然后当有额外的块进入时,您应该将它们安排为单独的AudioBuffer / BufferSourceNode组合。 (即跟踪您开始播放第一个节目的时间和运行计数,并安排每个连续节点在最后一个节点结束时播放。)