javascript - 在另一个窗口的 <canvas> 中显示 <video> - 如何实现全帧率?

标签 javascript html5-video html5-canvas

我在主窗口的 video 元素中播放视频。我想在使用 JavaScript open() 的窗口中的 cavas 中显示视频。 (原始的 video 元素将被隐藏,但它仍将负责播放声音。)

我是这样做的。

<video id='video' style='display: none;' autoplay>
  <source src="http://media.w3.org/2010/05/sintel/trailer.mp4" type='video/mp4' />
  <source src="http://media.w3.org/2010/05/sintel/trailer.webm" type='video/webm' />
  <source src="http://media.w3.org/2010/05/sintel/trailer.ogv" type='video/ogg' />
</video>

我打开一个新窗口并创建一个 canvas 元素。然后我在主窗口中为视频的每个 timeupdate 事件添加一个回调。运行时,我将当前视频帧复制到 Canvas 。

video.addEventListener("play", function() {
  var child = open("/echo/html/", "width=" + video.videoWidth + ",height=" + video.videoHeight);

  child.addEventListener("load", function() {
    var canvas = child.document.createElement("canvas"),
        g2d = canvas.getContext("2d");

    canvas.width = video.videoWidth;
    canvas.height = video.videoHeight;

    child.document.body.appendChild(canvas);

    video.addEventListener("timeupdate", function() {
      g2d.drawImage(video, 0, 0, video.videoWidth, video.videoHeight);
    });
  });
});

你可以看到这个工作 here on jsfiddle但它运行不顺利。似乎每次帧更改时都不会调用 timeupdate 的函数。它很少被调用。

如何在外部窗口中以完整质量显示视频?

最佳答案

timeupdate() 是为显示视频运行时间而设计的,实际上可能不会在每一帧都运行。

要拥有流畅的动画循环,请在消费者端使用 requestAnimationFrame() 循环对其进行动画处理

对于每个 requestAnimationFrame 调用,拉取新的视频帧。

关于javascript - 在另一个窗口的 <canvas> 中显示 <video> - 如何实现全帧率?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12031335/

相关文章:

javascript - HTML5 和 Javascript 仅在可见时播放视频

javascript - 如何将 HTMLAudioElement 当前播放位置重置为 0?

javascript - 使 Canvas 动画成为父 div 上的背景元素

javascript - Codeigniter 显示 ajax 请求

javascript - 为什么 window.onload 仅在某些时候被调用进行刷新?

css - 全屏 HTML5 部分背景视频

javascript - 如何使用for循环在canvas中绘制圆形曲线?

javascript - 图层.删除(图像);无法在 Kinetic.js 中工作

javascript - 将 promise 与 then() 中的 promise 链接起来

javascript - 在 Javascript 中获取字符串中某个字符之前的文本