Javascript ScriptProcessorNode跳过

Javascript ScriptProcessorNode跳过,javascript,audio,web-audio-api,Javascript,Audio,Web Audio Api,我有以下javascript代码: var audio = null; try { window.AudioContext = window.AudioContext || window.webkitAudioContext; audio = new AudioContext(); } catch (e) { alert("Web Audio API is not supported in this browser"); } var scriptNode = audi

我有以下javascript代码:

var audio = null;

try {
    window.AudioContext = window.AudioContext || window.webkitAudioContext;
    audio = new AudioContext();
} catch (e) {
    alert("Web Audio API is not supported in this browser");
}

var scriptNode = audio.createScriptProcessor(1024, 0, 1);

var pos = 0.0;

scriptNode.onaudioprocess = function(audioProcessingEvent) {
    var output = audioProcessingEvent.outputBuffer;

    for (var channel = 0; channel < output.numberOfChannels; channel++) {
        var data = output.getChannelData(channel);

        for (var i = 0; i < data.length; i++) {
            data[i] = Math.sin(pos);

            pos += 2.0 * 3.14159 * 440.0 / audio.sampleRate;

            while (pos >= 2.0 * 3.14159) {
                pos -= 2.0 * 3.14159;
            }
        }
    }
}

scriptNode.connect(audio.destination);
var audio=null;
试一试{
window.AudioContext=window.AudioContext | | window.webkitadiocontext;
音频=新的音频上下文();
}捕获(e){
警报(“此浏览器不支持Web音频API”);
}
var scriptNode=audio.createScriptProcessor(1024,0,1);
var pos=0.0;
scriptNode.onaudioprocess=函数(audioProcessingEvent){
var输出=audioProcessingEvent.outputBuffer;
用于(var通道=0;通道=2.0*3.14159){
pos-=2.0*3.14159;
}
}
}
}
scriptNode.connect(audio.destination);
我正在尝试访问web音频的音频循环,这与C语言中的低级音频流API的工作方式非常相似。这段代码应该连续播放440 Hz的音调,直到页面关闭。代码将播放该音调,但一两秒钟后,声音会反复跳过,这表明缓冲区空间已用完,并且没有在每个缓冲区调用脚本

我相信解决这个问题的方法很简单,但是到底是什么导致了跳绳呢?如何使此脚本连续运行


编辑:如果我刷新页面,跳过就会消失。这是浏览器错误吗?

将ScriptProcessor节点的缓冲区大小从1024增加到更大。或者使用0让浏览器为您选择一个值


注意:ScriptProcessors也已弃用,但其替代品尚不可用。替换应该表现得更好。

例如,间隔为4秒

var audio = null;

try {
    window.AudioContext = window.AudioContext ||     window.webkitAudioContext;
    audio = new AudioContext();
} catch (e) {
    alert("Web Audio API is not supported in this browser");
}

var INTERVAL = 4;  // 4 [sec]

var scriptNode = audio.createScriptProcessor(1024, 0, 1);

var pos = 0.0;

var elapsedBuffer = 0;

scriptNode.onaudioprocess = function(audioProcessingEvent) {
    var output = audioProcessingEvent.outputBuffer;

    for (var channel = 0; channel < output.numberOfChannels; channel++) {
        var data = output.getChannelData(channel);

        for (var i = 0; i < data.length; i++) {
            elapsedBuffer++;

            if (elapsedBuffer > audio.sampleRate) {
                if (elapsedBuffer > (INTERVAL * audio.sampleRate)) {
                    elapsedBuffer = 0;
                }

                data[i] = 0;

                continue;
            }

            data[i] = Math.sin(pos);

            pos += 2.0 * 3.14159 * 440.0 / audio.sampleRate;

            while (pos >= 2.0 * 3.14159) {
                pos -= 2.0 * 3.14159;
            }
        }
    }
};

scriptNode.connect(audio.destination);
var audio=null;
试一试{
window.AudioContext=window.AudioContext | | window.webkitadiocontext;
音频=新的音频上下文();
}捕获(e){
警报(“此浏览器不支持Web音频API”);
}
变量间隔=4;//4[秒]
var scriptNode=audio.createScriptProcessor(1024,0,1);
var pos=0.0;
var elapsedBuffer=0;
scriptNode.onaudioprocess=函数(audioProcessingEvent){
var输出=audioProcessingEvent.outputBuffer;
用于(var通道=0;通道audio.sampleRate){
if(elapsedBuffer>(间隔*音频采样器)){
elapsedBuffer=0;
}
数据[i]=0;
继续;
}
数据[i]=Math.sin(pos);
pos+=2.0*3.14159*440.0/audio.sampleRate;
而(位置>=2.0*3.14159){
pos-=2.0*3.14159;
}
}
}
};
scriptNode.connect(audio.destination);

是非常有用的Web音频API库。

请稍候。。。他们不赞成某些东西而不先更换?真的吗?如果我给它0,我仍然会跳过它,不过:/Yes,它已经被弃用了。这并不意味着你现在不能使用它,但希望它最终会消失。请尝试32768,最大尺寸,而不是0。您使用的是什么浏览器和操作系统?16384可以工作,但这是一个巨大的延迟。我用4096跳过,这也是太多的延迟。