vue上传视频并且截取视频图片

一,写好上传文件代码,使用的是el文件上传组件

<el-upload class="upload-demo" accept=".mp4,.jpg" :limit="1" :on-exceed="onExceed"
    :before-remove="beforeRemove" :before-upload="beforeUpload" :on-preview="onPreview" drag
    :on-progress="onProgress" action="https://jsonplaceholder.typicode.com/posts/" multiple>
    <i class="el-icon-upload"></i>
    <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
    <div class="upload-btn">上传视频</div>
    <div class="el-upload__tip" slot="tip">只能上传mp4文件,且不超过8GB</div>
</el-upload>

二,使用上传文件之前的钩子beforeUpload获取视频路径、dom和其他需要的信息,并且写入自己的校验方法

beforeUpload(file) {
    let thia = this
    var url = URL.createObjectURL(file);
    var audioElement = new Audio(url);
    var duration;
    audioElement.addEventListener("loadedmetadata",
        function () {
            duration = parseInt(audioElement.duration); //时长为秒,取整          
            // console.log(audioElement.currentSrc);
            thia.getPictures(url, duration, file.name)
        });
    const fileSuffix = file.name.substring(file.name.lastIndexOf(".") + 1);
    const whiteList = ["mp4", "jpg"];
    if (whiteList.indexOf(fileSuffix) === -1) {
        this.$message.error('上传文件只能是 mp4格式');
        return false;
    }
    const isLt2M = file.size / 1024 / 1024 / 1024 < 8;
    if (!isLt2M) {
        this.$message.error('上传文件大小不能超过 8GB');
        return false;
    }
},

三,把视频使用画布画出来,获取到Base64字符串,可以直接使用

getPictures(url, time, name) {
            var canvas = document.createElement('canvas')
            var videoElement = document.createElement('video');
            var ctx = canvas.getContext('2d')
            videoElement.src = url;
            videoElement.play()
            videoElement.addEventListener('loadedmetadata', () => {
                let width = 930 // canvas的尺寸和图片一样
                let height = 523;
                canvas.width = width;
                canvas.height = height;
                videoElement.currentTime = 1
                setTimeout(() => {
                    ctx.drawImage(videoElement, 0, 0, canvas.width, canvas.height);
                    let imgDataUrl = canvas.toDataURL();
                    this.url = imgDataUrl
                    console.log('封面图Base64:', imgDataUrl)
                    // let fileObj = base64toFile(imgDataUrl, name, 'image/png')
                    // console.log(fileObj);
                }, 200)
            });
        },

1,videoElement.currentTime是让视频播放到多少秒,然后再截取,这里要延迟才能获取videoElement视频dom

2,Base64字符串转File是base64toFile函数,得到fileOb就,就可以给后端存储了

/**
 * Base64字符串转File文件
 * @param {String} base64 Base64字符串(字符串不包含Data URI scheme)
 * @param {String} filename 文件名称
 * @param {String} type 文件类型(例如:image/png)
 */
export function base64toFile(base64, filename, type) {
	var arr = base64.split(',')
	var mime = arr[0].match(/:(.*?);/)[1]
	var bstr = atob(arr[1])
	var n = bstr.length
	var u8arr = new Uint8Array(n)
	while (n--) {
		u8arr[n] = bstr.charCodeAt(n)
	}
	return new File([u8arr], filename, {
		type: mime
	})
}

formData

                const formData = new FormData();
                formData.append('file', fileObj);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值