读取视频关键帧图片

思路,用video播放视频到某一秒,之后用canvas把video画成一张图片,从而在客户端得到视频关键帧图片,实现还有一些细节处理

html 复制代码
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <style></style>
  </head>

  <body>
    <input class="input" type="file" />
    <div class="list"></div>
  </body>
  <script>

    function captureKeyFrame(file, time = 0) {
      return new Promise((resolve) => {
        const url = URL.createObjectURL(file);
        const video = document.createElement("video");
        video.width = 150;
        video.height = 200;
        video.src = url;
        video.currentTime = time;
        video.muted = true;
        video.autoplay = true;
        video.oncanplay = async function () {
          const frame = await drawVideo(video);
          resolve(frame);
        };
      });
    }

    /**
     * @description: 用canvas把video画成一张图片
     * @param {*} video
     * @return {*}{ blob: "", url: ""} blob时上传的资源,url是本地资源地址
     */
    function drawVideo(video) {
      return new Promise((resolve) => {
        const canvas = document.createElement("canvas");
        canvas.width = video.width;
        canvas.height = video.height;
        const ctx = canvas.getContext("2d");
        ctx.drawImage(video, 0, 0, canvas.width, canvas.height);
        canvas.toBlob((blob) => {
          resolve({
            blob,
            url: URL.createObjectURL(blob),
          });
        });
      });
    }
  </script>
  <script>
    const input = document.querySelector(".input");
    const list = document.querySelector(".list");

    input.onchange = async function (event) {
      // 清空上一文件的关键帧图片
      list.innerHTML = "";
      const file = event.target.files[0];
      for (let i = 0; i < 10; i++) {
        const frame = await captureKeyFrame(file, i * 1);
        createPreview(frame);
      }
    };

    const createPreview = function (frame) {
      const img = new Image();
      img.src = frame.url;
      list.appendChild(img);
    };
  </script>
</html>
相关推荐
成都渲染101云渲染66664 小时前
如何在3ds Max中实现更快、更高质量的渲染
前端·javascript·人工智能
闲猫6 小时前
Spring AI 对接Deepseek ChatModel 聊天对话
java·前端·spring
自信的未来8 小时前
JSON 工具|Web Worker 工程化打包 + 语法自动修复 + 多语言代码生成实战
java·前端·json
SRET8 小时前
Mineradio 沙盒隔离安装完全指南 | 一键安全运行 Electron 应用!!!
javascript·经验分享·安全·electron·aigc·音视频·ai编程
全栈前端老曹8 小时前
【MongoDB】安全与权限管理 —— 用户认证、角色权限、SSL 加密
前端·javascript·数据库·安全·mongodb·nosql·ssl
Niuguangshuo8 小时前
音频 MOS 演进:从 PESQ 到 SpeechQualityLLM
音视频
zhangxingchao9 小时前
AI大模型核心八:从 Agent Skill、长文档 RAG 到知识库更新与训练策略
前端·人工智能·后端
zhangxingchao9 小时前
AI大模型核心七:从 Workflow、RAG、记忆治理到幂等性
前端·人工智能·后端
gyx_这个杀手不太冷静10 小时前
Agent开发进阶指南(第 1 章):AI Agent 到底是什么?
前端·agent·ai编程
小小小小宇10 小时前
模型相关知识
前端