Javascript 如何准确同步<;音频>;从Web音频时间线开始播放

Javascript 如何准确同步<;音频>;从Web音频时间线开始播放,javascript,web-audio-api,Javascript,Web Audio Api,我正试图做到这一点,当用户点击一个按钮时,就会播放一个音频文件(通过 它们并不完美(曲目增益从0开始),但已经足够接近了。但是,在Safari中,音频开始播放之前的延迟要糟糕得多。在音频元素播放之前,上下文时间线有足够的时间开始加速 如您所见,上下文时间线会运行一段时间,轨迹增益从0.31开始,而不是从0开始 以下是完整的代码: 我可能做错什么了吗?我做的事情有问题吗?我应该如何解决这个问题 旁注:在Firefox中,trackGain.gain.value无论如何都是1。这似乎是一个bug。

我正试图做到这一点,当用户点击一个按钮时,就会播放一个音频文件(通过

它们并不完美(曲目增益从0开始),但已经足够接近了。但是,在Safari中,音频开始播放之前的延迟要糟糕得多。在音频元素播放之前,上下文时间线有足够的时间开始加速

如您所见,上下文时间线会运行一段时间,轨迹增益从0.31开始,而不是从0开始

以下是完整的代码:

我可能做错什么了吗?我做的事情有问题吗?我应该如何解决这个问题


旁注:在Firefox中,
trackGain.gain.value
无论如何都是1。这似乎是一个bug。

我猜Safari在等待()之后更新currentTime之前,不知何故正在进入“this.trackGain.gain.setValueAtTime(0,currentTime)”状态节-因为存在一个不连续的跳转,该跳转与使用过去的时间值触发的setLinearRampAtTime()调用一致。setValue/setLinear调用看起来像是在t=0.60和t=0.62之间触发的(尝试向set节添加一个console.log以进行测试)


这与数学上的结果是一致的-这些值与一个渐变大致一致,该渐变在t=0时的初始点设置为0,在t=2时的渐变设置为值=1。

不太清楚为什么不简单地从音频上下文中保留播放…这可能会使事情更容易同步:-)即使我移动淡入代码(setValue和setLinear调用)在上下文运行且播放
后(
等待此操作。$refs.audio.play()
),曲目增益仍从0.3左右开始。我通过在“canplaythrough”和“Seek”音频事件触发之前不启动淡入来修复此问题。
if (fadeIn) {
  console.log('0 gain at', currentTime);
  console.log('fade to 1 by', currentTime + fadeIn);
  this.trackGain.gain.setValueAtTime(0, currentTime);
  this.trackGain.gain.linearRampToValueAtTime(1, currentTime + fadeIn);
} else {
  this.trackGain.gain.setValueAtTime(1, currentTime);
}
await this.$refs.audio.play();
await this.audioCtx.resume();
// currentTime must be set after play starts, for Safari
this.$refs.audio.currentTime = this.trackList[0].startTime;