Play a PCM stream sampled at 16 kHz

1k views Asked by At

I get a input frame stream through a socket, it is a mono 32-bit IEEE floating point PCM stream sampled at 16 kHz.

I get this with the following code : audio File sample

With Audacity i can visualize this and i see a regular cuts between my audio flux:

Pict of audio File

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);

});

I think it is because of the sample rate of my raw buffer (16000) is different of the sample rate of my Audio context (44100), what do you think ?

1

There are 1 answers

1
padenot On BEST ANSWER

This is not a sample rate problem, because the AudioBufferSourceNode resamples the audio to the AudioContext's rate when playing.

What you should do here, is to have a little queue of buffers you feed using the network, and then, play your buffers normally like you do, but from the buffer queue, taking extra care to schedule them (using the first parameter of the start method of the AudioBufferSourceNode) at the right time, so that the end of the previous buffer is exactly the start of the next one. You can use the AudioBuffer.duration parameter to achieve this (duration is in seconds).