JavaScript前端获取上传视频时长与第一帧封面详解

作者:交互手记时间:2026-10-27 03:11:14浏览:194

本文讲解如何在JavaScript前端获取上传视频的时长与第一帧画面。通过创建Blob对象加载视频,监听loadedmetadata事件获取duration属性得到时长;利用Canvas绘制video当前帧并转换为base64或File对象,实现封面预览与上传,有效减轻后端压力。

前言

在开发后台系统的音频管理模块时,通常需要对上传的视频进行前端预处理。除了限制文件大小和类型外,还需满足特定需求,如自动读取文件信息并传递给后端。虽然这些操作可在后端完成,但将资源消耗前置到前端能有效减轻后端压力。本文主要介绍如何在前端获取视频的第一帧画面和视频时长,前者可用于设置新建信息的视频封面,后者能帮助用户直观了解文件的准确性和大小。

获取视频时长

获取视频时长相对获取第一帧画面更为简单,但两者均需在HTML代码中添加video标签,并将待获取信息的视频地址置于该标签的链接中。

获取时长只需为视频元素添加loadedmetadata监听事件。在该事件回调中,可获取audioElement对象,通过该对象的duration参数即可得到视频时长。

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赋值的对不对
}

第二步,视频正确加载后会显示第一帧画面。此时可利用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读取视频文件时长内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!

作者最新文章