我正在尝试构建一个实时语音调用应用程序。我的目标是使用 native JS麦克风api并通过websocket将数据发送到其他客户端。我找出以下代码:
<script>
// Globals
var aCtx;
var analyser;
var microphone;
navigator.getUserMedia_ = ( navigator.getUserMedia
|| navigator.webkitGetUserMedia
|| navigator.mozGetUserMedia
|| navigator.msGetUserMedia);
if (navigator.getUserMedia_) {
navigator.getUserMedia_({audio: true}, function(stream) {
aCtx = new webkitAudioContext();
analyser = aCtx.createAnalyser();
microphone = aCtx.createMediaStreamSource(stream);
microphone.connect(analyser);
process();
});
};
function process(){
console.log(analyser);
setInterval(function(){
FFTData = new Float32Array(analyser.frequencyBinCount);
analyser.getFloatFrequencyData(FFTData);
console.log(FFTData); // display
},10);
}
</script>
因此,每隔10毫秒,我将获得一个缓冲区并通过节点发送它。问题是我无法弄清楚如何播放缓冲区,甚至不确定是否以正确的方式获取缓冲区。我试过了:
var source = audioContext.createBufferSource();
var buffer; // the result printed in the code below
var audioBuffer = audioContext.createBuffer(1, buffer.length, 44100);
audioBuffer.getChannelData(0).set(buffer);
source.buffer = audioBuffer;
source.connect(audioContext.destination);
我是否正确设置了缓冲区?我该怎么玩?
最佳答案
要发布缓冲区的回放,您必须在start
实例上调用 AudioBufferSourceNode
method。这里的问题是:您想播放音频流,而 AudioBuffer
并非为此设计的。如果您继续创建AudioBuffer
对象,用数据填充它们并将其提供给AudioBufferSourceNode
实例,则声音中肯定会有明显的停顿。
您应该保留一个高速缓存缓冲区,在数据到达时立即填充它,并以正常速度清空它(不是立即,您必须等待足够的毫秒数的音频)。
最好的方法是使用提供的正确API:看一下http://www.w3.org/TR/webaudio/#MediaStreamAudioDestinationNode-section和http://www.w3.org/TR/webaudio/#MediaStreamAudioSourceNode-section。
关于javascript - 从缓冲区播放声音,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19894259/