在Web Audio缓冲区中调度回调

时间:2016-02-20 03:11:56

标签: javascript html5 audio

我正在使用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);
}  

我哪里错了?

1 个答案:

答案 0 :(得分:0)

您可以经常运行检查功能,例如每10ms检查一次,并检查是否超过了指定的时间。如果是,请运行回调并清除间隔:

var intervalId = setInterval(function() {
  if (time >= 25) {
    runFunc();
    clearInterval(intervalId);
  }
}, 10);