使用Web Audio API缓冲音频

5

我在网页上通过websocket连接接收来自桌面应用程序的实时流。我将PCM流转换为float 32数组。当我开始播放轨迹时,我听到了卡顿声,所以我创建了bufferArray来存储部分流,在播放它之前。

我遇到的问题是,在创建缓冲区之后,无法向数组中添加任何块。

在这里,我从socket连接接收数据并将其存储在数组中。我等待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个回答

4
不要试图保持编辑同一个缓冲区 - 您将无法修改正在播放的缓冲区(在Chrome中有时会起作用,但那是一个错误)。您应该将第一组块缓存到一个缓冲区中,以获得一些延迟空间,然后当其他块到达时,应将它们调度为单独的AudioBuffer/BufferSourceNode组合。(即跟踪您开始播放第一个节点的时间和运行计数,并安排每个连续节点在上一个节点结尾处播放。)

2
你有来自套接字的mp3数据块的示例吗? - Keyne Viana

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接