【问题标题】:Can HTMLMediaElement.play() be scheduled exactly?HTMLMediaElement.play() 可以准确安排吗?
【发布时间】:2019-08-02 21:32:49
【问题描述】:

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

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

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

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

在App Store的生产实现中,我使用iOS原生的AVAudioPlayer,它有“prepareToPlay”功能,可以预先调用,保证调用“play”时立即播放。

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 是的,我想了很多(我已经完成了基于 WebAudio 的实现和样本精确的调度,但正如我所说的那样,它消耗了太多的内存)。哦,好吧,也许我应该正式请求向 HTMLMediaElement 添加一个“prepareToPlay”方法。
    猜你喜欢
    • 1970-01-01
    • 2021-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多