首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >ScriptProcessorNode跳过

ScriptProcessorNode跳过
EN

Stack Overflow用户
提问于 2015-10-01 02:16:37
回答 2查看 809关注 0票数 3

我有以下javascript代码:

代码语言: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);

我正在尝试访问网络音频的音频循环,很像低级音频流API在C中工作的方式。这段代码应该连续播放440 Hz的音调,直到页面关闭。代码将播放音调,但一两秒钟后声音会反复跳过,这表明我已经用完了缓冲区空间,并且脚本不会在每个缓冲区期间被调用。

我相信这个问题的解决方案很简单,但实际上是什么导致了跳过呢?怎样才能让这个脚本连续运行呢?

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

EN

回答 2

Stack Overflow用户

发布于 2015-10-01 03:46:38

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

还要注意的是,ScriptProcessors已被弃用,但替代方案还不可用。替换者应该表现得更好。

票数 1
EN

Stack Overflow用户

发布于 2015-10-02 19:17:35

例如,间隔为4秒,

代码语言: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 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);

XSound.js是一个非常有用的Web Audio API库。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32873044

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档