播放以 16 kHz 采样的 PCM 流

Play a PCM stream sampled at 16 kHz

我通过套接字获得了一个输入帧流,它是一个以 16 kHz 采样的单声道 32 位 IEEE 浮点 PCM 流。

我用下面的代码得到这个:audio File sample

借助 Audacity,我可以将其可视化,并且我看到我的音频通量之间有规律的切割:

var audioCtx = new(window.AudioContext || window.webkitAudioContext)();
var audioBuffer = audioCtx.createBuffer(1, 256, 16000);
var BufferfloatArray;
var source = audioCtx.createBufferSource();
source.buffer = audioBuffer;
var gainNode = audioCtx.createGain();
gainNode.gain.value = 0.1;
gainNode.connect(audioCtx.destination);
source.connect(gainNode);
source.start(0);

socket.on('audioFrame', function(raw) {

        var context = audioCtx;

        BufferfloatArray = new Float32Array(raw);

        var src = context.createBufferSource();
        audioBuffer.getChannelData(0).set(BufferfloatArray);
        src.buffer = audioBuffer;
        src.connect(gainNode);
        src.start(0);

});

我认为这是因为我的原始缓冲区的采样率 (16000) 与我的音频上下文的采样率 (44100) 不同,你怎么看?

这不是采样率问题,因为 AudioBufferSourceNode 在播放时将音频重新采样到 AudioContext 的速率。

您在这里应该做的是使用网络提供一个小的缓冲区队列,然后像您一样正常播放缓冲区,但是从缓冲区队列中,要格外小心地安排它们(使用AudioBufferSourceNode) 的 start 方法的第一个参数在正确的时间,以便前一个缓冲区的结尾恰好是下一个缓冲区的开始。您可以使用 AudioBuffer.duration 参数来实现此目的(duration 以秒为单位)。