我已经为此寻找解决方案有一段时间了,但仍然没有找到。我们的应用程序需要使用以下方式轮询 YouTube 视频对象player.getCurrentTime()
驱动一些屏幕动画。使用 flash API 这很棒,因为我们可以轮询玩家40ms
间隔(25 FPS)并获得非常准确的当前玩家时间值。我们现在已经开始使用 iFrame API,不幸的是它不允许任何接近该级别的准确性。我做了一些研究,似乎因为它是一个 iFrame,postMessage
用于将玩家状态暴露给player.getCurrentTime()
称呼。不幸的是,这个发布消息事件很少被触发——有时低至每秒 4 次。更糟糕的是,消息触发的实际速率似乎取决于浏览器的渲染引擎。
有谁知道是否可以强制渲染引擎更频繁地触发这些消息,以便轮询玩家时可以实现更高的时间分辨率?我试过requestAnimationFrame
这并不能解决问题。有人成功地让 iFrame 播放器报告更准确、更频繁的时间吗?
我已经为我原来的问题想出了一个解决方法。我编写了一个简单的补间函数,它将以我想要的频率轮询 iFrame 播放器,并在其间插入时间点。播放器本身仅每 250 毫秒左右更新一次当前时间,具体取决于渲染引擎和平台。如果您轮询的频率高于此值,它将在多次连续轮询中返回相同的当前时间值。但是,如果您应用一些逻辑,您可以检测玩家何时返回新的当前时间并相应地更新您自己的计时器。我在计时器上以 25 毫秒的间隔运行下面的函数。在每次迭代中,我都会向当前时间添加 25 毫秒,除非我检测到玩家报告的当前时间发生变化。在这种情况下,我用新的“实际”当前时间更新我自己的计时器。当您执行此操作时,可能会出现小跳跃或非线性,但如果您以足够高的速率轮询玩家,这应该是难以察觉的。
window.setInterval(tween_time, 25);
function tween_time() {
time_update = (ytplayer.getCurrentTime()*1000)
playing=ytplayer.getPlayerState();
if (playing==1){
if (last_time_update == time_update)
{
current_time_msec += 25;
}
if (last_time_update != time_update)
{
current_time_msec = time_update;
}
}
do_my_animations();
last_time_update = time_update;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)