填写我自己的Web音频缓冲区不起作用

时间:2014-11-07 05:42:53

标签: html audio web

我正在将Web Audio用于各种目的,并且通过URL和振荡器加载的样本正常工作并正常播放时,构建自定义源缓冲区则不然。我尝试使用下面的代码将自己的AudioBuffer加载到AudioBufferSourceNode中,并通过Chrome-NetBeans调试器,我可以看到它正在加载带有数据的缓冲区,并且没有标记错误,但是当调用start时,不会产生任何声音。请注意,我只是在缓冲区填充噪声,但我打算用自己的自定义波形数据填充它。我意识到我可能正在使用错误的数据类型填充缓冲区,但我无法找到有关正确方法的任何文档或示例。任何帮助将不胜感激。

var audioContext = new (window.AudioContext || window.webkitAudioContext)();
var frameCount = 2000;
var sampleRate = 4000;
var myBuffer = audioContext.createBuffer(2, frameCount, sampleRate);

// FILL WITH WHITE NOISE
for (var i = 0; i < frameCount; i++) {
    myBuffer[i] = Math.random() * 2 - 1;
}
sourceNode = audioContext.createBufferSource();
sourceNode.buffer = myBuffer;
sourceNode.connect(audioContext.destination);
sourceNode.start(0);

1 个答案:

答案 0 :(得分:0)

这将合成你在回调方法中的噪音,每当你渲染了另一个BUFF_SIZE个样本数时,就会调用它。

var BUFF_SIZE = 2048; // spec allows, yet do not go below 1024 
var audio_context = new AudioContext();
var gain_node = audio_context.createGain();
gain_node.connect( audio_context.destination );
var source_node = audio_context.createScriptProcessor(BUFF_SIZE, 1, 1);

source_node.onaudioprocess = (function() {

    return function(event) {

        var synth_buff = event.outputBuffer.getChannelData(0); // mono for now

        // FILL WITH WHITE NOISE
        for (var i = 0, buff_size = synth_buff.length; i < buff_size; i++) {
            synth_buff[i] = Math.random() * 2 - 1;
        }
    };
}());

source_node.connect(gain_node);