canvas截取多个视频的第一帧,第n秒画面

这篇具有很好参考价值的文章主要介绍了canvas截取多个视频的第一帧,第n秒画面。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

业务涉及视频预览,不点击视频则不播放而是先展示视频的画面给到用户

“因为本人特别喜欢梅艳芳,所以也留存了很多她的视频,这里就以她的视频做测试了”

截取多个视频的第一帧,使用:Promise+loadeddata事件+canvas

Promise来帮助我们顺序地拿到多个视频的第一帧画面

loadeddata事件的触发时机在MDN上是这样表述的:

事件在媒体当前播放位置的视频帧(通常是第一帧)加载完成后触发。

所以如果我们想要获取第一帧,就可以使用loadeddata事件

可以直接把canvas写进该事件中【不过因为第一帧时机问题,会有右图所示的黑屏出现】

canvas截取多个视频的第一帧,第n秒画面canvas截取多个视频的第一帧,第n秒画面

// 以三个视频举例子
let videoArr = ["./fengdejijie.mp4", "./xiyang.mp4", "./gushenzouwolu.mp4"]
videoArr.forEach((item) => {
    let img = document.createElement("img")
    getFirstImgBase64(item,400,240).then((res) => {
        img.src = res
    })
    document.documentElement.appendChild(img)
})

// 将截取操作封装到一个函数中
function getFirstImgBase64(url, w, h) {
  // 返回一个Promsie,这样有助于我们顺序的拿到多个视频的画面
  return new Promise(function (resolve, reject) {
    let dataURL = ""
    let video = document.createElement("video")
    video.setAttribute("crossOrigin", "anonymous") //处理跨域,保证可以读取到视频
    video.setAttribute("src", url)
    video.setAttribute("preload", "auto") // 不设置该项就不会开启预先加载视频,那么拿到的会是黑屏
    // 第一帧加载完毕时调用
    video.addEventListener("loadeddata", function () {
      let canvas = document.createElement("canvas")
      canvas.width = w //canvas的尺寸————可以理解为画板的尺寸————最终img占据的大小
      canvas.height = h
      //绘制canvas,[资源地址,绘制起始横坐标,绘制起始纵坐标,绘制宽度,绘制高度]
      //————宽度高度可以理解为绘制的图像的尺寸,和上面的画板canvas的尺寸做好区分
      canvas.getContext("2d").drawImage(video, 0, 0, w, h) 
      dataURL = canvas.toDataURL("image/jpeg") //转换为base64
      resolve(dataURL)
    })
  })
}

下面来看看截取视频的第n秒的画面如何实现

其实可以从video的currentTime入手,设置video的currentTime来让canvas截取当前时刻的画面

通过设定视频的currentTime就可以大大降低截取的画面是黑幕的概率

不过要注意自己设置的【currentTime】不能超过视频的总长度也就是video的duration属性值

video.currentTime以及video.duration拿到的数据单位是【秒】,我们确定好第几秒即可

let videoArr = ["./fengdejijie.mp4", "./xiyang.mp4", "./gushenxiyang.mp4"]
videoArr.forEach((item) => {
  let img = document.createElement("img")
  getFirstImgBase64(item, 400, 240, 135).then((res) => {
    img.src = res
  })
  document.body.appendChild(img)
})
// 将截取操作封装到一个函数中(视频地址,画板/图像宽、高,目标时刻)
function getFirstImgBase64(url, w, h, targetTime) {
  // 返回一个Promsie,这样有助于我们顺序的拿到多个视频的画面
  return new Promise(function (resolve, reject) {
    let dataURL = ""
    let video = document.createElement("video")
    console.log(video.currentTime)
    video.src = url
    video.crossOrigin = "anonymous"
    video.preload = "auto"
    // ★设定播放位置以获取当前播放位置的图像
    video.currentTime = targetTime
    // ★canplay事件——还没有加载足够的数据来播放媒体直到其结束,只加载了媒体当前位置的数据
    video.addEventListener("canplay", function () {
      console.log(video.duration, video.currentTime)
      let canvas = document.createElement("canvas")
      canvas.width = w //canvas的尺寸和图片一样
      canvas.height = h
      canvas.getContext("2d").drawImage(video, 0, 0, w, h) //绘制canvas,[资源地址,绘制起始横坐标,绘制起始纵坐标,绘制宽度,绘制高度]
      dataURL = canvas.toDataURL("image/jpeg") //转换为base64
      resolve(dataURL)
    })
  })
}

canvas截取多个视频的第一帧,第n秒画面

 文章来源地址https://www.toymoban.com/news/detail-404704.html

到了这里,关于canvas截取多个视频的第一帧,第n秒画面的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • js(ts)截取视频第一帧作为封面图

    直接上代码: 这里有三个地方需要注意: 1. 需要加上 preload 属性 这是防止截图结果为黑屏的关键一步 2. canvas宽高的设置 网络上其它文章的代码都直接读取 video.width 和 video.height ,会导致如果是竖视频截取出来的封面图在横显示时会变形 3. 判断图片有效性 有时候截取到的图

    2024年02月10日
    浏览(39)
  • video截取视频第一帧作为播放前默认图片

    重要!不设置会导致第一帧图片不显示 实现js 附上全部代码

    2024年02月12日
    浏览(47)
  • vue2实现截取视频第一帧图像作为开始封面

    要在Vue中实现截取视频的第一帧作为封面,你可以使用HTML5的元素和Canvas API来实现。loadeddata事件监听必须在视频加载完成后执行,然后通过Canvas的drawImage方法将视频帧绘制到Canvas上,并使用toDataURL方法将Canvas内容转换为Base64编码的图像数据URL 在你的Vue组件中,使用元素来加

    2024年02月12日
    浏览(37)
  • vue 获取上传视频的第一帧做为视频封面

    上一篇文章记录了vue上传视频,接下来,需要在上传成功后截取视频第一帧做为视频封面。 具体实现如下: 上传视频之后,在成功回调函数中拿到视频地址, video.src=url ,然后,使用canvas截取图片。 截取视频第一帧使用的是canvas,相关步骤如下: canvas 可以用来截取图片。

    2024年02月03日
    浏览(45)
  • uni-app App和H5平台上传视频截取视频第一帧生成图片

    提示:因为uni-app中renderjs仅支持App和H5平台,所以该方案仅支持当前这两个平台。 this.request为本人封装的接口请求方法,可以替换成个人的接口请求方法,如有需要可在下方留言 因为uni-app App端没有dom概念,不支持dom操作,并且uni-app的canvas不支持绘制video。renderjs完美解决了

    2023年04月09日
    浏览(57)
  • get两个js小技能——JS截取视频第一帧&图片转Base64

    由于开发之前做的VisualDrag拖拽模板优化的时候,拖拽进去的图片、视频文件等需要进行截图作为封面,目前采用的截图方法是htme2canvas,使用canvas进行的截图操作,所以就会遇到这样的问题,视频和图片图床简单的使用标签加入canvas画布里面无法正确的截图成功。最后采取的

    2024年02月12日
    浏览(37)
  • JS 截取视频某一帧图片 实现视频截图

    第一步:创建video用于存放需要截取的视频文件 第二步:创建canvas画布,用于绘制截取到的图片 1,定义创建一个 canvas 标签; 2,指定 canvas 标签的宽高; 3, 调用canvas元素中的 getContext() 方法(返回一个用于在画布上绘图的环境)。 要注意的是 drawImage() 的第一个参数不再是player而

    2024年02月12日
    浏览(45)
  • 提取视频中的某一帧画面,留住视频中的美好瞬间

    你是否曾经被视频中的某一帧画面深深吸引,却又惋惜于无法将其永久保存?现在,有了我们【媒体梦工厂】,这一遗憾将成为过去,这个软件可以提取视频中的某一帧保存为图片,为你留住那些稍纵即逝的美好。 所需工具: 一个【媒体梦工厂】软件 视频素材 操作步骤:

    2024年01月25日
    浏览(42)
  • js截取video视频某一帧做封面的简单案例

    可以使用 canvas 元素来截取视频某一帧并生成封面。 首先,在 video  标签上设置视频源地址和自动播放属性: 然后,在 canvas  标签上定义宽高和样式,并通过 JavaScript 获取视频元素和 canvas 元素: 接着,定义一个函数来截取视频某一帧,并将其渲染到 canvas 上: 在需要生成

    2024年02月04日
    浏览(55)
  • Js使用ffmpeg进行视频剪辑和画面截取

    使用场景是需要在web端进行视频的裁剪,包括使用 在线视频url 或 本地视频文件 的裁剪,以及对视频内容的截取等功能。 前端进行视频操作可能会导致性能下降,最好通过后端使用java,c++进行处理,本文的案例是备选方案。 注意: 以下所有的使用案例均基于vue3 setup。 同时

    2024年02月07日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包