Javascript JS音频API-振荡器内部函数不';我不能放声音
使用Opera 44.0,我在摆弄音频API,并尝试了一个简单的示例:Javascript JS音频API-振荡器内部函数不';我不能放声音,javascript,web-audio-api,Javascript,Web Audio Api,使用Opera 44.0,我在摆弄音频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();
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()
时,振荡器会被丢弃,因此每次我都必须创建一个新的振荡器。我发现的几乎所有示例都围绕这个概念展开,这就是我在函数中创建它的原因。但是没有任何错误,我不明白为什么它不起作用
那么,问题出在哪里呢?通过深入研究,我设法解决了问题
最初,我假设传递给osc.stop(2)的参数是以秒为单位的播放时间,类似于“播放2秒,然后停止”。
但这并不正确:参数是“…振荡器应该停止的音频上下文时间”
通过在play()
函数中记录ac.currentTime
,我单击按钮时返回的值为~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