gpt4 book ai didi

javascript - 网络音频API : smooth transitions between audio fades in/out

转载 作者:行者123 更新时间:2023-12-01 01:07:14 27 4
gpt4 key购买 nike

我有一个包含不同区域的 3d 空间,每个区域都有自己的声音。我的目标是当用户从一个区域移动到另一个区域时实现平滑的音频过渡,基本上是在音轨之间进行交叉淡入淡出。另外,我想优雅地处理当用户改变主意并突然返回到刚刚离开的区域时的情况,这意味着取消新的音频转换并逐渐恢复到之前的状态。

为此,我使用 web audio api ,特别是linearRampToValueAtTimecancelScheduledValues定义淡入/淡出功能:

const fadeIn = (sound, time = 4, gain = 1.0) => {
sound.gainNode.gain.cancelScheduledValues(sound.context.currentTime)
!sound.isPlaying && sound.play()
sound.gainNode.gain.linearRampToValueAtTime(gain, sound.context.currentTime + time)
}

const fadeOut = (sound, time = 4, gain = 0.0) => {
sound.gainNode.gain.cancelScheduledValues(sound.context.currentTime)
sound.gainNode.gain.linearRampToValueAtTime(gain, sound.context.currentTime + time)
}

我仅在一种声音上进行测试,按“I”键触发淡入,按“O”键触发淡出:

document.addEventListener("keyup", e => {
switch (e.keyCode) {
// I key
case 73:
fadeIn(mySound)
break
// O key
case 79:
fadeOut(mySound)
break
})

我得到的结果不一致。有时音频会正确淡入淡出,有时音频会在淡入中突然开始或在淡出中突然切入。似乎在转换尚未完成时调用cancelScheduledValues 会导致不稳定的行为。我希望即使在淡入尚未完成时触发淡出时也能顺利工作,反之亦然。我还尝试使用 setTimeout 推迟一些 LinearRamps,例如

setTimeout(() => sound.gainNode.gain.linearRampToValueAtTime(gain, sound.context.currentTime + time), 0.1)

但得到同样错误的结果。是我使用的api不正确吗?有什么建议吗?

最佳答案

我认为这里发生的情况是,比如说,你正在淡入,但你还没有完成斜坡。然后您想要淡出,并取消事件,包括未完成的淡入渐变。然后淡入渐变消失,时间线值恢复到前一个事件的值。

所以,如HankMoody建议使用 cancelAndHoldAtTime 来处理这个问题。但是,据我所知,只有 Chrome 才有这个功能。

为了便于移植,我认为您想要做的是计算您想要取消时的斜坡位置。假设该值为 v。然后做

setValueAtTime(v, context.currentTime);
cancelScheduledValues(context.currentTime + eps);

其中 eps1/context.sampleRate 左右或更大的一些小值。

关于javascript - 网络音频API : smooth transitions between audio fades in/out,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55512831/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com