gpt4 book ai didi

javascript - 在网络音频缓冲区中安排回调

转载 作者:行者123 更新时间:2023-11-28 06:21:08 24 4
gpt4 key购买 nike

我正在使用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com