返回介绍

原生 30 行代码实现视频截图

发布于 2024-09-07 23:55:54 字数 1818 浏览 0 评论 0 收藏 0

基本原理就是把视频画到 Canvas 里面,然后调用 toDataURL 或者 toBlob ,再利用 a 标签模拟点击,download 属性指定名字。

看一下效果:

image.png

   function captureVideo(videoEl) {
      let canvasEl;
      let dataUrl;
      try {
        const cps = window.getComputedStyle(videoEl);
        const width = +cps.getPropertyValue("width").replace("px", "");
        const height = +cps.getPropertyValue("height").replace("px", "");

        canvasEl = document.createElement("canvas");
        canvasEl.style.cssText = `position:fixed;left:-9999px`;
        canvasEl.height = height;
        canvasEl.width = width;

        document.body.appendChild(canvasEl);

        const ctx = canvasEl.getContext("2d");
        ctx.drawImage(videoEl, 0, 0, width, height);
        // const image = canvas.toDataURL("image/png");
        dataUrl = canvasEl.toDataURL();

        document.body.removeChild(canvasEl);
        canvasEl = null;
        return dataUrl;
      } finally {
        if (canvasEl) {
          document.body.removeChild(canvasEl);
        }
        if (dataUrl) {
          return dataUrl;
        }
      }
    }

示例 注意添加 crossorigin="anonymous" ,不然转为图片会失败。

  <video id="videoEL" controls autoplay crossorigin="anonymous"
    src="https://api.dogecloud.com/player/get.mp4?vcode=5ac682e6f8231991&userId=17&ext=.mp4" width="500"></video>

function download(url) {
  const aEl = document.createElement("a");
  aEl.href = url;
  aEl.download = "视频.png";
  aEl.click();
}


function doCaptureVideo() {
  const url = captureVideo(videoEL);
  download(url);
}

doCaptureVideo()

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文