我正在使用网络音频API中的来源播放音乐片段。
var source = audioCtx.createBufferSource();
source.buffer = audioBuffer;
source.connect(audioCtx.destination);
source.start(when, offset, duration);
我知道在源播放完成后我可以使用一个事件监听器source.onended
。是否有一个事件监听器,我可以在源启动时使用它?例如source.onstarted
?
此外,在任何时候都可以从一个来源获取当前正在播放的曲目的哪一部分?或者甚至可能来自audioCtx?
e.g。 source.getCurrentOffset(); // 0:21
我想避免当前启动setTimeout的策略,因为它不准确。
示例
source.start(when, offset, duration);
setTimeout(function() {
console.log("The track has started!");
}, 1000 * when);
谢谢!
答案 0 :(得分:1)
不确定你想要什么,但是当你告诉它时,信息源正好开始:when
。
目前无法确定源在缓冲区中的位置。人们已经要求这个功能,但在规范中没有做过任何事情。返回的时间总是不准确。
答案 1 :(得分:0)
你有context.currentTime()但这对你没有帮助。使用setTimeout你应该没问题。你可以使用myArrayBuffer.duration获取缓冲区的长度。您也可以在启动时使用Date(),并使用另一个Date()确定播放的时间。
答案 2 :(得分:0)
function my_start(when, offset, duration, callback) {
setTimeout(function() {
source.start(0, offset, duration);
callback();
}, when);
}
function onStartedCallback() {
console.log("The track has started!");
}
my_start(when, offset, duration, onStartedCallback);
我建议甚至扩展source
原型,但我知道这通常不赞成 - 因为你可能会覆盖一些东西。
此外,为了更准确,您可以使用requestAnimationFrame进行计时。