vue3 获取视频第一帧/base64转为blob/blob转为file

img标签使用第一帧方法

:poster="url+'?x-oss-process=video/snapshot,t_1,m_fast'"

获取视频第一帧

//  使用示例
getVideoposter(url, 512, 300)
       .then((base64Data) => {
              let blob = dataURLtoBlob(base64Data);
              let newName = `${file.name.split(".")[file.name.split(".").length - 2]
                }.png`;
              let newFile = blobToFile(blob, newName);
              // 通过上传方法上传至服务器获取返回的URL
              uploadImg(newFile).then((imageUrl) => {
                // you have  an imgUrl! do sth now!
              });
            })
            .catch((e) => {
              console.log("e:", e);
            })
            .finally(() => {});
        } 

// 获取视频封帧数封面base64
/**  
  因为视频中有手机中横屏视频也有竖屏视频  本方法内含视频中间区域截屏
  而非全部截屏 所以有些关于长宽的判断 
  注注注:还有一点需要注明的 也是费了我不少时间才大约弄明白 浏览器好像对base64截图有大小的限制  
  刚开始写的时候没有限制大小取全屏的截图 结果cavas绘制的图 总是上面一部分 
  下面并未绘制  这时候有两个方案 一是降低清晰度 第二是修改浏览器对这个的默认大小
  具体方法百度 总之希望大家不要像我这样自查cavans方法 耽误太多时间 这不是我们的问题
*/
const getVideoposter = async (url, w, h) => {
  return new Promise((resolve, reject) => {
    let imgbase64 = null;
    let video = document.createElement("video");
    video.setAttribute("crossOrigin", "Anonymous");
    video.setAttribute("src", url);
    video.setAttribute("preload", "auto"); // 不设置该项就不会开启预先加载视频,那么拿到的会是黑屏
    //如果不设置currentTime,画出来的图片是空的 当前为截取第0.001秒
    video.currentTime = 0.001;
    // video.onloadeddata = loadedmetadata;
    video.addEventListener("loadeddata", function () {
      let canvas = document.createElement("canvas");
      let vWidth = video.videoWidth;
      let vHeight = video.videoHeight;
      let whScale = vWidth / vHeight;
      let widthBg = 512;
      let heightBg;
      let splitHeight = 0;
      if (vWidth < vHeight) {
        console.log("上下长图片");
        heightBg = 300;
        // heightBg = vHeight * 512 / vWidth;
        splitHeight = vHeight / 2 - 150;
        console.log("splitHeight:", splitHeight);
      } else {
        console.log("左右宽图片");
        heightBg = vHeight;
        // widthBg = heightBg * whScale;
        // console.log('左右宽的widthBg:', widthBg);
      }
      //设置倍数是rate,倍数越大画图的图片越大,加载速度越慢
      let rate = 1;
      canvas.width = widthBg * rate;
      canvas.height = 300;
      // canvas.height = '100%'
      canvas
        .getContext("2d")
        .drawImage(
          video,
          0,
          splitHeight,
          vWidth,
          heightBg,
          0,
          0,
          canvas.width,
          canvas.height
        );
      imgbase64 = canvas.toDataURL("image/png");
      // console.log("uimgbase64rl:",imgbase64);
      resolve(imgbase64);

      // 以下为保存本地图片方案 备用之
      // const MIME_TYPE = 'image/png'; // 保存文件类型
      // const dlLink = document.createElement('a');
      // dlLink.download = '截图'; // 文件名
      // dlLink.href = imgbase64;
      // dlLink.dataset.downloadurl = [MIME_TYPE, dlLink.download, dlLink.href].join(':');
      // document.body.appendChild(dlLink);
      // dlLink.click();
      // document.body.removeChild(dlLink);
    });
  });
};

// 将base64转换为blob
const 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
const blobToFile = (theBlob, fileName) => {
  theBlob.lastModifiedDate = new Date();
  theBlob.name = fileName;
  return theBlob;
};
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容