获取视频第一帧,以及后续上传

javascript 复制代码
// 获取视频基本信息
const getVideoBasicInfo = (videoSrc) => {
    return new Promise((resolve, reject) => {
        const video = document.createElement("video");
        video.src = videoSrc;
        // 视频一定要添加预加载
        video.preload = "auto";
        // 视频一定要同源或者必须允许跨域
        video.crossOrigin = "Anonymous";
        // 监听:异常
        video.addEventListener("error", (error) => {
            reject(error);
        });
        // 监听:加载完成基本信息,设置要播放的时常
        video.addEventListener("loadedmetadata", () => {
            const videoInfo = {
                video,
                width: video.videoWidth,
                height: video.videoHeight,
                duration: video.duration,
            };
            resolve(videoInfo);
        });
    });
};
javascript 复制代码
// 将获取到的视频信息,转化为图片地址
const getVideoPosterInfo = (videoInfo) => {
    return new Promise((resolve) => {
        const { video, width, height } = videoInfo;
        video.addEventListener("canplay", () => {
            const canvas = document.createElement("canvas");
            canvas.width = width;
            canvas.height = height;
            const ctx = canvas.getContext("2d");
            ctx.drawImage(video, 0, 0, width, height);
            const posterUrl = canvas.toDataURL("image/jpg");
            resolve({ posterUrl });
        });
    });
};

此函数就是最终可以拿到图片地址的函数了。

javascript 复制代码
//获取处理后的图片地址
const getImgUrl = async (videoSrc) => {
    let videoInfo = await getVideoBasicInfo(videoSrc);
    let {posterUrl} = await getVideoPosterInfo(videoInfo);
    return posterUrl
};

拓展:

如果还需要将拿到的图片进行上传到远程服务器的处理 例如阿里云或者OSS服务器中则看下面代码继续处理

javascript 复制代码
//base64转file 文件
const base64ToFile = (data) => {
  // 将base64 的图片转换成file对象上传 atob将ascii码解析成binary数据
  let binary = atob(data.split(",")[1]);
  let mime = data.split(",")[0].match(/:(.*?);/)[1];
  let array = [];
  for (let i = 0; i < binary.length; i++) {
    array.push(binary.charCodeAt(i));
  }
  let fileData = new Blob([new Uint8Array(array)], {
    type: mime,
  });
  let file = new File([fileData], `${new Date().getTime()}.png`, {
    type: mime,
  });
  return file;
}

最终上传工具就写完了。 实际调用 只需要传递 视频地址即可。

javascript 复制代码
//获取OSS地址
const uploadImgUrl = async(videoSrc)=>{
  let imgUrl = await getImgUrl(videoSrc)
  let fileList= base64ToFile(imgUrl)
  var formData = new FormData()
  formData.set('filename', fileList)
  formData.set('merchantId', localStorage.getItem('MerchantId'))
  formData.set('Directory', 'Image')
  return new Promise((resolve, reject) => {
    axios.post(`${configs.host.test}/api/FileUpload/Upload`, formData)
      .then(res => {
        resolve(res.data);
      })
  });
}

export {
  uploadImgUrl
}
相关推荐
DogDaoDao4 小时前
Android 硬件编码器参数完全指南:MediaCodec 深度解析
android·音视频·视频编解码·h264·硬编码·视频直播·mediacodec
音视频牛哥5 小时前
大牛直播SDK(SmartMediaKit)Windows平台RTSP/RTMP直播播放SDK集成说明(C#版)
音视频·低延迟rtsp播放器·windows rtsp播放器·windows rtmp播放器·低延迟rtmp播放器·c# rtsp播放器·c# rtmp播放器
薛定猫AI8 小时前
【深度解析】Gemini Omni 多模态生成与 Agent 化创作工作流:从视频编辑到 UI 生成的技术演进
人工智能·ui·音视频
音视频牛哥16 小时前
大牛直播SDK(SmartMediaKit)Windows平台RTSP/RTMP直播播放SDK集成说明(C++版)
windows·音视频·实时音视频·windows rtsp播放器·windows rtmp播放器·超低延迟rtsp播放器·超低延迟rtmp播放器
EasyGBS17 小时前
1分钟讲清楚选EasyNVR还是国标GB28181视频平台EasyGBS:路线不同,别选错
音视频
日光明媚19 小时前
深度解析 SGLang 框架 Wan2.1 视频生成加速技术:从 49 分钟到 1 分钟的极致优化
人工智能·计算机视觉·aigc·音视频·sglang
小猿君19 小时前
谷歌I/O前夜Veo 4遭泄露,AI视频底层逻辑浮出水面
人工智能·音视频
南山有乔木78919 小时前
音频怎么转换MP3格式?M4A、WAV、FLAC转mp3实测有效的格式转换方法
音视频
不昀19 小时前
音频变压器Bourns SM-LP-5001国产替代选型指南
网络·音视频·以太网·网络通信·电子元器件
REDcker19 小时前
RGB与YUV像素格式详解
音视频·实时音视频·视频编解码·yuv·rgb