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');

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);
});
video.src =
'https://upload.wikimedia.org/wikipedia/commons/transcoded/c/c4/Physicsworks.ogv/Physicsworks.ogv.240p.vp9.webm';

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. 处理视频元数据以设置正确的尺寸

尝试播放视频并在画布上拖动它。移动视频时,视频将继续播放。