【发布时间】:2020-05-18 18:26:36
【问题描述】:
我想使用requestAnimationFrame 播放HTML <video> 元素。这很有用,因为它可以更好地控制播放(例如,可以播放某些部分、控制速度等)。但是,我遇到了以下方法的问题:
function playAnimation() {
window.cancelAnimationFrame(animationFrame);
var duration = video.seekable.end(0);
var start = null;
var step = function(timestamp) {
if (!start) start = timestamp;
const progress = timestamp - start;
const time = progress / 1000;
video.currentTime = time;
console.log(video.currentTime);
if (time > duration) {
start = null;
}
animationFrame = window.requestAnimationFrame(step);
}
animationFrame = window.requestAnimationFrame(step);
}
在谷歌浏览器中,视频播放了一点点,然后就卡住了。在 Firefox 中,它冻结得更多。控制台显示视频的currentTime 正在按预期更新,但它没有呈现新时间。此外,在视频冻结的情况下,ontimeupdate 事件不会触发,即使 currentTime 正在更新。
一个简单的演示可以在这里找到:https://codepen.io/TGordon18/pen/bGVQaXM
知道发生了什么问题吗?
更新: 有趣的是,控制/限制动画帧实际上有助于 Firefox。
setTimeout(() => {
animationFrame = window.requestAnimationFrame(step);
}, 1000 / FPS);
这似乎不是正确的方法
【问题讨论】:
-
关于你关于 setTimeout 的注释,我猜这是因为 rAF 任务的优先级高于 mediaelement 的任务,它本身高于 setTimeout 优先级。因此,将您的 rAF 调用包装在 setTimeout 中将使 MediaElement 的任务具有最高优先级,因此将在 setTimeout 触发之前完成,从而在您的下一个 rAF 调用之前完成。如果我是对的,那么您的代码将不再以 60Hz 运行。
标签: javascript html animation html5-video requestanimationframe