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

标签 javascript html audio

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

相关文章:

javascript - Google Apps 脚本将已完成的项目移动到另一个电子表格

javascript - 如何在 php 中设置变量并在 javascript 中使用它

html - 如何在 Bootstrap 导航栏中响应地格式化单行表

javascript - 将匿名 JS 函数作为回调传递

javascript - Div 没有正确排列

html - 更改特定页面内元素的 css

javascript - 帮助编写正则表达式,仅在 <strong> 标签不存在时用 <strong> 标签包围某些文本

ios - 如何传递数据类型为 CMTime 的浮点值?

audio - 如果我指定 'wav',则AudioSegment.from_file失败

android - 来自文件的 SoundPool.load() 和 FileDescriptor