HTMLMediaElement.play() 可以准确安排吗?

Can HTMLMediaElement.play() be scheduled exactly?

背景:我正在开发 MusicFolder 2 的 WebAudio 兼容版本,这是一种具有无缝播放功能的媒体播放器。它需要支持非常大的音频文件(数小时)和已拆分为单独的音频文件的混音,这些文件需要端到端地回放,轨道之间没有任何明显的音频丢失。

我试过使用 decodeAudioData 和 AudioBufferSourceNode 的两个实例轮流使用,但是大音频文件的内存消耗太高,特别是因为各种 Webaudio 实现无法进行垃圾收集(已知错误)。

作为替代方案,我围绕 HTMLMediaElement 及其相应的源 AudioNode 实现了一个版本,但这里的问题是我无法准确安排音频元素的开始以进行无缝播放。我尝试了各种方法,例如在 GainNode 设置为 0 的第二个音频元素上调用 .play(),然后在另一个音频元素播放完毕后切换到该元素("ended" 事件),然后将 .currentTime 设置为 0 , 但即使将一个已经播放的元素寻找到 0 也需要很长时间。

有什么方法可以加快 .play() 或寻找或将它们中的任何一个安排到准确的时间吗?

在App Store的生产实现中,我使用的是iOS'原生的AVAudioPlayer,它有"prepareToPlay"函数可以提前调用,保证调用"play"时立即播放.

不,无法准确安排。首先,(就像你说的)搜索不是即时的,并且可能因浏览器而异。其次,调用 play 方法必须在主 javascript 线程中完成,这不像使用 Web 调度时那样准确(每秒 60 次,如果没有其他干扰)音频 API(这将为您提供样本准确调度:每秒 44.1k 次)。