Skip to main content

如何在画布上显示视频

要在画布上绘制视频,我们可以使用 <video> DOM 元素,类似于 <img> 元素,但我们必须频繁地重绘图层。为此,我们可以使用 Konva.Animation。作为替代方案,您可以使用 requestAnimationFrame 并仅调用 layer.draw()

另外,请查看这篇文章以获取更多信息: 案例研究: 流媒体视频编辑器

下面的演示展示了如何在画布上使用播放/暂停控件显示视频。您还可以拖放视频。

import Konva from 'konva';

// 创建按钮
const playButton = document.createElement('button');
playButton.textContent = '播放';
playButton.id = 'play';
document.body.appendChild(playButton);

const pauseButton = document.createElement('button');
pauseButton.textContent = '暂停';
pauseButton.id = 'pause';
document.body.appendChild(pauseButton);

const width = window.innerWidth;
const height = 300;

const stage = new Konva.Stage({
  container: 'container',
  width: width,
  height: height,
});

const layer = new Konva.Layer();
stage.add(layer);

const video = document.createElement('video');
video.src =
  'https://upload.wikimedia.org/wikipedia/commons/transcoded/c/c4/Physicsworks.ogv/Physicsworks.ogv.240p.vp9.webm';

const image = new Konva.Image({
  image: video,
  draggable: true,
  x: 50,
  y: 20,
});
layer.add(image);

const text = new Konva.Text({
  text: '正在加载视频...',
  width: stage.width(),
  height: stage.height(),
  align: 'center',
  verticalAlign: 'middle',
});
layer.add(text);

const anim = new Konva.Animation(function () {
  // 什么也不做,动画只是需要更新图层
}, layer);

// 在元数据加载时更新 Konva.Image 大小
video.addEventListener('loadedmetadata', function () {
  text.text('按下播放...');
  image.width(video.videoWidth);
  image.height(video.videoHeight);
});

document.getElementById('play').addEventListener('click', function () {
  text.destroy();
  video.play();
  anim.start();
});
document.getElementById('pause').addEventListener('click', function () {
  video.pause();
  anim.stop();
});

演示展示了如何:

  1. 创建一个视频元素并将其用作 Konva.Image 的源
  2. 为视频实现播放/暂停控制
  3. 使用 Konva.Animation 在视频播放时连续更新图层
  4. 在画布上使视频可拖动
  5. 显示加载和播放状态信息
  6. 处理视频元数据以设置正确的尺寸

尝试播放视频并将其拖动到画布上。视频会在您移动时继续播放。