当前位置: 首页 > article >正文

vue3获取视频时长、码率、格式等视频详细信息

前言:

我们在上传视频需要视频的帧数等信息的时候,上传组件无法直接读取帧数等信息

方法:通过mediainfo.js来获取视频的帧率、总帧数和视频的总时长

mediainfo.js地址,想详细了解的可以去看看
git地址:https://github.com/buzz/mediainfo.js
预览地址:mediainfo.js

解决方案:

1、通过npm:

1.1、运行以下命令:

npm install mediainfo.js

官网没有关于vue的示例,但是有react+vite的示例,这里我是用vite配置

1.2、npm安装好插件后,在vite.config.ts 文件中配置下方代码
这里需要安装一个vite-plugin-static-copy 的vite插件

npm install vite-plugin-static-copy --save 

1.3、拷贝MediaInfoModule.wasm的静态文件,mediaInfo是需要依赖这个文件执行的

import * as path from 'path'
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import { viteStaticCopy } from 'vite-plugin-static-copy'

export default defineConfig({
  plugins: [
    vue(),
    viteStaticCopy({
      targets: [
        {
          src: ''node_modules/mediainfo.js/dist/MediaInfoModule.wasm')',
          dest: 'dist',
        },
      ],
    }),
  ],
})

问题来了,在项目中我是用npm方式引入,运行提示MediaInfoModule.wasm文件找不到,添加的配置也没有效果,目前npm方式我没有配置成功,如果大家什么好的方法,还请指导一下,感谢

2、使用CDN的方式:

1、在项目index.html文件<body></body>标签下,通过CDN的方式加入mediaInfo.js,如下

<script src="https://unpkg.com/mediainfo.js@0.2.1/dist/umd/index.min.js"></script>

2、使用mediaInfo.js

 在需要获取视频信息的vue文件下使用,示例如下

<template>
  <div class="container">
            <el-upload
                :on-change="handleVideoChange"
                accept="video/*"
                multiple >
                <el-button type="primary">
                  上传视频
                </el-button>
              </el-upload>
  </div>
</template>
<script lang="ts" setup>
import { ref } from 'vue'
const handleVideoChange = (file)=>{
checkMediaFile(file.raw)
}

const loadingVideo  = ref(null);
  const windows: any = window
const checkMediaFile = (file: any): Promise<any> => {
  loadingVideo.value = ElLoading.service({
      text:'读取中...'
    }); // 开始加载
  return new Promise((r, j) => {
    const getSize = () => file.size
    const readChunk = (chunkSize, offset) =>
      new Promise((resolve, reject) => {
        const reader = new FileReader()
        reader.onload = (event: any) => {
          if (event.target.error) {
            reject(event.target.error)
          }
          resolve(new Uint8Array(event.target.result))
        }
        reader.readAsArrayBuffer(file.slice(offset, offset + chunkSize))
      })
    windows
      .MediaInfo()
      .then((media) => {
        media
          .analyzeData(getSize, readChunk)
          .then((result) => {
            console.log('视频信息:',result.media.track[1]);
            loadingVideo.value.close(); // 结束加载
            return result
          }).catch((error) => {
            j(error)
          })
      })
      .catch((error) => {
        j(error)
      })
  })
}
</script>

 3、运行效果如下:


http://www.kler.cn/news/292813.html

相关文章:

  • pytorch torch.squeeze函数介绍
  • 2024年高教社杯全国大学生数学建模竞赛A题思路(2024数学建模国赛A题思路)
  • Flutter 局部变量刷新问题
  • “全面解析审核运营:策略、流程、案例,一本通吃!
  • 牛牛替换(c语言)
  • 系规学习第21天
  • vue3定义响应式数据(ref,reactive)
  • C++ STL容器-Vector容器概念及应用方法详解
  • SSH免秘钥问题
  • 【netty系列-09】深入理解和解决tcp的粘包拆包
  • 一文讲清楚,AI、AGI、AIGC与AIGC、NLP、LLM,ChatGPT等概念
  • 【云计算】什么是云计算服务|为什么出现了云计算|云计算的服务模式
  • 动手学深度学习8.2. 文本预处理-笔记练习(PyTorch)
  • 计算机网络八股文之TCP协议
  • FPGA随记---inout端口的处理
  • 20240902软考架构-------软考101-105答案解析
  • TMC5271/TMC5272 支持使用编码器进行闭环位置控制
  • linux下NTP服务器实战(chrony软件)
  • 数学建模强化宝典(1)级比检验
  • VirtualBox Debian 自动安装脚本
  • Pytorch中不同的Norm归一化详细讲解
  • 后端开发刷题 | 最长公共子序列(非连续)
  • Qt放Element网页滑动菜单栏
  • Quartz.Net_快速开始
  • ​如何通过Kimi强化论文写作中的数据分析?
  • CommonJS与ESModule标准
  • 企业在选择CRM系统时需要注意哪些问题呼叫系统外呼系统部署搭建
  • FPGA第 9 篇,Verilog 中的关键字和基数
  • kuka6轴机器人配置外部启动信号(学习记录,可能不对)
  • Spring框架中的循环依赖详解以及解决方案