我通过套接字获得输入帧流,它是以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)的采样率不同,你怎么看?
答案 0 :(得分:1)
这不是采样率问题,因为AudioBufferSourceNode
在播放时会将音频重新采样为AudioContext
的速率。
你应该在这里做的是,使用网络提供一小部分缓冲区,然后像往常一样播放缓冲区,但是从缓冲区队列中,要特别注意安排它们(使用第一个在适当的时间,start
的{{1}}方法的参数,以便前一个缓冲区的结尾正好是下一个缓冲区的开始。您可以使用AudioBufferSourceNode
参数来实现此目的(AudioBuffer.duration
以秒为单位)。