阅读 114

项目中如何使用原生js实现上传视频并且获取到视频尺寸宽高 、视频时长、尺寸比例及分辨率等

原生js实现上传视频/音频获取尺寸宽高 、视频时长、尺寸比例及分辨率

1.使用onchange方法进行获取上传内容

     <input type="file" onchange="changeFile(event)" /> 复制代码

2.在js中定义onchange方法

由于 checkSizes 是延迟执行所以需要同步

      async function changeFile(e) {             console.log(e)             let files = e.target.files             console.log(files)             // await checkSize(files,true--> 为音频是使用 默认为false), '返回值、里面有 (尺寸宽 --- 分辨率) 尺寸高 视频时长 1 表示1秒   尺寸比例 [16,9]';              let checkSizes             if (files[0].type == "audio/mpeg") {                 checkSizes = await checkSize(files, true)             } else if (files[0].type == "video/mp4") {                 checkSizes = await checkSize(files)             }             console.log(checkSizes)             if (checkSizes.duration > 300) {                 console.log('视频上传时间不能大于1分钟')                 return             }             if(checkSizes.videoWidth!='1280'){                 console.log('只能视频上分辨率为720')                 return             }             if(checkSizes.ccbl.join(':')!='16:9'){                 console.log('上传尺寸为16:9的视频')                 return             }             console.log(files, '上传成功')         } 复制代码

3.创建虚拟dom 并且放回对应的值

        let checkSize = async (files, isVideo) => {             if (!files || !files[0]) return false             const checktimevideo = document.getElementById('checktimevideo')             if (checktimevideo) {                 document.body.removeChild(checktimevideo)             }             let doms             if (!isVideo) {                 doms = document.createElement('video')             } else {                 doms = document.createElement('audio')             }             const url = URL.createObjectURL(files[0])             console.log(url)             doms.src = url             doms.id = 'checktimevideo'             doms.style.display = 'none'             document.body.appendChild(doms)             return await gettime(doms);         } 复制代码

4.由于loadedmetadata 是异步代码所以需要promise进行封装转换为同步代码执行

       let gettime = (doms) => {              // 由于loadedmetadata 是异步代码所以需要promise进行封装转换为同步代码执行             const promise = new Promise(resolve => {                 doms.addEventListener('loadedmetadata', e => {                     const gcd = getGcd(e.target.videoWidth, e.target.videoHeight);                     console.log(gcd)                     let obj = {                         videoWidth: doms.videoWidth, // 尺寸宽 --- 分辨率                         videoHeight: doms.videoHeight, // 尺寸高                         duration: e.target.duration, // 视频时长 1表示一秒                         ccbl:[e.target.videoWidth / gcd, e.target.videoHeight / gcd] // 计算尺寸比例                     }                     resolve(obj)                 })             })             return promise         } 复制代码

5.由于计算尺寸比例需要使用到最大公约数进行计算

        // 获取最大公约数         function getGcd(a, b) {             let n1, n2;             if (a > b) {                 n1 = a;                 n2 = b;             } else {                 n1 = b;                 n2 = a;             }             let remainder = n1 % n2;             if (remainder === 0) {                 return n2;             } else {                 return getGcd(n2, remainder)             }         }


作者:被遺忘的回憶
链接:https://juejin.cn/post/7020695653189681189

文章分类
后端
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐