【问题标题】:Playing sound from buffer从缓冲区播放声音
【发布时间】:2013-11-22 12:58:49
【问题描述】:

我正在尝试构建一个实时语音通话应用程序。我的目标是使用原生 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);

我得到的缓冲区正确吗?怎么玩?

【问题讨论】:

    标签: javascript html api buffer microphone


    【解决方案1】:

    要播放缓冲区,您必须在您的 AudioBufferSourceNode 实例上调用 start method。这里的问题是:您想要播放音频流,而 AudioBuffer 不是为此而设计的。如果您继续创建AudioBuffer 对象,用数据填充它们并将它们提供给您的AudioBufferSourceNode 实例,那么声音中肯定会出现明显的停顿。

    您应该保留一个缓存缓冲区,在数据到达后立即填充并以正常速度清空(不是立即,您必须等待其中有足够毫秒的音频)。

    最好的方法是使用提供的适当 API:查看 http://www.w3.org/TR/webaudio/#MediaStreamAudioDestinationNode-sectionhttp://www.w3.org/TR/webaudio/#MediaStreamAudioSourceNode-section

    【讨论】:

    • 你能提供一个简单的代码吗?我不是很了解这种情况,所以我慢慢了解。谢谢。
    • 还有我如何将 float32array 转换为 AudioBuffer 来播放它?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-31
    • 1970-01-01
    • 2017-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多