如何使用网络音频API播放曲目时向前跳过n秒?

问题描述 投票:0回答:1

[使用Web Audio API,我正在尝试构建一个具有“提前15秒跳过”功能的mp3播放器。

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

context.currentTime += 15

一旦已经播放歌曲,您如何向前跳过n秒?

web-audio-api audiocontext audiobuffer
1个回答
4
投票

不幸的是,没有单个API调用可以达到预期的效果,但这是可行的。每个AudioBufferSourceNode只能使用一次,这就是为什么我们必须创建一个新的C0来更改某些内容的原因。

让我们想象一下,有两个变量来自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;

这当然是一个过于简化的示例。实际上,应该进行检查以确保有足够的音频数据可跳过。您也可以在跳过时略微淡入/淡出,以避免发出喀哒声。 ...这仅是为了说明一般想法。

© www.soinside.com 2019 - 2024. All rights reserved.