基于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
})
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY