gpt4 book ai didi

javascript - 获取视频 HTML5 中的帧变化

转载 作者:太空狗 更新时间:2023-10-29 16:51:40 25 4
gpt4 key购买 nike

我需要检测 HTML 5 中视频的所有帧变化,我尝试了以下代码,但我无法获得所有变化,每秒只能获得八或九次更新..

<body>
<canvas id="Canvas" width="800" height="450" style="position:absolute; left:5; top:5">Can't Load Canvas</canvas>
<video id="videoPlay" muted controls>
<source src="assets/soccer.webm" type="video/webm">
<source src="assets/soccer.mp4" type="video/mp4">
Your browser does not support the video tag.
</video>
</body>
<script type="text/javascript">
videoPlay.addEventListener('timeupdate', function (){
putOverlay();
});
function putOverlay(){
console.log(videoPlay.currentTime);
console.log("another frame");
}
</script>
</html>

我也尝试了以下代码,但是随着时间的推移,使用计时器时,帧和计时器给出的值之间会失去同步。

<body>
<canvas id="LeCanvas" width="800" height="450" style="position:absolute; left:5; top:5">Can't Load Canvas</canvas>
<!-- Video -->
<video id="videoPlay" controls>
<source src="assets/soccer.webm" type="video/webm">
<source src="assets/soccer.mp4" type="video/mp4">
Your browser does not support the video tag.
</video>
</body>
<!-- Play Video-->
<script>
//Play Damn Video
var videoPlay = $('#videoPlay')[0];
videoPlay.play(1);
</script>
<!-- Canvas Animation -->
<script>
//Animation
function animate() {
console.log("frame change");
}
setInterval(animate, 1000/29.97);
</script>

对我的问题有什么建议吗?

对不起我的英语

问候亚历克斯

最佳答案

如上评论所述,timeupdate 仅每 15-250 毫秒触发一次,实际上它似乎更接近 250 毫秒。似乎 timeupdate 旨在提供足够的准确性以每秒显示 currentTime。因此,您最好的选择是运行一个以您想要的速率运行的计时器,并在每次迭代时查询 currentTime

但与其使用 setInterval 甚至 setTimeout,不如使用 requestAnimationFrame .这将大约每 16 毫秒 (60fps) 运行一次,但它会与显卡刷新率同步。如果您使用 setTimeout,您可能会在某些设备上看到闪烁或屏幕撕裂,尤其是移动设备。它还允许浏览器在选项卡不可见时限制您的帧速率,以节省 CPU 周期(从而节省电池使用量)。

它也比 setInterval 更好,因为如果出于某种原因您的渲染代码花费的时间超过您分配的 30 或 16 毫秒,setInterval 可能会堆积调用并导致计时问题,但 requestAnimationFrame 会跳过帧让您回到正轨。

假设您已经像上面那样使用了 polyfill,代码将如下所示:

var video = document.getElementById('videoPlay'),
lastTime = -1;
function draw() {
var time = video.currentTime;
if (time !== lastTime) {
console.log('time: ' + time);
//todo: do your rendering here
lastTime = time;
}

//wait approximately 16ms and run again
requestAnimationFrame(draw);
}

draw();

上面的代码对时间进行了检查,以确保您不会连续两次绘制同一帧。您并不真的需要它,但它会为您节省几个 CPU 周期。但是当在 Canvas 上绘制视频时,帧比 currentTime 报告的要晚几毫秒。所以如果你暂停视频然后跳来跳去,你几乎肯定会落后一帧。通常,如果自从我上次绘制以来 currentTime 没有改变但视频暂停,我将在每个周期继续绘制半秒左右。或者您可以花点时间退房。

关于javascript - 获取视频 HTML5 中的帧变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17044567/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com