如何在使用网络音频 API 播放曲目时快进 n 秒?

How to skip ahead n seconds while playing track using web audio API?

使用网络音频 API,我正在尝试构建具有 "Skip ahead 15 seconds" 功能的 mp3 播放器。

我可以使用源缓冲区加载 mp3,并可以开始播放。我想做这样的事情,虽然我知道 currentTime 不是可设置的 属性:

context.currentTime += 15

如何在歌曲播放后快进 n 秒?

不幸的是,没有一个 API 调用可以达到预期的效果,但它是可行的。每个 AudioBufferSourceNode 只能使用一次,这就是为什么我们必须创建一个新的才能改变某些东西。

让我们假设我们有两个变量来自某个地方 audioContextaudioBuffer。另外我们再定义两个变量来存储初始的startTime和当前的运行AudioBufferSourceNode.

let audioBufferSourceNode;
let startTime;

我们第一次玩 audioBuffer 我们直接从头开始玩。这里唯一特别的是我们保留了对 audioBufferSourceNode 的引用并且我们记住了 startTime.

audioBufferSourceNode = audioContext.createBufferSource();
audioBufferSourceNode.buffer = audioBuffer;
audioBufferSourceNode.connect(audioContext.destination);
startTime = context.currentTime;
audioBufferSourceNode.start(startTime);

如果您想稍后跳过之前开始的 audioBufferSourceNode 需要先停止。

const currentTime = context.currentTime;

audioBufferSourceNode.stop(currentTime);
audioBufferSourceNode.disconnect();

此外,需要重新使用与以前相同的 audioBuffer 创建一个新的。这里唯一的区别是我们应用了一个偏移量以确保它提前跳过 15 秒。

audioBufferSourceNode = audioContext.createBufferSource();
audioBufferSourceNode.buffer = audioBuffer;
audioBufferSourceNode.connect(audioContext.destination);
audioBufferSourceNode.start(currentTime, currentTime - startTime + 15);

要准备好再次跳过,有必要更新 startTime

startTime -= 15;

这当然是一个过于简单化的例子。实际上,应该进行检查以确保有足够的音频数据可以向前跳过。您也可以在跳过时应用一点 fade-in/out 以避免点击声音。 ...这只是为了说明一般的想法。