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

ffmpeg+vue2

一、安装依赖

npm install @ffmpeg/core @ffmpeg/ffmpeg
"@ffmpeg/core": "^0.10.0",
"@ffmpeg/ffmpeg": "^0.10.1",

二、配置ffmpeg
安装好插件以后,需要配置一下代码,否则会报错:

1、在vue.config.js文件中配置请求头

devServer: {headers: {'Cross-Origin-Opener-Policy': 'same-origin','Cross-Origin-Embedder-Policy': 'require-corp'}
}

在页面中实例化ffmpeg的时候可能会报找不到模块儿的错误,最好将下载好的插件文件放到public文件夹里面就可以了 createFFmpegCore is not defined

node_modules@ffmpeg\core\dist中的三个文件复制到vue项目的public下
ffmpeg-core.js
ffmpeg-core.wasm
ffmpeg-core.worker.js

三、组件

<template><div class="video-box"><video id="video" controls object-fill="fill"></video><br /><input id="upload" type="file" accept="video/mp4" capture="camcorder" @change="upload"></div>
</template><script>
import { createFFmpeg, fetchFile } from '@ffmpeg/ffmpeg'
export default {data () {return {msg: '',videoWidth: '',videoHeight: '',duration: ''}},methods: {// 选择文件async upload (e) {console.log('start', e)console.log('start', e.target.files[0])var _this = thisif (e.target.files[0]) {var filename = e.target.files[0].namevar filetype = e.target.files[0].typeconst videoUrl = _this.getObjectURL(e.target.files[0])const video = document.getElementById('video')video.src = videoUrlthis.getVideoData().then((videoObj) => {const file = e.target.files[0]console.log('videoObj:', videoObj)const { width, height } = videoObjconst result = _this.squeezVideo(file, filename, filetype, width, height, _this.msg)result.then(res => {console.log('resultFile', res)})})}},// 压缩视频async squeezVideo (file, filename, filetype, width, height) {console.log('squeezingVideo file name:  ', file.name)console.log('squeezingVideo file type:  ', file.type)console.log('squeezingVideo file path:  ', file.path)console.log('squeezingVideo file size:  ', file.size)console.log('squeezingVideo file lastModified:  ', file.lastModified)console.log('squeezingVideo file lastModifiedDate:  ', file.lastModifiedDate)const _this = this// 分辨率const resolution = `${width / 2}x${height / 2}`// 实例化ffmpegconst ffmpeg = createFFmpeg({// ffmpeg路径corePath: 'ffmpeg-core.js',// 日志log: true,// 进度progress: ({ ratio }) => {_this.msg = `完成率: ${(ratio * 100.0).toFixed(1)}%`}})var { name } = filethis.msg = '正在加载 ffmpeg-core.js'// 开始加载await ffmpeg.load()this.msg = '开始压缩'// 把文件加到ffmpeg   写文件ffmpeg.FS('writeFile', name, await fetchFile(file))// await ffmpeg.run('-i', name, '-b', '2000000', '-fs', '4194304', '-preset medium', 'superfast', 'put.mp4')// 开始压缩视频await ffmpeg.run('-i', name, '-b', '2000000', '-crf', '23', '-fs', '4194304', '-s', resolution, 'put.mp4')this.msg = '压缩完成'// 压缩所完成,   读文件  压缩后的文件名称为 put.mp4const data = ffmpeg.FS('readFile', 'put.mp4')// 转换压缩后的视频格式  当前为 blob 格式var filed = _this.transToFile(data)console.log('transToFile: ', filed)return new Promise((resolve, reject) => {if (filed) {resolve({squzingFile: filed})}})},// 获取视频的宽高分辨率getVideoData () {return new Promise((resolve, reject) => {const videoElement = document.getElementById('video')videoElement.addEventListener('loadedmetadata', function () {resolve({width: this.videoWidth,height: this.videoHeight,duration: this.duration})})})},// 获取上传视频的urlgetObjectURL (file) {let url = nullwindow.URL = window.URL || window.webkitURLif (window.URL) {url = window.URL.createObjectURL(file)} else {url = URL.createObjectURL(file)}return url},// 类型转换 blob 转换 filetransToFile (data) {console.log(data)const _this = thisvar file = []// 转换bolb类型const blob = new Blob([data], { type: 'text/plain;charset=utf-8' })// 这么写是因为文件转换是异步任务const transToFile = async (blob, fileName, fileType) => {return new window.File([blob], fileName, { type: fileType })}const textContain = transToFile(blob, 'put.mp4', 'video/mp4')// 转换完成后可以将file对象传给接口textContain.then((res) => {file.push(res)console.log('res', res)// _this.confirm(file)return file})}}
}
</script>
http://www.lryc.cn/news/476237.html

相关文章:

  • 基于深度学习YOLOv10的电动二轮车目标检测、轨迹跟踪、测距算法
  • 鸿蒙ArkTS中的image组件
  • LeetCode 684.冗余连接:拓扑排序+哈希表(O(n)) 或 并查集(O(nlog n)-O(nα(n)))
  • 让空气净化器“很听话”-置入NRK3502离线语音控制芯片
  • 8个Visio最佳替代软件推荐,每一款都堪称绘图神器
  • 微服务day02
  • 使用 Logback 的最佳实践:`logback.xml` 与 `logback-spring.xml` 的区别与用法
  • NSET or MSET算法--原理解析
  • NC6 系统配置的消息渠道配置配置涉及相关的表,用户使用admin登录
  • PXC数据库性能测试对比
  • 使用AutoMySQLBackup 数据库自动备份
  • NVR批量管理软件/平台EasyNVR多个NVR同时管理支持对接阿里云、腾讯云、天翼云、亚马逊S3云存储
  • 13.React useTimeout
  • Android待机问题与内存泄露日志定位及bugreport获取分析
  • 访问控制技术原理与应用
  • 详解Rust标准库:Vec向量
  • 网络原理(初一,TCP/IP五层(或四层)模型面试问题)
  • Unity引擎材质球残留贴图引用的处理
  • Flutter鸿蒙next中封装一个列表组件
  • 层次与网络的视觉对话:树图与力引导布局的双剑合璧
  • python将数据集中所有文件名升序制作txt文件(医学影像)
  • 【The Art of Unit Testing 3_自学笔记06】3.4 + 3.5 单元测试核心技能之:函数式注入与模块化注入的解决方案简介
  • 【VSCode】配置
  • Linux 常用命令整理大全及命令使用心得
  • 计算器的实现
  • 这个工具帮你快速实现数据集成和同步
  • 论文阅读:Computational Long Exposure Mobile Photography (一)
  • 项目解决方案:多地连锁药店高清视频监控系统建设解决方案(设计方案)
  • utf-8、pbkdf2_sha
  • Java之包,抽象类,接口