logo

Hot Plato Blog

h5视频截图

今天说说h5端上,视频截图功能通过Canvas实现。

代码

直接从代码分析

前期准备

<!DOCTYPE html>
<html>
  <head>
    <title>screenshot</title>
    <meta charset="UTF-8" />
  </head>

  <body>
    <video autoplay loop controls id="video"></video>
    <canvas id="screenshot"></canvas>
    <input type="file" accept="video/*" id="videoFile" />
    <div style="text-align: center;">
      <button id="screenshot-btn">screenshot</button>
    </div>
    <script src="src/index.js"></script>
  </body>
</html>
const video = document.getElementById("video");
const videoFile = document.getElementById("videoFile");

const getBase64 = (file) => {
  return new Promise((resolve, reject) => {
    const reader = new FileReader();
    reader.readAsDataURL(file);
    reader.onload = function () {
      resolve(reader.result);
    };
    reader.onerror = function (error) {
      reject(error);
    };
  });
};

videoFile.addEventListener("change", (event) => {
  console.log("select video...");
  getBase64(event.target.files[0]).then((result) => {
    console.log("successful...");
    video.setAttribute("src", result);
  });
});

首先我们需要创建一个video和一个input。我们对input进行监听,当选择视频后,我们将获取到的File转换为Base64,最后填充到video的src中去。

开始截图

const canvas = document.getElementById("screenshot");
const screenshot = document.getElementById("screenshot-btn");

screenshot.addEventListener("click", () => {
  const ctx = canvas.getContext("2d");
  canvas.width = video.videoWidth;
  canvas.height = video.videoHeight;
  ctx.drawImage(video, 0, 0, canvas.width, canvas.height);
  console.log(canvas.toDataURL("image/png"));
});

接着,我们对screenshot按钮监听点击事件,我们从video中获取到视频的长度和宽度,并设置到canvas中。最后,我们只需要调用drawImage方法,将video填入,并x轴为0,y轴为0,长度宽度为canvas的长度宽度(即video的videoWidth和videoHeight)

完整代码Live Demo

问题

在使用过程我们可能采用远程视频资源,可能会遇到跨域的问题。可以参考启用CORS图片进行解决。

总结

h5端视频截图功能结合canvas还是很简单的,canvas也还有更多有趣的特性值得我们开发。

#Javascript #Canvas #Screenshot #Utils