使用 Web Audio API,我正在尝试构建一个具有“向前跳过 15 秒”功能的 mp3 播放器。
我可以使用源缓冲区加载 mp3,并且可以开始播放。我想做这样的事情,虽然我知道 currentTime 不是可设置的属性:
context.currentTime += 15
一旦歌曲已经播放,你如何向前跳过 n 秒?
使用 Web Audio API,我正在尝试构建一个具有“向前跳过 15 秒”功能的 mp3 播放器。
我可以使用源缓冲区加载 mp3,并且可以开始播放。我想做这样的事情,虽然我知道 currentTime 不是可设置的属性:
context.currentTime += 15
一旦歌曲已经播放,你如何向前跳过 n 秒?
不幸的是,没有单一的 API 调用来达到预期的效果,但它是可行的。每个AudioBufferSourceNode
都只能使用一次,这就是为什么我们必须创建一个新的来改变某些东西。
假设我们有两个变量来自一个叫做audioContext
and的地方audioBuffer
。此外,我们定义了另外两个变量来存储初始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;
这当然是一个过于简单的例子。实际上,应该进行检查以确保有足够的音频数据可以向前跳过。您还可以在跳过时应用一点淡入/淡出以避免咔嗒声。...这只是为了说明总体思路。