Web Audio api : 如何从头开始持续增加音量

Web Audio api : How to increase continuously the volume of the sound from the beginning

为了不让听众感到窒息我想播放一波但是音量不应该从一开始就以 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)

Web Audio API 为此提供了 library function

AudioParam.linearRampToValueAtTime(value, endTime)

价值

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

结束时间

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


所以在你的情况下使用

gainNode.gain.linearRampToValueAtTime(0, 0)
gainNode.gain.linearRampToValueAtTime(1, 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;
};

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