首页 > 其他分享 >js实现视频截图

js实现视频截图

时间:2024-07-04 18:58:39浏览次数:14  
标签:视频 截图 const canvas js filename file new videoElement

截图原理:文件上传,将视频绘制到canvas中进行截图

贴代码

工具函数->base64 转成文件

export const dataURLtoFile = ({
  dataURL = "",
  filename = ""
}: {
  dataURL: string
  filename: string
}) => {
  const arr = dataURL.split(",")
  const mime = arr[0].match(/:(.*?);/)[1]
  const bstr = atob(arr[1])
  let n = bstr.length
  const u8arr = new Uint8Array(n)
  while (n--) {
    u8arr[n] = bstr.charCodeAt(n)
  }
  return new File([u8arr], filename, { type: mime })
}

 

工具函数->将视频绘制到canvas上

function drawVideoToCanvas({
  videoElement,
  filename
}: {
  filename: string
  videoElement: HTMLVideoElement
}): Promise<{ file: Blob; url: string }> {
  return new Promise(resolve => {
    const canvas = document.createElement("canvas")
    const ctx = canvas.getContext("2d")
    canvas.width = videoElement.videoWidth
    canvas.height = videoElement.videoHeight
    if (!ctx) {
      return new Error("ctx is not defined!")
    }
    ctx.drawImage(videoElement, 0, 0, canvas.width, canvas.height)
    const dataURL = canvas.toDataURL("image/png")
    const file = dataURLtoFile({
      dataURL,
      filename
    })
    const url = URL.createObjectURL(file) // 实现本地预览
    resolve({
      file,
      url
    })
  })
}

 

播放视频,图片截取

export function captureFrame({
  file,
  time = 0,
  filename = "screenshot.png"
}: {
  file: Blob
  time?: number
  filename?: string
}): Promise<{ file: Blob; url: string }> {
  return new Promise(resolve => {
    // 因为dom节点没有渲染到浏览器,视频播放到指定的时间就会停止播放
    const videoElement = document.createElement("video")
    videoElement.currentTime = time // 设置截取的帧时间
    // 自动播放存在兼容性问题,设置静音解决自动播放在不同浏览器的兼容性问题
    videoElement.muted = true
    videoElement.autoplay = true
    videoElement.src = URL.createObjectURL(file)
    videoElement.oncanplay = async function () {
      const flame = await drawVideoToCanvas({ filename, videoElement })
      resolve(flame)
    }
  })
}

 

下面是react代码示例

const Example28 = () => {
  return (
    <div>
      <input
        type="file"
        onChange={event => {
          const [file] = event.target.files || []
          captureFrame({ file, time: 1 }).then(data => {
            console.log(data)
            const IMG = new Image()
            IMG.src = data.url
            IMG.width = 200
            document.body.append(IMG)
          })
        }}
      />
    </div>
  )
}

export default Example28

 

示例截图

 

标签:视频,截图,const,canvas,js,filename,file,new,videoElement
From: https://www.cnblogs.com/yz-blog/p/18284468

相关文章

  • 商务视频推广打造有吸引力的7个秘诀-华媒舍
    商务视频推广是现代企业发展的重要工具,它能够帮助企业吸引更多的目标客户,提升品牌知名度,增加销售量。但是,如何打造一部有吸引力的商务视频推广呢?本文将为您介绍7个秘诀,帮助您在商务视频推广中取得成功。1. 视频内容突出独特性第一个秘诀是要确保您的商务视频内容独具特色。......
  • next.js 利用中间件(middleware.ts)实现PC与移动互相丝滑跳转
    场景描述产品要求开发一个落地页,为了美观,他要求这个两个页面分开设计,PC页面路由是`/landingpage`,移动端页面是`/landingpage/mobile`从用户角度出发,现在有一种访问场景,假如用户A正在访问PC页面`/landingpage`,然后他要把这个页面以微信方式分享给用户B,用户通过手机方式打开,那这个......
  • uniapp中renderjs的使用
    renderjs是一个运行在视图层的js。它只支持app-vue和web。renderjs的主要作用有2个:1.让APP端引入web端的js库,可以使用web的功能2.大幅降低逻辑层和视图层的通讯损耗,提供高性能视图交互能力<template><view><button@click="lzRend.emitData">触发renderjs......
  • [NodeJS] NodeJS事件循环
    JS是单线程的,如果出现阻塞会严重影响代码执行效率。NodeJS通过事件循环,尽可能地将耗时任务委派给系统内核来实现非阻塞IO。NodeJS提供了许多和异步相关的API,除了语言标准规定的setTimeout和setInterval,还有setImmediate和process.nextTick。经常和这几个出现在面试题里的还有Pr......
  • 最有效的ResultSet转换为JSON?
    最有效的ResultSet转换为JSON? 原文链接: https://cloud.tencent.com/developer/information/%E6%9C%80%E6%9C%89%E6%95%88%E7%9A%84ResultSet%E8%BD%AC%E6%8D%A2%E4%B8%BAJSON%EF%BC%9F-article最有效的ResultSet转换为JSON的方法是使用Java中的Jackson库。Jackson是一个......
  • 每天10个js面试题(一)
    1.js基本数据类型?JavaScript共有八种数据类型,分别是Undefined、Null、Boolean、Number、String、Object、Symbol、BigInt。其中Symbol和BigInt是ES6中新增的数据类型2.let、const、var的区别?let和const有暂时性死区,var没有let和const声明的变量具有块级作用域,var没有......
  • Jspxcms v9.0.0代码审计
    复现了jspxcmsv9.0.0的文件上传、SSRF、Shiro反序列化漏洞,记录了其中发生的问题及解决方法环境搭建这部分就不讲了,主要在tomcat上部署会遇到一些问题,文中也会给出解决方法任意文件上传登录后台(账号admin密码空)在文件上传处,可以上传zip压缩包,且上传的压缩包会自动解压抓包查......
  • Winform中使用HttpClient实现调用http的post接口并设置传参content-type为application
    场景Winform中怎样使用HttpClient调用http的get和post接口并将接口返回json数据解析为实体类:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/124157296上面使用HttpClient调用post接口时使用的HttpContent的格式为application/x-www-form-urlencoded对应的代码......
  • 通过arcgis of Js 4.x 加载 高德地图
    关于如何加载高德地图,目前在网上找到的切片图片加载的高德地图主要是参考官方demo上的CustomTileLayer然后修改进行使用的具体代码如下:<!DOCTYPEhtml><html><head><metacharset="utf-8"><metaname="viewport"content="initial-scale=1,maximum-scale=1,u......
  • HTML 视频(Video)
     在HTML中播放视频的方法有很多种。HTML视频(Videos)播放实例<videowidth="320"height="240"controls><sourcesrc="movie.mp4"type="video/mp4"><sourcesrc="movie.ogg"type="video/ogg">&l......