Javascript Web音频API-获取歌曲中的当前偏移量&;源的启动事件

Javascript Web音频API-获取歌曲中的当前偏移量&;源的启动事件,javascript,web-audio-api,Javascript,Web Audio Api,我正在使用Web Audio API中的源播放一段音乐曲目 var source = audioCtx.createBufferSource(); source.buffer = audioBuffer; source.connect(audioCtx.destination); source.start(when, offset, duration); 我知道有一个事件监听器可以在源代码播放完毕后使用,source.onedded。是否有一个事件监听器可以在源代码启动时使用?e、 g.s

我正在使用Web Audio API中的源播放一段音乐曲目

var source = audioCtx.createBufferSource();

source.buffer = audioBuffer;
source.connect(audioCtx.destination);

source.start(when, offset, duration);
我知道有一个事件监听器可以在源代码播放完毕后使用,
source.onedded
。是否有一个事件监听器可以在源代码启动时使用?e、 g.
source.onstart

此外,在任何时候都可以从音源获得当前正在播放的曲目的哪一部分?或者甚至是从audioCtx

e、 g.
source.getCurrentOffset();//0:21

我希望避免在源启动时启动setTimeout的当前策略,因为它不准确

示例

source.start(when, offset, duration);

setTimeout(function() {
    console.log("The track has started!");
}, 1000 * when);

谢谢

不确定您想要的是什么,但源代码是在您告诉它的时候开始的:在时间
when


目前无法确定源代码在缓冲区中播放的位置。人们要求使用此功能,但规范中对此没有做任何修改。返回的时间总是不准确的。

您获得了context.currentTime(),但这对您没有帮助。使用setTimeout,您应该会很好。您可以使用myArrayBuffer.duration获取缓冲区的长度。您还可以在开始时使用Date(),并用另一个日期()确定播放了多长时间。

您可以这样做:

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);
我甚至建议扩展
源代码
原型,但我知道这通常是不受欢迎的,因为您可能会覆盖某些内容。
另外,为了更准确,您可以使用计时。

谢谢您的回复。我需要在源代码开始播放时触发事件,而不是在创建时。你可以假设我不知道“何时”是什么,或者如果不可能,那么就假设我不能使用setTimeout。我理解为什么你不知道
何时是,因为你设置了它。但是目前,没有办法知道,所以假设源代码确实开始播放,那么
setTimeout
可能是您能做的最好的了。在启动时添加
事件将需要更改规范。您可以始终
启动(0)
其他节点并
停止(何时)
它,并收听它的
合并的
事件,但我不确定您是否能获得更高的精度。但实际上,为什么需要比
setTimeout
提供的精度更高的精度呢?这是另一个AudioContext的方法吗?那么,您不能使用audio_ctx调度调用此方法吗?除此之外,我真的看不出什么东西需要如此精确。