【问题标题】:AudioContext Oscillator won't play more than onceAudioContext 振荡器不会播放超过一次
【发布时间】:2015-06-24 17:36:18
【问题描述】:

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

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)”时,即使第一个函数播放了声音,它也会播放声音。但是当我第二次调用它时它也不会播放声音。

【问题讨论】:

    标签: javascript html audiocontext


    【解决方案1】:

    您的问题在于 start 传递给您的函数的时间。开始时间是从 audioContext currentTime 计算的,它从创建 audioContext 时开始,并从那时起继续前进。因此,例如,当您从 0 开始您的第一个声音然后在 3 结束时,您的 audioContext 将在此之后继续运行。因此,如果您使用相同的时间参数调用新声音,它将不会播放,因为您的start 时间早于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);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-07
      • 2012-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多