【发布时间】:2016-02-20 03:11:56
【问题描述】:
我正在使用 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);
}
我哪里错了?
【问题讨论】:
标签: javascript html audio