在 Web 音频缓冲区中计划回调

Scheduling callbacks in Web Audio buffers

本文关键字:计划 回调 缓冲区 Web 音频      更新时间:2023-09-26

我正在使用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检索当前时间,但分配回调不会定期发生。

我尝试了一些琐碎的事情,例如:

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);