VUE获取视频某一帧的封面图

html部分
 

<div style="display: none">
        <video
          ref="submissionVideo"
          :src="videoUrl"
          style="width: 200px; height: 268px"
          crossorigin="anonymous"
          @loadedmetadata="getDuration"
          @loadeddata="captureFirstFrame"
          v-if="videoUrl"
        ></video>
      </div>
      <canvas ref="submissionCanvas" style="display: none"></canvas>

JS部分

 // 获取视频封面
    getVideoCover() {
      // 防止生成重复
      if (this.setVideoCoverLoading) return false;
      this.$nextTick(() => {
        const video = this.$refs.submissionVideo; // 获取视频 dom
        const canvas = this.$refs.submissionCanvas; // 获取canvas dom
        const context = canvas.getContext('2d');
        if (!video.readyState) {
          console.error('视频尚未加载完成,无法捕获封面');
          return;
        }
        canvas.width = video.videoWidth;
        canvas.height = video.videoHeight;
        video.currentTime = this.currentTime; // 获取指定时间点的封面
        this.setVideoCoverLoading = true;
        // 监听视频播放时间,获取封面
        video.addEventListener(
          'seeked',
          () => {
            context.drawImage(video, 0, 0, video.videoWidth, video.videoHeight);
            const coverImageDataUrl = canvas.toDataURL('image/png');
            let blob = dataURLtoBlob(coverImageDataUrl);
            let newName = `cover-1.png`;
            let newFile = blobToFile(blob, newName);
            // 调用后端上传接口
            upload(newFile, 0, `cover-1.png`, url => {
              this.submitVideoFrom.cover_url = url;
            });
            setTimeout(() => {
              this.setVideoCoverLoading = false;
            }, 300);
            // 将base64转换为blob
            function dataURLtoBlob(dataurl) {
              let arr = dataurl.split(',');
              let mime = arr[0].match(/:(.*?);/)[1];
              let bstr = window.atob(arr[1]);
              let n = bstr.length;
              let u8arr = new Uint8Array(n);
              while (n--) {
                u8arr[n] = bstr.charCodeAt(n);
              }
              return new Blob([u8arr], { type: mime });
            }
            // 将blob转换为file
            function blobToFile(theBlob, fileName) {
              theBlob.lastModifiedDate = new Date();
              theBlob.name = fileName;
              return theBlob;
            }
          },
          { once: true },
        );
      });
    },

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值