requestVideoFrameCallback

requestVideoFrameCallback: 将新视频帧发送到合成器时运行的回调函数

  • 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>
      /** @type {HTMLVideoElement} */
      const video = document.querySelector('.video');
      /** @type {HTMLCanvasElement} */
      const canvas = document.querySelector('.canvas');

      /** @type {CanvasRenderingContext2D} */
      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) => {
          // console.log('frame', now, metadata.mediaTime);
          drawFrame();
        });
      }

      requestAnimationFrame(drawFrame);
    </script>
  </body>
</html>
posted @ 2024-05-03 22:25  _clai  阅读(25)  评论(0编辑  收藏  举报