播放以16 kHz采样的PCM流

时间:2015-06-12 15:35:06

标签: websocket web-audio pcm

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

我使用以下代码获得此代码:audio File sample

使用Audacity,我可以想象这一点,我看到我的音频通量之间的常规切割:

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

});

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

1 个答案:

答案 0 :(得分:1)

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

你应该在这里做的是,使用网络提供一小部分缓冲区,然后像往常一样播放缓冲区,但是从缓冲区队列中,要特别注意安排它们(使用第一个在适当的时间,start的{​​{1}}方法的参数,以便前一个缓冲区的结尾正好是下一个缓冲区的开始。您可以使用AudioBufferSourceNode参数来实现此目的(AudioBuffer.duration以秒为单位)。