可以精确安排HTMLMediaElement.play()的时间吗?

时间:2019-03-12 12:01:43

标签: webkit mobile-safari web-audio web-audio-api

背景:我正在开发MusicFolder 2的WebAudio兼容版本,这是一种无间隙播放功能的媒体播放器。它需要同时支持非常大的音频文件(小时)和混音,这些混音已被拆分成单个音频文件,需要端对端播放,而音轨之间没有明显的音频掉落。

我尝试轮流使用解码音频数据和两个AudioBufferSourceNode实例,但是对于大型音频文件,内存消耗太高,尤其是因为各种Webaudio实现无法进行垃圾回收(已知错误)。

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

是否有任何方法可以加快.play()或查找或将它们中的任何一个调度到确切的时间?

在App Store的生产实现中,我使用iOS的本机AVAudioPlayer,它具有“ prepareToPlay”功能,可以预先调用该功能,并确保在调用“播放”时立即播放。

1 个答案:

答案 0 :(得分:1)

否,无法准确安排。首先,(如您所说)搜索不是即时的,并且可能因浏览器而异。其次,必须在主javascript线程中完成所谓的play方法,该方法的准确性不如您使用Web Audio API进行调度时(每秒60次,如果没有其他干扰)可以为您提供准确的计划安排示例:每秒44.1k次。