如何在使用网络音频 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
只能使用一次,这就是为什么我们必须创建一个新的才能改变某些东西。
让我们假设我们有两个变量来自某个地方 audioContext
和 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;
这当然是一个过于简单化的例子。实际上,应该进行检查以确保有足够的音频数据可以向前跳过。您也可以在跳过时应用一点 fade-in/out 以避免点击声音。 ...这只是为了说明一般的想法。
使用网络音频 API,我正在尝试构建具有 "Skip ahead 15 seconds" 功能的 mp3 播放器。
我可以使用源缓冲区加载 mp3,并可以开始播放。我想做这样的事情,虽然我知道 currentTime 不是可设置的 属性:
context.currentTime += 15
如何在歌曲播放后快进 n 秒?
不幸的是,没有一个 API 调用可以达到预期的效果,但它是可行的。每个 AudioBufferSourceNode
只能使用一次,这就是为什么我们必须创建一个新的才能改变某些东西。
让我们假设我们有两个变量来自某个地方 audioContext
和 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;
这当然是一个过于简单化的例子。实际上,应该进行检查以确保有足够的音频数据可以向前跳过。您也可以在跳过时应用一点 fade-in/out 以避免点击声音。 ...这只是为了说明一般的想法。