繁体   English   中英

JS Audio API-振荡器内部功能无法播放声音

[英]JS Audio API - Oscillator inside function doesn't play sound

使用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()时振荡器被扔掉了,所以每次都必须创建一个新的振荡器。 我发现的几乎所有示例都围绕着这个概念,这就是为什么我在函数内部创建它的原因。 但是没有任何错误,我无法弄清楚为什么它不起作用。

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

浏览文档 ,我设法解决了这个问题。

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

通过在play()函数中记录ac.currentTime ,当我单击按钮时返回的值为ac.currentTime 因此,发生的是,通过将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 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM