我正在尝试安排蜂鸣声播放3x一秒钟。但是,声音只播放一次。有关为什么会这样的任何想法? (它包含在声明上下文等的更大的javascript函数中。)
var beepBuffer;
var loadBeep = function() {
var getSound = new XMLHttpRequest(); // Load the Sound with XMLHttpRequest
getSound.open("GET", "/static/music/chime.wav", true); // Path to Audio File
getSound.responseType = "arraybuffer"; // Read as Binary Data
getSound.onload = function() {
context.decodeAudioData(getSound.response, function(buffer){
beepBuffer = buffer; // Decode the Audio Data and Store it in a Variable
});
}
getSound.send(); // Send the Request and Load the File
}
var playBeep = function() {
for (var j = 0;j<3;j++) {
var beeper = context.createBufferSource(); // Declare a New Sound
beeper.buffer = beepBuffer; // Attatch our Audio Data as it's Buffer
beeper.connect(context.destination); // Link the Sound to the Output
console.log(j);
beeper.start(j); // Play the Sound Immediately
}
};
答案 0 :(得分:0)
您的代码假定beeper.start(j)
是同步方法,即它等待声音完成播放。情况并非如此,因此您的循环可能几乎在同一时间播放所有3个实例。
一种解决方案是通过将时间参数传递给start()
方法来延迟每个实例的播放:
var numSecondsInBeep = 3;
for (var j = 0; j < 3; j++) {
var beeper = context.createBufferSource(); // Declare a New Sound
beeper.buffer = beepBuffer; // Attatch our Audio Data as it's Buffer
beeper.connect(context.destination); // Link the Sound to the Output
console.log(j);
beeper.start(context.currentTime + j * numSecondsInBeep);
}
See here了解有关play()
API的更多信息。
答案 1 :(得分:0)
关闭 - 而另一个答案的代码将起作用 - 但这不是同步性,而是你不是在询问context.current时间到开始时间。 Start()不会从“now”获取偏移 - 它需要一个绝对时间。将context.currentTime添加到start param,你应该很好。