js 实现视频封面截图

今天给大家分享一下,如何实现视频封面截取功能,这里主要用到了 HTML5 的 canvas 相关的 api 和 js 相关的一些知识,话不多说,直接上代码: 

<template>
  <div>
    <div class="margin-tb-sm">
      <button type="primary" @click="cutImage">请截取封面</button>
    </div>
    <div class="flex margin-top-sm">
      <div class="padding-right-xs">
        <video
          ref="video"
          :src="videoUrl"
          controls
          loop
          style="max-width: 200px;"
          crossorigin="anonymous" ></video>
        <!-- crossorigin="anonymous" 如果视频链接和你的项目不在一个域名下,加上这个解决跨域 -->
      </div>
      <div class="padding-left-xs">
        <canvas ref="canvas" style="display: none;"></canvas>
        <img v-show="coverImageBase64" :src="coverImageBase64" alt="封面图" style="max-width: 200px;" ref="coverImage" />
      </div>
    </div>
  </div>
</template>
<script>
export default {
  data() {
    return {
      coverImageBase64: '', // 视频封面截图
      videoUrl: 'example.mp4' // 替换成你的视频地址
    }
  },
  methods: {
    cutImage() {
      this.$refs.video.pause()
      this.clearCanvas()
      this.capturePoster()
    },
    clearCanvas() {
      const canvas = this.$refs.canvas // 获取canvas元素
      var ctx = canvas.getContext('2d') // 获取2D渲染上下文
      ctx.clearRect(0, 0, canvas.width, canvas.height) // 重置画布尺寸清空画布
    },
    capturePoster() {
      const video = this.$refs.video
      const canvas = this.$refs.canvas
      const ctx = canvas.getContext('2d')
      canvas.width = video.videoWidth
      canvas.height = video.videoHeight
      ctx.drawImage(video, 0, 0, canvas.width, canvas.height)
      // toDataURL() 将画布上的所有内容(包括绘制的图形、文本、图像等)编码为一个 base64 编码的字符串
      const base64Data = canvas.toDataURL('image/png')
      this.coverImageBase64 = base64Data
    },
    base64ToBlob(base64Data, contentType) {
      const sliceSize = 512
      // atob() 用于解码 Base64 编码字符串
      const byteCharacters = atob(base64Data.split(',')[1])
      const byteArrays = []
      for (let offset = 0; offset < byteCharacters.length; offset += sliceSize) {
        const slice = byteCharacters.slice(offset, offset + sliceSize)
        const byteNumbers = new Array(slice.length)
        for (let i = 0; i < slice.length; i++) {
          byteNumbers[i] = slice.charCodeAt(i)
        }
        const byteArray = new Uint8Array(byteNumbers)
        byteArrays.push(byteArray)
      }
      return new Blob(byteArrays, { type: contentType })
    }
  }
}
</script>

知识点归纳: 

atob() 方法是一个非常实用的 JavaScript 内置函数,可以轻松地处理 base-64 编码的数据 ;

canvas.toDataURL() 是用于将 HTML5 <canvas> 元素的内容转换为一个数据 URL(data URL)的方法。这个数据 URL 可以被用于在网页上直接显示图像,或者在服务器端处理时作为图像数据的传输方式。

语法

var dataURL = canvas.toDataURL(mimeType, quality);

参数

  • mimeType (可选): 指定输出图像的 MIME 类型。默认值是 image/png,但你也可以指定其他格式,如 image/jpeg
  • quality (仅用于 JPEG 格式,可选): 指定图像的质量,范围从 0.0(最差质量,文件最小)到 1.0(最佳质量,文件最大)。如果省略该参数,则默认值为 0.92。

返回值

该方法返回一个包含完整 MIME 类型和 base64 编码数据的字符串。例如:

data:image/png;base64,iVBORw0KG...
要通过JavaScript获取本地视频封面,你可以使用微信小程序的API来实现。以下是一种可能的实现方式: 1. 在wxml文件中,添加一个video组件,并设置id和src属性,如下所示: ```html <video id="myVideo" src="{{videoSrc}}" poster="{{posterSrc}}"></video> ``` 其中,videoSrc是你要播放的视频路径,posterSrc是封面图片的路径。 2. 在对应的js文件中,使用wx.createVideoContext方法创建一个视频上下文对象,并通过该对象获取视频封面: ```javascript // 获取video组件的上下文对象 const videoContext = wx.createVideoContext('myVideo'); // 在视频加载完成后,获取封面 videoContext.onCanplay(() => { // 获取视频封面 videoContext.seek(0); // 将视频跳转到0秒处 videoContext.onSeeked(() => { // 获取封面图片数据 wx.canvasToTempFilePath({ canvasId: 'myCanvas', // 使用一个canvas元素来绘制视频帧 x: 0, y: 0, width: 320, // 设置canvas的宽度和高度与视频尺寸保持一致 height: 240, destWidth: 320, destHeight: 240, success(res) { console.log(res.tempFilePath); // 输出封面图片的临时路径 }, fail(res) { console.error(res); } }); }); }); ``` 在这段代码中,我们首先使用wx.createVideoContext方法创建一个视频上下文对象,然后监听videoContext的onCanplay事件,在视频可以播放时触发。在onCanplay回调函数中,我们使用videoContext.seek方法将视频跳转到0秒处,并使用videoContext.onSeeked监听视频跳转完成的事件。在onSeeked回调函数中,我们使用wx.canvasToTempFilePath方法将视频当前帧绘制到canvas上,并获取封面图片的临时路径。 注意:为了使用canvasToTempFilePath方法,你需要在wxml文件中添加一个canvas组件,并设置一个id属性,如下所示: ```html <canvas id="myCanvas" style="display: none;"></canvas> ``` 这段代码中,我们将canvas隐藏起来,不显示在页面上。 这样,通过以上代码,你就可以在微信小程序中获取本地视频封面了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值