JS Audio API - 内部功能的振荡器不播放声音

时间:2018-05-04 20:46:51

标签: javascript web-audio-api

使用Opera 44.0,我正在摆弄Audio API并尝试了一个简单的例子:

var ac = new AudioContext();
var osc = ac.createOscillator();

osc.connect(ac.destination);
osc.start();
osc.stop(2);

按预期工作,声音播放2秒然后停止。

然后我尝试加强一点,单击按钮时播放声音:

function play(){
  var osc = ac.createOscillator();
  osc.connect(ac.destination);
  osc.start();
  osc.stop(2);
}

var ac = new AudioContext();

var playBtn = document.querySelector("#play");
playBtn.addEventListener("click", play);

它不起作用。单击按钮(我在函数内使用console.log()检查)时调用该函数,但没有播放声音。我尝试刷新页面,重新启动浏览器..什么都没有。

经过一些研究后我发现调用stop()时振荡器会被丢弃,所以我每次都要创建一个新的振荡器。几乎所有我发现的例子都围绕着这个概念,这就是我在函数中创建它的原因。但是没有任何错误,我无法弄清楚它为什么不起作用。

那么,这里的问题在哪里?

1 个答案:

答案 0 :(得分:0)

通过documentation,我设法解决了这个问题。

最初,我认为传递给osc.stop(2)的参数是以秒为单位的播放时间,类似于"播放2秒,然后停止"。 但这不正确:参数是" ...振荡器停止时的音频上下文时间"。

通过在ac.currentTime函数中记录play(),单击按钮时返回的值为~5。所以,发生的事情就是将2传递给osc.stop()我告诉osc在上下文时间为2时停止,这已经过了!

解决方案很简单:

function play(){
  var osc = ac.createOscillator();
  osc.connect(ac.destination);
  osc.start();
  //take into account the current time of the context
  osc.stop(ac.currentTime + 2);
}

智慧的话现在回响我的大脑... R .... T ..... F ... M ...