【问题标题】:Setting the granularity of the HTML5 audio event 'timeupdate'设置 HTML5 音频事件“timeupdate”的粒度
【发布时间】:2012-09-07 21:43:35
【问题描述】:

我正在尝试使用 HTML5 音频创建一个简单的循环功能,并有一个非常原始的解决方案,如下所示:

$(audio).bind('timeupdate', function() {
  if (audio.currentTime >= 26){
    var blah = audio.currentTime; 
    audio.currentTime = 23;
    console.log(blah);
  }
})

这可以正常工作,但这里唯一的故障是 timeupdate 事件不会非常一致地触发。例如,上面的 console.log 返回: 26.14031982421875

26.229642868041992

26.13462257385254

26.21796226501465

...等等。 (你明白了..不一致的时间)

显然,这不适用于时间很重要的应用程序(音乐应用程序)。所以对我来说显而易见的解决方案是增加触发 timeupdate 事件的粒度。我还没有找到任何 API 文档...但很想知道是否有办法做到这一点。

【问题讨论】:

标签: html html5-audio


【解决方案1】:

应该注意的是,您可以更频繁地阅读视频的 currentTime 属性。如果时间真的很紧迫,并且您可以忍受一点不确定性,那么您可以尝试一下。

然而,它比使用标签自己的timeupdate 事件要优雅得多。

setInterval(function () {
    console.log(audio.currentTime); // will get you a lot more updates.
}, 30);

在这种情况下,您必须自己管理间隔,确保在 nulling 音频元素之前清除它。但这是一种可能性。

我在视频元素上使用了这种方法,但它也应该适用于此。

【讨论】:

  • 我们在一个 Cordova 项目中使用它,该项目与用户可以控制的内容层一起播放/暂停视频。在这种情况下,我们没有性能问题。但这是真的,你现在每隔几毫秒就有一件事情要做。除了 setInterval,您还可以在发生另一个事件(如用户交互)时读取.currentTime。或者,如果您关心视频位置,则可以计算“安全余量”,但仅“大约”在 1 分钟标记 - 将超时设置为 59 秒,并在 59 秒后开始更紧的间隔。
  • 对于较短的音频片段,这种方法几乎是不可见的
  • 最好使用requestAnimationFrame 而不是setInterval。
  • 仅在您更新视觉对象的情况下。我们没有这样做有两个原因:我们没有显示当前状态(好吧,我们也这样做了,但为此 timeupdate-event 已经足够好了),而是将其与内部参考进行了比较。另外,当时还没有广泛支持 requestAnimationFrame。
  • 这应该是公认的答案,因为它提供了一个实际的解决方案,而不是仅仅说它无法完成.. 开箱即用并提供解决方案的荣誉!
【解决方案2】:

很抱歉,但这就是它的工作方式。来自html5 specs:

每 15 到 250 毫秒,或者每当 MediaController 的媒体控制器位置发生变化时,以最不频繁发生的为准,用户代理必须排队一个任务以在 MediaController 上触发一个名为 timeupdate 的简单事件。

还有,

因此,事件的触发速度不会超过大约 66Hz 或低于 4Hz(假设事件处理程序的运行时间不超过 250 毫秒)。鼓励用户代理根据系统负载和每次处理事件的平均成本来改变事件的频率,这样 UI 更新的频率不会超过用户代理在解码视频时可以轻松处理的频率。

如果您通读规范,您会发现timeupdate 事件是某种“尽力而为”的事件。只要它不会对性能产生太大影响,它就会在可能的时候触发。

您可以过滤不时丢弃一些事件以平滑到达时间,但恐怕不能做相反的事情。

【讨论】:

  • 我记录了当前时间,有时间隔超过500毫秒。对于性能低下的设备,这个间隔是否更长?
  • 许多人似乎更喜欢 250 毫秒,无论出于何种原因
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-21
  • 2011-10-30
  • 1970-01-01
  • 2012-03-22
  • 1970-01-01
  • 2011-07-02
  • 2020-05-27
相关资源
最近更新 更多