我将Web Audio用于各种目的,并且通过URL和振荡器加载的样本可以正常工作并正常播放,而构建自定义源缓冲区则不能。我尝试使用下面的代码并通过Chrome-NetBeans调试器将我自己的AudioBuffer加载到AudioBufferSourceNode中,我可以看到它正在加载具有数据的缓冲区,并且未标记任何错误,但是调用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);
最佳答案
这会将您的噪音合成在一个回调方法中,该方法每次渲染另一个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);
关于html - 填写我自己的Web音频缓冲区不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26794845/