小元
博客
详情文字在这里缓缓展开
静候你翻开这一页

截取视频中的某一刻为封面

JS基于Canvas实现截取视频中的某个时间节点,并生成图片。

截取视频封面


   简述:

       基于Canvas和Video,截取视频中的某个时间节点中的画面为视频封面。


   思路:

       1. 创建一个video标签,设置跨域、src等。

       2. 给video注册相关事件,在视频加载完成后设置视频的宽和高,或跳转到指定的时间节点。

       3. 在当前帧准备完成后,创建一个canvas画布,并设置相关属性,然后向里面加入视频,用toBlod获取blob流。


   代码:

/**
 * url 视频地址
 * w 宽度
 * h 高度
 * time 时间节点
 * */
const getVideoCover = (params: {url: any, w?: string | number, h?: string | number, time?: number}): Promise<Blob | boolean> => {
  return new Promise<Blob>((resolve, reject) => {
    if (!params.url) {
      console.error("缺少URL!!");
      reject(false);
      return;
    }

    const video = document.createElement("video")
    video.setAttribute("crossOrigin", "anonymous")
    video.setAttribute("src", params.url)
    video.setAttribute("preload", "auto")


    const captureTime = params.time || 0;

    video.addEventListener("loadedmetadata", function() {
      video.setAttribute("width", params.w || video.videoWidth);
      video.setAttribute("height", params.h || video.videoHeight);

      video.currentTime = captureTime;
    });

    video.addEventListener("loadeddata", function () {
      const canvas: HTMLCanvasElement = document.createElement("canvas");
      const width = video.width;
      const height = video.height;
      canvas.width = width;
      canvas.height = height;
      canvas.getContext("2d")!.drawImage(video, 0, 0, width, height)
      canvas.toBlob((blob) => resolve(blob as Blob), "image/jpeg")
      canvas.toDataURL("image/jpeg")
    })
  })
};

getVideoCover({
  url: targetVideo,
  w: 500,
  h: 300,
  time: 3000
}).then((res) => {
  if (typeof res === "boolean") return;
  // imgSrc为图片地址
  imgSrc.value = URL.createObjectURL(res);
})


渝ICP备2024031078号-1
本网站一切内容不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
如无意中侵犯了企业或个人的知识产权等,请及时通过电子邮件(1102905617@qq.com)告知我,本网站将会给予删除。
最新公告
😊访客你好,很高兴你的到来,本博客仍在建设中,还有些许功能尚在开发中,最后祝你在此能有所收获。
💥小元博客第三代自2025年9月上线以来,2026/08/09日迎来了它的第三次更新本次更新内容如下:
1. 文章详情页样式变更,由原来的弹窗改为单独的页面。
2. 使用Nuxt对项目进行了SEO优化,优化了搜索引擎的抓取和索引。
3. 对验签进行了优化,降低了请求被误触发拦截的概率。
4. 移动端也正在稳步推进中,在不久的将来会与大家见面。
5. 修复了首页黄历节日不显示的问题,以及其它bug的修复。