Web Audio API - 获取歌曲中的当前偏移量&源的开始事件

时间:2017-08-13 12:38:23

标签: javascript web-audio web-audio-api

我正在使用网络音频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);

谢谢!

3 个答案:

答案 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进行计时。