如何以编程方式确定 JavaScript AudioContext AudioBufferSource 何时播放完毕?

How can I programmatically determine when an JavaScript AudioContext AudioBufferSource is done playing?

我正在使用 Web Audio API 播放 .MP3 文件,但我无法以编程方式确定歌曲何时播放完毕。

这是我的:

var request = new XMLHttpRequest();

audioContext = new AudioContext();

source = audioContext.createBufferSource();
source.connect(audioContext.destination);

request.open('GET',url,true);
request.responseType='arraybuffer';
request.onload = function() {
    audioContext.decodeAudioData(request.response).then(function(buffer) {
        source.buffer = buffer;
        source.start(0);
    });
}   
request.send();

这很好用;我可以毫无问题地开始、停止、暂停和取消暂停歌曲。

然而,我想做的是,当一首歌曲播放完毕后停止播放时(即,我没有调用 audioContext.close()),我想调用另一个函数来为用户设置一条消息。我一直在寻找可以利用的某种回调,我已经尝试了 audioContext.decodeAudioData() 提供的 promisefinally(),但我一直无法弄清楚。

处理您 audioContextended 事件。请参阅 AudioScheduledSourceNode: ended event 以供参考。

source.addEventListener('ended', () => {
   // done!
});

或使用 onended 属性.

source.onended = () => {
  // done!
}