javascript - AudioContext 振荡器不会播放多次

标签 javascript html audiocontext

我知道你不能多次演奏振荡器,所以我编写了一个函数,每次都会创建一个新的振荡器:

function playFrequency(f, t0, t1){
    console.log(f, t0, t1);
    var oscillator = self.audioContext.createOscillator();
    oscillator.type = "square";
    oscillator.frequency.value = f;
    oscillator.connect(self.audioContext.destination);
    oscillator.start(t0);
    oscillator.stop(t1);
}

但奇怪的是,该函数实际上只会播放声音一次。我不明白为什么会发生这种情况。我不是每次调用该函数时都会创建一个新的振荡器吗?

当我创建一个具有完全相同代码的函数“playFrequency2(f, t0, t1)”时,即使第一个函数播放了声音,它也会播放声音。但我第二次调用的时候也不会播放声音。

最佳答案

您的问题在于传递给函数的开始时间。开始时间是根据 audioContext currentTime 计算的,该时间从创建 audioContext 时开始,并从那时起一直向前推进。因此,例如,当您从 0 开始第一个声音然后在 3 结束时,您的 audioContext 将在此之后继续运行。因此,如果您使用相同的时间参数调用新声音,它将不会播放,因为您的开始时间早于currentTime。 您可以这样修改:

function playFrequency(f, t1){
    console.log(f, t0, t1);
    var oscillator = self.audioContext.createOscillator();
    oscillator.type = "square";
    oscillator.frequency.value = f;
    oscillator.connect(self.audioContext.destination);
    oscillator.start();
    oscillator.stop(self.audioContext.currentTime+t1);
}

关于javascript - AudioContext 振荡器不会播放多次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31033311/

相关文章:

javascript - 如何将音频文件像流一样加载到 AudioContext 中?

javascript - 如何循环表行并获取列复选框

javascript - 点击事件时页面会自动重新加载。无法确定原因?

node.js - 从 NodeJs 使用 WebAudio API

html - 两个单选按钮之间的换行符

javascript - 不向标题添加高度我们可以修复布局吗

javascript - AudioContext:振荡器 - 了解所有声音何时播放

javascript - postgres 与 node.js 连接中的 SASL 错误

javascript - 如何向 OpenCV.js 添加 `accumulateWeighted` 支持?

JavaScript - 如何从 JSON 对象中获取特定值