使用 Web Audio API 缓冲音频

boo*_*ans 5 html javascript audio websocket web-audio-api

我有一个来自桌面应用程序的传入实时流,通过 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 ++;
    }
Run Code Online (Sandbox Code Playgroud)

该方法处理音频块

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;
}
Run Code Online (Sandbox Code Playgroud)

我读到了有关 的内容scriptProcessorNode,但不知道如何处理它。现在我几乎陷入困境,因为我对 Web Audio API 不太熟悉。

cwi*_*lso 4

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

  • 您有来自套接字的 mp3 数据块的示例吗? (2认同)