首页 > 其他分享 >根据视频帧率,使用requestAnimationFrame播放动画

根据视频帧率,使用requestAnimationFrame播放动画

时间:2023-05-31 14:34:37浏览次数:43  
标签:动画 tick 播放 requestAnimationFrame window delta var now

当时使用webRTC进行视频通话时,通常会设置视频流的帧率,行业内一般默认帧数为15或者30,一般每秒只需要渲染15或30次

当要需要对本地视频或者远端视频流进行特殊处理时,通常会使用requestAnimationFrame方法进行再次渲染

requestAnimationFrame,这个方法是用来在页面重绘之前,通知浏览器调用一个指定的函数,以满足开发者操作动画的需求。

这个函数类似setTimeout,只调用一次。

function draw() { 
        requestAnimationFrame(draw); 
        // ... Code for Drawing the FrameRate ... 
}

递归调用,就可以实现定时器。回调函数执行次数通常是每秒 60 次。

但是,这样完全跟浏览器帧频同步了,无法根据视频帧率渲染,会造成一定程度的CPU和GPU资源的浪费

自行控制时间跨度:

var fps = 30;
var now;
var then = Date.now();
var interval = 1000/fps;
var delta;
var reqId = null; function tick() {   regId = requestAnimationFrame(tick);   now = Date.now();   delta = now - then;   if (delta > interval) {     // 这里不能简单then=now,否则会出现细微时间差问题。例如fps=10,每帧100ms,而现在每16ms(60fps)执行一次draw。16*7=112>100,需要7次才实际绘制一次。这个情况下,实际10帧需要112*10=1120ms>1000ms才绘制完成。     then = now - (delta % interval);     draw(); // ... Code for Drawing the Frame ...   } } tick();

针对低版本浏览器再优化:

var fps = 30;
var now;
var then = Date.now();
var interval = 1000/fps;
var delta;
var reqId = null;
var timeId = null; window.requestAnimationFrame = window.requestAnimationFrame || window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame || window.msRequestAnimationFrame; function tick() {   if(window.requestAnimationFrame) {    reqId = requestAnimationFrame(tick);    now = Date.now();    delta = now - then;    if (delta > interval) { // 这里不能简单then=now,否则还会出现细微时间差问题。例如fps=10,每帧100ms,而现在每16ms(60fps)执行一次draw。16*7=112>100,需要7次才实际绘制一次。这个情况下,实际10帧需要112*10=1120ms>1000ms才绘制完成。      then = now - (delta % interval);      draw(); // ... Code for Drawing the Frame ...    } } else { timeId = setTimeout(tick, interval);
    draw(); } } tick();

停止动画

if(window.requestAnimationFrame){
    cancelAnimationFrame(regId)
}else{
    clearTimeout(timeId)
}

参考文档:js:指定FPS帧频,requestAnimationFrame播放动画

标签:动画,tick,播放,requestAnimationFrame,window,delta,var,now
From: https://www.cnblogs.com/hyt09/p/17446017.html

相关文章

  • css 动画3d旋转案例
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>Title</title><style>body{perspective:500px;}.box{posit......
  • css 动画 keyframes
    动画是CSS3中最具有颠覆性的特征之一,可通过设置多个节点来精确控制一个或一组动画,常用来实现复杂的动画效果.相比较过渡效果,动画可以实现更多变化,更多控制,连续播放等效果.动画的基本使用:步骤分为两步:1.定义动画2.调用动画一.定义动画(类似定义类选择器)@keyframesmov......
  • 谷歌浏览器在用户与Document无交互时无法播放声音问题 - 记录
    谷歌禁止声音播放处理方式1、设置google浏览器,点击地址前面的图标,选择网站设置,找到声音,设置允许,需要用户配合设置2、使用window.AudioContext,需要自己写代码 接口参考地址:https://developer.mozilla.org/zh-CN/docs/Web/API/AudioContext3、使用组件,如:soundman......
  • JS判断视频Video的播放、暂停、结束完成及获取长度事件监听处理
    在日常应用场景中,可能会遇到这么一个情况,需要判断用户是否完整的观看完了一部视频,在这个场景中,和视频相关的事件大体涉及到几个部分,获取视频长度,视频开始播放,暂停播放和播放结束,下面来看下如何通过JavaScript来监听获取视频的这几种状态。(1)html页面视频标签大体如下<videoid="v......
  • GSAP库解决复杂动画
    1.它可以在任何框架上处理页面能够所有通过js改变的元素,不仅可以对div的css属性进行动画,还是SVG、React、Vue、WebGL,甚至和Threejs一起使用。除了GSAP核心库外,还有很多实用的插件,比如结合ScrollTrigger插件,我们可以实现非常震撼的滚动触发效果;同时也不需要担心响应式的问题,GSAP......
  • WPF基础入门——绘画和动画(Draw&Animation)
    本篇文章学习于:刘铁猛老师《深入浅出WPF》XAML语言针对的是界面美化问题,可以让设计师直接加入开发团队、降低沟通成本。XAML的图形绘制功能非常强大,可以轻易绘制出复杂的图标、图画。WPF支持“滤镜”功能,可以像Photoshop那样为对象添加各种效果。WPF原生支持动画开发,无论是设......
  • EasyDSS使用OBS推流成功,但不显示播放按钮是什么原因?
    EasyDSS支持一站式的上传、转码、直播、回放、嵌入、分享功能,具有多屏播放、自由组合、接口丰富等特点。平台可以为用户提供专业、稳定的直播推流、转码、分发和播放服务,全面满足超低延迟、超高画质、超大并发访问量的要求。有用户反馈,使用OBS工具推流到EasyDSS直播间,在录像回看中......
  • 修改开机动画和logo
    修改文件:  AllAudio.mk最后一行添加内容: ......
  • 专业的三维动画制作软件Maya2024最新mac版
    AutodeskMaya2024mac是一款专业的三维动画制作软件,在三维动画制作中,它是一款功能强大、界面友好的软件,它可以轻松创建各种场景类型、材质的动画,并可以将各种元素和模型混合到一起,实现丰富而逼真的效果。→→↓↓载Maya2024mac 一、新的“MayaSoftware”软件套件Maya......
  • EasyCVR开启音频后,视频调阅播放默认为静音的问题优化
    EasyCVR视频融合平台基于云边端一体化架构,部署轻快、功能灵活,平台可支持多协议、多类型设备接入,包括:国标GB28181、RTMP、RTSP/Onvif、海康Ehome、海康SDK、大华SDK、宇视SDK等(具体见下图)。在视频能力上,可实现视频直播、录像、回放、检索、云存储、告警上报、语音对讲、电子地图、集......