当前位置: 首页 > 知识库问答 >
问题:

JS音频API-振荡器内部函数不播放声音

单于浩邈
2023-03-14

在使用Opera44.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();
  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个答案

鱼志学
2023-03-14

翻阅文档,我设法解决了这个问题。

最初,我假设传递给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...

 类似资料:
  • 当使用web audio API制作振荡器时,我总是听到当停止它时的咔嗒声。我四处寻找,但没有一个解决办法对我有效。我尝试了所有的实现从我如何避免这种‘咔哒’声音时,我停止播放一个声音?和更多 我读到一个解决方案是等待下一个零振幅值,然后立即停止播放。有没有一种方法可以使用web audio API做到这一点? 我正在考虑为我的项目切换到Tone.js,因为声音不需要点击就可以播放。他们是如何解决

  • 我正在尝试用js制作一架简单的钢琴,但我不想使用音频样本,而是想以编程方式生成声音。要播放单个声音,我正在使用此博客中的此代码 https://marcgg.com/blog/2016/11/01/javascript-audio/ 我发现在玩了大约50次之后,这种方法停止工作。运行此代码时不播放声音, 不会更改并保持 0。如何在不停止播放声音的情况下修复它?

  • 在下面的代码中,我希望在每次按下按钮元素时创建一个分配给o的新振荡器节点,允许多次按下,从而在440处产生多个1秒音调。然而,我发现这个按钮只能按一次以产生一个音调,之后它就会消失,就好像我没有创建新的振荡器节点一样。我正在学习JavaScript,我怀疑它一定是一些微不足道的东西。有人有主意吗? 编辑: 刚找到这个问题解决了这个问题。解决方案是将audio_context.currentTime

  • 在执行此代码时,我会得到这样的错误:“Uncattle TypeError:Failed to execute'linear ramptoValueAtTime'on'AudioParam':The provided double value is non-finite”。 &如果替换ac.endTime只是endTime-“endTime未定义”,则发生错误。也许有人能解释为什么会这样?谢谢

  • 仅仅是我,还是振荡器即使在0.5增益下也听起来疯狂的响亮?我不能增加我的电脑的体积超过5%。 现在,当我将增益设置为0.001时,音量似乎“归一化”了,但这不对?我希望能有一些关于控制振荡器音量的见解。

  • 我正在尝试添加AnalyserNode并将输出声音可视化到我制作的web音频示例中,但我不知道如何实现。我想我没有将正确的源传递给分析器(?) 完整代码如下:https://jsfidle.net/kepin95043/1ub0sjo3/ 谁能帮我找出我做错了什么?提前感谢! PS:用火狐打开吧。对我来说在基于Chromium的浏览器上不起作用。 下面是一个工作示例:https://codepen