我正在使用Web Audio API播放MP3文件。我不知道如何安排事件以特定的间隔发生,即使用源缓冲区时四分音符的间隔为0.25,0.5,0.75 1秒(即,不像某些指南那样创建声音:{{3 }})。
我的上下文设置如下:
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
来检索当前时间,其中上下文是音频上下文,但是定期回调并不会定期发生。
我尝试了一些微不足道的事情,例如:
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);
}
我哪里错了?
答案 0 :(得分:0)
您可以经常运行检查功能,例如每10ms检查一次,并检查是否超过了指定的时间。如果是,请运行回调并清除间隔:
var intervalId = setInterval(function() {
if (time >= 25) {
runFunc();
clearInterval(intervalId);
}
}, 10);