基于vue3+el-upload 获取视频第一帧截图并上传服务器

//视频上传成功

const handleVideoSuccess: UploadProps['onSuccess'] = ( response,uploadFile) => {

    if (response.status == '500005') {
      detailInfo.video_url = response.result.path
      getVideoCover(response.result)
    }
  }
 
//获取视频第一帧
  function getVideoCover() {
    const video = document.createElement("video");
    video.src = imgUrl+ detailInfo.video_url  //  视频播放地址,imgUrl-域名
    const canvas = document.createElement('canvas')
    canvas.width = 320
    canvas.height = 320
    const ctx:any = canvas.getContext('2d');
    video.crossOrigin = 'anonymous' // 解决跨域问题,也就是提示污染资源无法转换视频
    video.currentTime = 1 // 第一帧

    video.oncanplay = () => {  //视频准备播放
      ctx.drawImage(video, 0, 0, canvas.width, canvas.height)
      const oGrayImg = canvas.toDataURL("image/png");  //获取base64格式的图片
      const fileBolb = convertBase64UrlToBlob(oGrayImg) //转换为二进制
      const data = new FormData();
      data.append('picture_name',fileBolb,'video.png')  //第一个参数为接口参数名
 
      UpLoadApi(data).then((res: any) => {  //已包装好的后台接口
        detailInfo.picture_cover = res.result.path
      })
      video.remove();
      canvas.remove();
    }
  }
 
//base64转换为二进制流文件
  function convertBase64UrlToBlob(urlData:any){
    var arr = urlData.split(','), mime = arr[0].match(/:(.*?);/)[1],
        bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
    while(n--){
        u8arr[n] = bstr.charCodeAt(n);
    }
    return new Blob([u8arr], {type:mime});
}
 
//备注:后台接口  index.ts文件
import request from '@/utils/request';
export function UpLoadApi(data:any) {
  return request({
      url: '/common/uploadPic',
      method: 'post',
      headers: { "Content-Type": "multipart/form-data" },
      data: data
  })
}
 
posted @   世界很大梦想很远  阅读(1239)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
点击右上角即可分享
微信分享提示