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

最新的ffmepg.js前端VUE3实现视频、音频裁剪上传功能

package.json

"dependencies": {"@ffmpeg/ffmpeg": "^0.12.10","@ffmpeg/util": "^0.12.1"
}

vue3组件代码

根据需要更改

<script setup lang="ts">
import { FFmpeg } from '@ffmpeg/ffmpeg';
import { fetchFile, toBlobURL } from '@ffmpeg/util';
import useInject from '@/utils/useInject';import { reactive, onUnmounted } from 'vue';
const { $global, $fn } = useInject();const props: any = defineProps<{params?: any;url?: any;
}>();let ffmpegObj: any = reactive({file: null,urlpre: null,url: null,params: {...(props?.params || {}),ext: '',starttime: 0,endtime: 3,maxtime: 0,},
});const ffmpeg = new FFmpeg();function filechange(e: any) {ffmpegObj.file = e.target.files[0];// 原视频预览方案一const reader: any = new FileReader();reader.readAsDataURL(ffmpegObj.file);reader.onload = () => {ffmpegObj.url = '';ffmpegObj.urlpre = reader.result;const audioElement: any = new Audio(ffmpegObj.urlpre);audioElement.addEventListener('loadedmetadata', () => {ffmpegObj.params.maxtime = audioElement.duration;ffmpegObj.params.starttime = 0;ffmpegObj.params.endtime = audioElement.duration;});};// 原视频预览方案二// const reader: any = new FileReader();// reader.readAsArrayBuffer(ffmpegObj.file);// let blob = null;// reader.onload = (e: any) => {//     if (typeof e.target.result === 'object') {//         blob = new Blob([e.target.result]);//     } else {//         blob = e.target.result;//     }//     ffmpegObj.url = '';//     if (blob == null) return;//     const url = URL.createObjectURL(blob);//     ffmpegObj.urlpre = url;//     const audioElement = new Audio(url);//     audioElement.addEventListener('loadedmetadata', function () {//         ffmpegObj.params.maxtime = audioElement.duration;//         ffmpegObj.params.starttime = 0;//         ffmpegObj.params.endtime = audioElement.duration;//     });// };
}
async function doffmpeg() {try {if (!ffmpegObj.file) {return;}ffmpegObj.fileext = ffmpegObj.file.name.split('.').pop();const inputName = `input.${ffmpegObj.fileext}`;const outputName = `output.${ffmpegObj.params.ext ? ffmpegObj.params.ext : ffmpegObj.fileext}`;console.log(666.001, ffmpeg, ffmpegObj);ffmpeg.on('log', ({ message: msg }) => {ffmpegObj.msglogger = msg;});await ffmpeg.load({coreURL: await toBlobURL('./ffmpeg/ffmpeg-core.js','text/javascript'),wasmURL: await toBlobURL('./ffmpeg/ffmpeg-core.wasm','application/wasm'),workerURL: await toBlobURL(`./ffmpeg/ffmpeg-core.worker.js`,'text/javascript'),});await ffmpeg.writeFile(inputName, await fetchFile(ffmpegObj.urlpre));await ffmpeg.exec(['-ss',`${ffmpegObj.params.starttime !== undefined? ffmpegObj.params.starttime: 0}`,'-t',`${(ffmpegObj.params.endtime !== undefined? ffmpegObj.params.endtime: 3) -(ffmpegObj.params.starttime !== undefined? ffmpegObj.params.starttime: 0)}`,'-i',inputName,outputName,]);ffmpegObj.data = await ffmpeg.readFile(outputName);ffmpegObj.blob = new Blob([ffmpegObj.data.buffer], {type:'video/' + ffmpegObj.params.ext? ffmpegObj.params.ext: ffmpegObj.fileext,});ffmpegObj.url = URL.createObjectURL(ffmpegObj.blob);ffmpegObj.urlpre = ''; // 清空原预览视频} catch (err) {alert('出错了');throw err;}
}
function blobToBase64(blob: any) {console.log(666.3002, blob);return new Promise((resolve, reject) => {const fileReader = new FileReader();fileReader.readAsDataURL(blob);fileReader.onload = () => {resolve(fileReader.result);};fileReader.onerror = () => {reject(new Error('文件流异常'));};});
}
// function convertBlobToFile(blob, fileName) {
//     blob.lastModifiedDate = new Date();
//     blob.name = fileName;
//     return blob;
// }
async function submit() {await doffmpeg();const resdata: any = await blobToBase64(ffmpegObj.blob);// const resdata: any = convertBlobToFile(ffmpegObj.blob, 'aaa');console.log(666.30002, resdata);$fn.useApiFiles().request({data: props.url? { url: props.url }: {dir: 'chat/chat',uid: $fn.As.Uuid('CU'),ext:'.' +(ffmpegObj.params.ext? ffmpegObj.params.ext: ffmpegObj.fileext),data: resdata,},}).then((res: any) => {console.log(666.789, res);props?.params?.fn(res);}).catch((err: any) => {$global.tipsfn({ type: 'err', con: err });});
}//下载
function downffmpeg() {const oA: any = document.createElement('a');oA.download ='video_' +Date.now() +'.' +(ffmpegObj.params.ext ? ffmpegObj.params.ext : ffmpegObj.fileext);oA.href = ffmpegObj.url;document.body.appendChild(oA);oA.click();// 释放 URL 对象URL.revokeObjectURL(oA.href);oA.remove();
}
onUnmounted(() => {ffmpegObj = null;
});
</script>
<template><div class="as-ff-area"><div class="as-show-area"><!-- <template v-if="ffmpegObj.urlpre"> -->原视频<video :src="ffmpegObj.urlpre" controls></video><!-- </template> --><!-- <template v-else> -->裁剪后视频<video :src="ffmpegObj.url" controls></video><!-- </template> -->日志:{{ ffmpegObj.params.starttime }}-{{ ffmpegObj.params.endtime }}({{ ffmpegObj.params.maxtime }})<inputtype="range"v-model="ffmpegObj.params.starttime"min="0":max="ffmpegObj.params.maxtime"/><inputtype="range"v-model="ffmpegObj.params.endtime"min="0":max="ffmpegObj.params.maxtime"/><!-- <input type="number" v-model="ffmpegObj.params.starttime" /><input type="number" v-model="ffmpegObj.params.endtime" /> -->{{ ffmpegObj.msglogger }}{{ ffmpegObj.msgprogress }}</div><div class="as-file-area">选择图片:<input class="file" type="file" @change="filechange" /></div><div class="as-btn-area"><button @click="doffmpeg()">裁剪</button><button @click="downffmpeg()">下载</button><button @click="submit()">提交</button></div></div>
</template><style scoped>
.as-ff-area {width: 100%;height: 100%;display: flex;flex-direction: column;
}
.as-btn-area {text-align: center;height: auto;
}
.as-btn-area > button {user-select: none;padding: 5px 12px;margin: 15px 5px 0 5px;
}
.as-file-area {padding: 5px 12px;text-align: center;height: auto;width: auto;display: inline-block;background-color: var(--ch1);
}
.as-show-area {flex-grow: 1;width: 100%;overflow: auto;display: flex;justify-content: center;align-items: center;flex-direction: column;
}
</style>

相关文章:

最新的ffmepg.js前端VUE3实现视频、音频裁剪上传功能

package.json "dependencies": {"ffmpeg/ffmpeg": "^0.12.10","ffmpeg/util": "^0.12.1" }vue3组件代码 根据需要更改 <script setup lang"ts"> import { FFmpeg } from ffmpeg/ffmpeg; import { fetchF…...

“Apache Kylin 实战指南:从安装到高级优化的全面教程

Apache Kylin是一个开源的分布式分析引擎,它提供了在Hadoop/Spark之上的SQL查询接口及多维分析(OLAP)能力,支持超大规模数据的亚秒级查询。以下是Kylin的入门教程,帮助您快速上手并使用这个强大的工具。 1. 安装Kylin Apache Kylin的安装是一个关键步骤,它要求您具备一…...

【iOS】内存泄漏检查及原因分析

目录 为什么要检测内存泄漏&#xff1f;什么是内存泄漏&#xff1f;内存泄漏排查方法1. 使用Zombie Objects2. 静态分析3. 动态分析方法定位修改Leaks界面分析Call Tree的四个选项&#xff1a; 内存泄漏原因分析1. Leaked Memory&#xff1a;应用程序未引用的、不能再次使用或释…...

“深入探讨Java中的对象拷贝:浅拷贝与深拷贝的差异与应用“

前言&#xff1a;在Java编程中&#xff0c;深拷贝&#xff08;Deep Copy&#xff09;与浅拷贝&#xff08;Shallow Copy&#xff09;是两个非常重要的概念。它们涉及到对象在内存中的复制方式&#xff0c;对于理解对象的引用、内存管理以及数据安全都至关重要。 ✨✨✨这里是秋…...

Docker 进入指定容器内部(以Mysql为例)

文章目录 一、启动容器二、查看容器是否启动三、进入容器内部 一、启动容器 这个就不多说了 直接docker run… 二、查看容器是否启动 查看正在运行的容器 docker ps查看所有的容器 docker ps -a结果如下图所示&#xff1a; 三、进入容器内部 通过CONTAINER ID进入到容器…...

计算机网络-数制转换与子网划分

目录 一、了解数制 1、计算机的数制 2、二进制 3、八进制 4、十进制 5、十六进制 二、数制转换 1、二进制转十进制 2、八进制转十进制 3、十六进制转十进制 4、十进制转二进制 5、十进制转八进制 6、十进制转十六进制 三、子网划分 1、IP地址定义 2、IP的两种协…...

【ssh命令】ssh登录远程服务器

命令格式&#xff1a;ssh 用户名主机IP # 使用非默认端口: -p 端口号 ssh changxianrui192.168.100.100 -p 1022 # 使用默认端口 22 ssh changxianrui192.168.100.100 然后输入密码&#xff0c;就可以登录进去了。...

【区块链】truffle测试

配置区块链网络 启动Ganache软件 使用VScode打开项目的wordspace 配置对外访问的RPC接口为7545&#xff0c;配置项目的truffle-config.js实现与新建Workspace的连接。 创建项目 创建一个新的目录 mkdir MetaCoin cd MetaCoin下载metacoin盒子 truffle unbox metacoincontra…...

【AIGC调研系列】chatTTS与GPT-SoVITS的对比优劣势

ChatTTS和GPT-SoVITS都是在文本转语音&#xff08;TTS&#xff09;领域的重要开源项目&#xff0c;但它们各自有不同的优势和劣势。 ChatTTS 优点&#xff1a; 多语言支持&#xff1a;ChatTTS支持中英文&#xff0c;并且能够生成高质量、自然流畅的对话语音[4][10][13]。细粒…...

LLVM Cpu0 新后端10

想好好熟悉一下llvm开发一个新后端都要干什么&#xff0c;于是参考了老师的系列文章&#xff1a; LLVM 后端实践笔记 代码在这里&#xff08;还没来得及准备&#xff0c;先用网盘暂存一下&#xff09;&#xff1a; 链接: https://pan.baidu.com/s/1yLAtXs9XwtyEzYSlDCSlqw?…...

k8s面试题大全,保姆级的攻略哦(二)

目录 三十六、pod的定义中有个command和args参数&#xff0c;这两个参数不会和docker镜像的entrypointc冲突吗&#xff1f; 三十七、标签及标签选择器是什么&#xff0c;如何使用&#xff1f; 三十八、service是如何与pod关联的&#xff1f; 三十九、service的域名解析格式…...

Mysql:通过一张表里的父子级,递归查询并且分组分级

递归函数WITH RECURSIVE语法 WITH RECURSIVE cte_name (column_list) AS (SELECT initial_query_resultUNION [ALL]SELECT recursive_queryFROM cte_nameWHERE condition ) SELECT * FROM cte_name; WITH RECURSIVE 关键字&#xff1a;表示要使用递归查询的方式处理数据。 c…...

数据结构之排序算法

目录 1. 插入排序 1.1.1 直接插入排序代码实现 1.1.2 直接插入排序的特性总结 1.2.1 希尔排序的实现 1.2.2 希尔排序的特性总结 2. 选择排序 2.1.1 选择排序 2.1.2 选择排序特性 2.2.1 堆排序 2.2.2 堆排序特性 3. 交换排序 3.1.1 冒泡排序 3.1.2 冒泡排序的特性 …...

移动安全赋能化工能源行业智慧转型

随着我国能源化工企业的不断发展&#xff0c;化工厂中经常存在火灾爆炸的危险&#xff0c;特别是生产场所&#xff0c;约有80%以上生产场所区域存在爆炸性物质。而目前我国化工危险场所移动通信设备的普及率高&#xff0c;但是对移动通信设备的安全防护却有所忽视&#xff0c;包…...

今天是放假带娃的一天

端午节放假第一天 早上5点半宝宝就咔咔乱叫了&#xff0c;几乎每天都这个点醒&#xff0c;准时的很&#xff0c;估计他是个勤奋的娃吧&#xff0c;要早起锻炼婴语&#xff0c;哈哈 醒来后做饭、洗锅、洗宝宝的衣服、给他吃D3&#xff0c;喂200ml奶粉、给他洗澡、哄睡&#xff0…...

linux Ubuntu安装samba服务器与SSH远程登录

目录 1&#xff0c;下载安装包 2&#xff0c;添加服务器 3&#xff0c;修改服务器配置 3.1 备份配置文件 3.2 修改配置 4&#xff0c;开启samba服务器 5&#xff0c;开关电脑与服务器设置 6&#xff0c; SSH远程登录 1&#xff0c;下载samba服务器安装包 sudo apt in…...

纳什均衡:博弈论中的运作方式、示例以及囚徒困境

文章目录 一、说明二、什么是纳什均衡&#xff1f;2.1 基本概念2.2 关键要点 三、理解纳什均衡四、纳什均衡与主导策略五、纳什均衡的例子六、囚徒困境七、如何原理和应用7.1 博弈论中的纳什均衡是什么&#xff1f;7.2 如何找到纳什均衡&#xff1f;7.3 为什么纳什均衡很重要&a…...

Linux之进程信号详解【上】

&#x1f30e; Linux信号详解 文章目录&#xff1a; Linux信号详解 信号入门 技术应用角度的信号 信号及信号的产生       信号的概念       信号的处理方式 信号的产生方式         键盘产生信号         系统调用产生信号         软件…...

【Spring Cloud】Eureka详细介绍及底层原理解析

目录 底层原理详解 1. 服务注册与发现 2. 心跳机制 3. 服务剔除与自我保护机制 Eureka Server 核心组件 Eureka Client 核心组件 使用场景 结语 Eureka 是 Netflix 开源的一款服务发现框架&#xff0c;用于构建分布式系统中的服务注册与发现。 它包含两个核心组件&…...

【清华大学】《自然语言处理》(刘知远)课程笔记 ——NLP Basics

自然语言处理基础&#xff08;Natural Language Processing Basics, NLP Basics&#xff09; 自然语言处理( Natural Language Processing, NLP)是计算机科学领域与人工智能领域中的一个重要方向。它研究能实现人与计算机之间用自然语言进行有效通信的各种理论和方法。自然语言…...

哔哩下载姬Downkyi:解锁B站视频下载的5个高效技巧

哔哩下载姬Downkyi&#xff1a;解锁B站视频下载的5个高效技巧 【免费下载链接】downkyi 哔哩下载姬downkyi&#xff0c;哔哩哔哩网站视频下载工具&#xff0c;支持批量下载&#xff0c;支持8K、HDR、杜比视界&#xff0c;提供工具箱&#xff08;音视频提取、去水印等&#xff0…...

AI SDK 集成 Codex CLI:解锁 GPT-5 模型的自主工具执行能力

1. 项目概述&#xff1a;AI SDK 与 Codex CLI 的桥梁如果你和我一样&#xff0c;既是 Vercel AI SDK 的深度用户&#xff0c;又对 OpenAI 的 Codex CLI 那强大的自主执行能力垂涎三尺&#xff0c;那么你肯定也遇到过那个经典的“两难困境”&#xff1a;AI SDK 提供了优雅、统一…...

双足机器人CBF-MPC高速动态避障技术解析

1. 机器人动态避障技术概述 在双足机器人运动控制领域&#xff0c;实现高速状态下的实时避障一直是极具挑战性的课题。传统方法往往需要在运动速度与安全性之间做出妥协——要么降低移动速度以保证避障反应时间&#xff0c;要么简化环境复杂度来满足实时性要求。而基于CBF-MPC&…...

个人微信接口开发

在微信深度渗透社交与商业场景的今天&#xff0c;个人微信号已成为企业客户运营、用户触达的核心载体。开发个人微信营销系统、自定义机器人、智能客服及群数据分析工具等需求日益增长&#xff0c;但如何高效实现与微信的交互、调用聊天接口并保障安全稳定&#xff0c;成为开发…...

云原生开发脚手架Jetski:从工具集设计到自动化部署实战

1. 项目概述&#xff1a;从“Jetski”到“Jetpack”的云端开发范式革新最近在GitHub上看到一个名为“jetski”的项目&#xff0c;由开发者Calfur创建。初看这个名字&#xff0c;很多人可能会联想到水上摩托艇&#xff0c;但在软件开发的语境下&#xff0c;它指向的是一种截然不…...

ChatGemini部署指南:基于React与反向代理的Gemini AI客户端实战

1. 项目概述与核心价值如果你和我一样&#xff0c;对ChatGPT的交互体验爱不释手&#xff0c;但又想体验一下Google Gemini模型的能力&#xff0c;或者手头正好有Gemini的API额度&#xff0c;那么ChatGemini这个项目绝对值得你花时间研究一下。简单来说&#xff0c;它是一个用Re…...

在 Taotoken 上如何清晰观测各模型 API 用量与成本

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 在 Taotoken 上如何清晰观测各模型 API 用量与成本 对于团队管理者或独立开发者而言&#xff0c;在集成多个大模型服务时&#xff…...

AI for Science技术路线图:从量子尺度到连续介质的跨学科实践指南

1. 项目概述与核心价值如果你是一位物理化学背景的研究生&#xff0c;正试图用机器学习预测新催化剂的活性&#xff0c;却发现网上资料要么是纯AI教程&#xff0c;要么是深奥的量子化学专著&#xff0c;中间仿佛隔着一道鸿沟——那么&#xff0c;你找对地方了。这就是“AI for …...

鸿蒙PC多端适配的断点设计与布局策略

踩坑记录25&#xff1a;多端适配的断点设计与布局策略 阅读时长&#xff1a;10分钟 | 难度等级&#xff1a;高级 | 适用版本&#xff1a;HarmonyOS NEXT (API 12) 关键词&#xff1a;GridRow、GridCol、断点系统、响应式布局 声明&#xff1a;本文基于真实项目开发经历编写&…...

RePKG深度解析:3步解锁Wallpaper Engine壁纸资源的专业指南

RePKG深度解析&#xff1a;3步解锁Wallpaper Engine壁纸资源的专业指南 【免费下载链接】repkg Wallpaper engine PKG extractor/TEX to image converter 项目地址: https://gitcode.com/gh_mirrors/re/repkg 你是否曾经对Wallpaper Engine中精美的动态壁纸资源感到好奇…...