使用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()
时振荡器会被丢弃,所以我每次都要创建一个新的振荡器。几乎所有我发现的例子都围绕着这个概念,这就是我在函数中创建它的原因。但是没有任何错误,我无法弄清楚它为什么不起作用。
那么,这里的问题在哪里?
答案 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 ...