【问题标题】:Web Audio api : How to increase continuously the volume of the sound from the beginningWeb Audio api:如何从一开始就不断增加音量
【发布时间】:2018-06-19 22:23:37
【问题描述】:

为了不让听众窒息,我想播放一个波形,但音量不应从一开始就以 100% 的比例播放,例如,它应该在 2 秒的持续时间内从 0% 变为 100%。

我设置了一个setTimeout,我通过时间增加了增益,但我不知道是否有其他更好的方法

    var source = aCtx.createBufferSource();
    source.buffer = buf;
    var gainNode = aCtx.createGain();
    gainNode.gain.value = 0
    source.connect(gainNode);
    gainNode.connect(aCtx.destination);
    source.start(0);

setTimeout(function() {
     gainNode.gain.value = 0.5
}, 1000)

setTimeout(function() {
     gainNode.gain.value = 1
}, 2000)

【问题讨论】:

  • 你应该做两次以上。请注意,正如现在所写的那样,您的音频会保持沉默半秒,然后会爆炸到 50% 的增益。
  • 是的,根据我正在修复的步骤,我设置了一个 setTimeout 循环
  • 是的,添加一些小增益并重新安排放大,直到增益达到 1.0(或略低于)。

标签: javascript web-audio-api


【解决方案1】:

Web Audio API 为此提供了library function

AudioParam.linearRampToValueAtTime(value, endTime)

价值

一个浮点数,表示 AudioParam 将在给定时间上升到的值。

结束时间

一个 double 表示在斜坡开始后值的更改将停止的确切时间(以秒为单位)。


所以在你的情况下使用

gainNode.gain.linearRampToValueAtTime(0, 0)
gainNode.gain.linearRampToValueAtTime(1, 2)

【讨论】:

  • 谢谢,我不知道。但是 gainNode.gain.linearRampToValueAtTime(1, 2) 一开始对我不起作用,即使我做了 gainNode.gain.value = 0。我不得不添加 gainNode.gain.setValueAtTime(0, audioCtx.currentTime);然后像链接中一样 gainNode.gain.linearRampToValueAtTime(1, audioCtx.currentTime + 2) 。再次感谢你拯救了我的一天
  • @MehdiSouregi 好的,谢谢,我自己不知道。
【解决方案2】:

通过简单地使用某种 lerp 函数使其动态化,那里有很多。基本思想是你得到一个在你的两个起始值之间插值的值。 示例:

值 1 = 5

值 2 = 1

插值量 = 0.4 (40%)

那么结果应该正好是 2.6

上述函数可能看起来像这样

Math.lerp = function (value1, value2, amount) {
    amount = amount < 0 ? 0 : amount;
    amount = amount > 1 ? 1 : amount;
    return value1 + (value2 - value1) * amount;
};

在您的特定情况下,您可以将最小和最大音量作为两个值,然后使用经过的时间来调节数量。可能有一些异步函数回调到这个函数。 希望我能帮上忙。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-04
    • 1970-01-01
    • 1970-01-01
    • 2013-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多