文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

JavaScript实现读取上传视频文件的时长和第一帧画面过程讲解

2023-05-20 05:52

关注

前言

当我们做一个后台系统的音频管理模块时,通常需要将我们上传的视频做一个前端的提前处理。首先是我们对于文件的大小要限制,文件类型做限制,然后还会有些特定的要求,比如自动去读取文件的一些信息,传递给后端。当然这些可以在后端进行完成,但是相对而言,将资源的消耗放在前端这一块是会相对减轻后端压力的。这里主要介绍要如何获取前端的第一帧画面和视频的时长,画面可以辅助我们设置新建信息的视频封面图,时长能让用户更直观地感觉到文件的准确性和大小。

获取视频时长

获取时长比第一帧画面的获取相对容易一些,但是两者有一个共同的需要,那就是需要在我们的html代码中添加video标签,并且将我们想要获取信息的视频地址放到标签的链接中。

获取时长的话,只需要给视频element添加一个监听事件,loadedmetadata。在这个监听事件中我们可以获取到audioElement对象,在该对象中便有视频时长的参数。

getVideoDuration(file) {
  var url = URL.createObjectURL(file);
  var audioElement = new Audio(url);
  var self = this;
  var result;
  audioElement.addEventListener("loadedmetadata", function() {
    // 视频时长值的获取要等到这个匿名函数执行完毕才产生
    result = audioElement.duration; //得到时长为秒,小数,182.36
    self.ruleForm.videoDuration = parseInt(result); //转为int值
  });
}

获取第一帧画面

首先我们需要明白,视频在我们的页面是如何去运作的。前端目前我所知道的想要跟视频产生联系的方式就是video标签,所以我们需要有一个video标签,然后将视频地址添加进去,才有办法获得该视频的一些信息。

①第一步需要将用户上传的文件转化为blob地址,当然有一些情况我们是可以直接获取到后端传递过来的地址的,但是当我们需要将视频和表单一起提交时,就没办法做到这样有一个先后的顺序。所以我们要自食其力,把视频转为地址,加载到音频标签中。

const file = '.....'
const a = new FileReader();
a.readAsDataURL(file);
a.onload = (e) => {
	const blob = new Blob([e.target.result], { type: file.type }) // 如果发现乱码检查一下type赋值的对不对
}

②第二步,众所周知,如果视频加载成功了,那我们的video正确加载了,是会显示视频的第一帧画面的,所以这个时候我们就可以用canvas去截图,将第一帧的画面截下来,再转成base64,当然最后如果需要把封面一同上传,我们可以将base64转file。

findvideocover() {
        let size = 160
        // 获取video节点
        const video = document.getElementById("videoPlay");
        video.width = size
        video.height = size
        video.currentTime = 1 // 第一帧
        //创建canvas对象
        const canvas = document.createElement("canvas")
        canvas.width = size
        canvas.height = size
        this.$nextTick(()=>{
          // 利用canvas对象方法绘图
          canvas.getContext("2d").drawImage(video, 0, 0, canvas.width, canvas.height);
          // 转换成base64形式
          const img = canvas.toDataURL("image/jpeg") // 这个就是图片的base64
          this.coverUrl = img
        })
      }

base64转file

const arr = base64.split(',')
const type = arr[0].match(/:(.*?);/)[1]
const size = window.atob(arr[1])
let n = size.length
const u8arr = new Uint8Array(n)
while (n--) {
  u8arr[n] = size.charCodeAt(n)
}
const file = new File([u8arr], name, { type })

结语

这两个功能并不复杂,只要理解其中的原理和流程就可以很简单的达到效果。主要是将视频从file转为blob是否能够正常加载到video中,如若不能,则需要请求后端的帮助,先将视频传递上去后获取到文件的地址,再去执行这一读取第一帧画面作为封面的功能。

到此这篇关于JavaScript实现读取上传视频文件的时长和第一帧画面过程讲解的文章就介绍到这了,更多相关JS读取视频文件时长内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-前端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯