2016-02-20 81 views
1

我正在使用Web音频API播放MP3文件。我不知道如何使用源缓冲区(即不创建像某些指南所建议的声音:http://middleearmedia.com/timed-rhythms-with-web-audio-api-and-javascript/)以特定时间间隔(即0.25,0.5,0.75 1秒间隔)为季度音符安排事件。计划Web音频缓冲区中的回调

我的背景是设置如下所示:

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

我哪里错了?

回答

0

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

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

一种修改我发现,使人们更准确的在增加的间隔期至1000,但是随后将在值的范围来检查的时间。当需要快速连续调用函数时,我需要找到一种方法来防止罕见但非常可能的时间。 – user3162553