-
requestVideoFrameCallback()
的用法与 Window.requestAnimationFrame()
相同。您可以使用它来运行一个回调函数,该函数在下一个视频帧发送到合成器时执行某些操作。当合成下一个视频帧时,再次调用 requestVideoFrameCallback()
以运行回调,以此类推,回调结束
-
requestVideoFrameCallback()
提供对每个单独视频帧的可靠访问。
requestAnimationFrame()
尝试匹配显示刷新率,通常为60 Hz。另一方面,requestVideoFrameCallback()
尝试匹配视频帧速率。更具体地说,回调将以视频帧速率和浏览器绘画刷新速率中的较低者运行。例如,在以60Hz绘制的浏览器中播放帧速率为25fps的视频将以25Hz的速率触发回调。在同一个60 Hz浏览器中运行的帧速率为120 fps的视频将以60 Hz的频率触发回调。
-
requestVideoFrameCallback()
在回调函数中提供有用的视频元数据。
| <!DOCTYPE html> |
| <html lang="en"> |
| <head> |
| <meta charset="UTF-8" /> |
| <meta name="viewport" content="width=device-width, initial-scale=1.0" /> |
| <title>Document</title> |
| <style> |
| .video, |
| .canvas { |
| width: 420px; |
| height: auto; |
| box-sizing: border-box; |
| } |
| </style> |
| </head> |
| <body> |
| <video src="./frag_bunny.mp4" controls audooplay muted loop class="video"></video> |
| <canvas class="canvas"></canvas> |
| |
| <script> |
| |
| const video = document.querySelector('.video'); |
| |
| const canvas = document.querySelector('.canvas'); |
| |
| |
| const ctx = canvas.getContext('2d'); |
| |
| video.addEventListener('loadedmetadata', () => { |
| if (video.videoWidth < video.offsetWidth) { |
| canvas.width = video.offsetWidth * devicePixelRatio; |
| canvas.height = video.offsetHeight * devicePixelRatio; |
| } else { |
| canvas.width = video.videoWidth * devicePixelRatio; |
| canvas.height = video.videoHeight * devicePixelRatio; |
| } |
| }); |
| |
| function drawFrame() { |
| ctx.drawImage(video, 0, 0, canvas.width, canvas.height); |
| video.requestVideoFrameCallback((now, metadata) => { |
| |
| drawFrame(); |
| }); |
| } |
| |
| requestAnimationFrame(drawFrame); |
| </script> |
| </body> |
| </html> |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了