我正在使用 Web Audio API 来播放 MP3 文件。我不知道如何安排事件以特定的间隔发生,即使用源缓冲区时以 0.25、0.5、0.75 1 秒的间隔进行四分音符(即,不创建像某些指南建议的声音: http://middleearmedia.com/timed-rhythms-with-web-audio-api-and-javascript/ )。
我的上下文设置如下:
function setupAudioNodes() {
javascriptNode = context.createScriptProcessor(2048, 1, 1);
javascriptNode.connect(context.destination);
analyser = context.createAnalyser();
analyser.smoothingTimeConstant = 0.3;
analyser.fftSize = 32;
sourceNode = context.createBufferSource();
sourceNode.connect(analyser);
analyser.connect(javascriptNode);
sourceNode.connect(context.destination);
}
我可以使用 context.currentTime
检索当前时间,其中 context 是音频上下文,但分配回调不会定期发生。
我尝试过一些微不足道的事情,例如:
if ( context.currentTime.toFixed(2).split(".")[1] === .25 ) {
runFunc();
}
但是,这种情况并不是定期发生的。如果我打印输出,它并不总是打印出相同的时间间隔,这意味着这种方法似乎效果不佳。
我尝试过的另一种方法是使用 setInterval
,我知道由于很多原因它远非理想,但它也不起作用,并且会按照正常的间隔速度调用该函数一次(1第二)然后分解为多次调用它。
javascriptNode.onaudioprocess = function() {
var array = new Uint8Array(analyser.frequencyBinCount);
analyser.getByteFrequencyData(array);
setInterval(myFunc(array), 1000); // first time ok, after it runs many times a second
}
我的最后一个有点幼稚的方法是创建一系列可接受的值。我正在使用的应用程序不需要非常精确,所以我希望我可以监听 0.26 - 0.28 等范围。这种方法几乎可行,只是它仍然调用该函数多次,但每秒只调用几次。
if (time >= 0 && time <= 25 ) {
myFunc(array);
}
我哪里出错了?
最佳答案
您可以经常运行检查函数,例如每 10 毫秒运行一次,并检查是否超出指定时间。如果是,则运行回调并清除间隔:
var intervalId = setInterval(function() {
if (time >= 25) {
runFunc();
clearInterval(intervalId);
}
}, 10);
关于javascript - 在网络音频缓冲区中安排回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35518663/