vscode语音插件开发-在nodejs里面转换音频文件格式并压缩导出zip格式

news2024/12/28 4:09:06

继我的上一篇文章:!vscode录音及语音实时转写插件开发并在工作区生成本地mp3文件 踩坑日记

音频格式转换这里我使用的是ffmpeg第三方库,官网文档。

ffmpeg简介

FFmpeg是一个跨平台的自由软件,用于实时音频、视频流以及音频、视频文件的录制、转换。FFmpeg是一套开源的音视频处理工具,通俗地讲,可以对音视频文件进行剪切、拼接、水印、转码等处理。由于其强大的功能和免费开源的特性,目前在全球范围内得到广泛应用。FFmpeg支持多种音视频格式的编码、解码、转换,可以输出各种容器格式。FFmpeg既可以作为命令行工具使用,也可以通过各种语言的API调用,进行二次开发。

在音视频处理工具方面的方案可能会搜到多种,但是大多的核心都是对FFmpeg进行了包装使用,FFmpeg可以说在音视频处理方面做到了一统江湖。

这里我使用的是命令工具

在这里插入图片描述
下载地址:https://ffmpeg.org/download.html

mac:
在这里插入图片描述
wins:
在这里插入图片描述
在这里插入图片描述

例子

先上传一个语音文件,并拿到url
在这里插入图片描述
如果是mp3文件, 直接导入到本地

// const fs = require('fs')
// var readStream = fs.createReadStream('./test.mp3')

// var writeStream = fs.createWriteStream('./data/copied.mp3')
// readStream.pipe(writeStream)

// 如果是mp3格式 直接上传服务端并且存在本地工作区
const fileUint8Arr = await vscode.workspace.fs.readFile(url[0]);
// 保存到本地
await vscode.workspace.fs.writeFile(vscode.Uri.joinPath(vscode.Uri.file(path.dirname(this.documentUri!.fsPath)!), 'main.mp3'), fileUint8Arr);

这里我将.wav文件转为.mp3

const url = await vscode.window.showOpenDialog({
	openLabel: '导入语音文件',
	title: '选择语音文件以导入',
	canSelectFolders: false,
	canSelectFiles: true,
	canSelectMany: false,
	defaultUri: undefined,
	filters: {
		'audio': ['mp3', 'wav', 'wma', 'avi', 'amr', 'aac', 'm4a', 'flac', 'opus']
	}
})

封装一个转换方法

import { ChildProcessWithoutNullStreams, spawn } from 'child_process';

private convertToMp3(inputFile: string, outputFile: string, platform: string) {
		return new Promise((resolve, reject) => {
			let exeFilePath = '';
			if ( platform === 'Darwin') {
				exeFilePath = path.join(__dirname, 'common', 'mac', 'ffmpeg');
			} else {
				exeFilePath = path.join(__dirname, 'common', 'win', 'ffmpeg.exe');
			}
			// 调用FFmpeg命令
			var ffmpeg: ChildProcessWithoutNullStreams | null = spawn(exeFilePath, ['-i', inputFile, '-acodec', 'libmp3lame', '-qscale:a', '2', outputFile]);
			// 监听FFmpeg输出,可以在终端看到转换进度等信息
			ffmpeg.stdout.on('data', (data) => {
				console.log(`FFmpeg stdout: ${data}`);
			});

			// ffmpeg.stderr.on('data', (data) => {
			// 	console.error(`FFmpeg stderr: ${data}`);
			// });

			ffmpeg.on('close', (code) => {
				ffmpeg = null;
				resolve(true);
				console.log(`FFmpeg process exited with code ${code}`);
			});
		});
	}

调用

// 2. 转成mp3文件存本地
await this.convertToMp3(url[0].fsPath, path.join(path.dirname(this.documentUri!.fsPath), 'main.mp3'), this.platform);

文件压缩导出zip

一开始我使用的是jszip第三方包,但是最后生成zip文件的时候采用的是blob数据格式,我的node版本低 另外项目原因也不支持我升级node版本,最后我使用了adm-zip库.

github地址:https://github.com/cthackers/adm-zip
开发文档地址:https://github.com/cthackers/adm-zip/wiki/ADM-ZIP
有大神做了翻译:
https://blog.csdn.net/Free_Wind22/article/details/104049762

import AdmZip from 'adm-zip';
// 压缩文件的路径
const filePaths = [path.join(path.dirname(this.documentUri!.fsPath), 'main.docx'), path.join(path.dirname(this.documentUri!.fsPath), 'main.mp3')];
// 创建一个新的 zip 文件对象
const zip = new AdmZip();
// 将每个文件添加到 zip 文件中
filePaths.forEach(filePath => {
	// // 读取文件内容
	// const fileContent = fs.readFileSync(filePath);
	// // 将文件添加到 zip 文件中,使用文件名作为 zip 文件中的路径
	// zip.addFile(filePath, fileContent);
	zip.addLocalFile(filePath);
});
// 将 zip 文件写入磁盘
zip.writeZip(path.join(url[0].fsPath, 'result.zip'));

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/579453.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vue电商项目--详情页面--产品售卖属性

滚动行为 开发某一个产品的详情页面? 1.静态组件 但是这个详情页,我们还没有注册为路由 当点击商品图片的时候,跳转到详情页面,在路由跳转的时候需要带上产品的ID给详情页面 干掉a标签换成router-link标签 这里要注意的一点是…

MybatisPlus处理业务数据新思路

文章目录 [toc] 1.问题2.新姿势3.总结 1.问题 由于之前搞了一个停车场的项目,有一个区域的停车场收费被投诉了被举报没有按照政府要求来计费,所以需要将之前的那些停车计费的数据重新计算,将多缴费的钱拿去交罚款,这个就很坑&…

MongoDB—Indexes

一、Indexes 索引支持在MongoDB中高效执行查询。没有 索引,MongoDB必须执行集合扫描,即扫描每个 集合中的文档,以选择与 查询语句。如果查询存在适当的索引, MongoDB可以使用索引来限制它必须的文档数量 检查。 索引是特殊的数据…

近期群晖容器查询注册表失败,无法下载镜像

前言 本以为是群晖的问题,后来发现大家也都遇到了类似的问题,查询注册表出现错误,无法搜索和下载docker镜像,本期就来介绍几个可平替的方案。 方案一:SSH拉取 使用SSH拉取首先要打开群晖的SSH功能:在【…

数据结构(C语言):顺序循环队列的基本操作

一、题目 设队列的元素类型为char,实现顺序循环队列的各种基本操作的程序: ① 初始化队列Q; ② 判断队列Q是否为空; ③ 入队操作。循环调用入队操作,将若干元素(不少于10个)入队&#xff1b…

LeetCode 49 字母异位词分组

LeetCode 49 字母异位词分组 来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/group-anagrams/description/ 博主Github:https://github.com/GDUT-Rp/LeetCode 题目: 给你一个字符串数组&#x…

如何使用ChatGPT?初学者简单指南

Chat GPT 风靡全球,并在短时间内成为世界上增长最快的应用程序。随着所有关于其潜在影响的讨论,你可能会想知道:如何使用 ChatGPT? 使用 ChatGPT需要准备:一个 OpenAI 帐户和一个网络浏览器。 访问chat.openai.com并…

ICV报告:中国的数字经济与5G市场研究报告

近日,专注于前沿科技领域的国际咨询机构ICV发布了《中国的数字经济与5G市场研究报告》。报告指出,随着5G商用的发展,5G对经济社会的影响逐步显现,其影响突出体现在对数字产业发展的带动上。随着5G应用的不断创新与扩散&#xff0c…

网络公开课1

网络公开课1 概念* 常见面试题 输入URL发生哪些事 https http1.0 2.0的区别…… OSI七层模型 协议DNS 传输层 三次握手 四次挥手 http 物理层:并不是指光纤电缆那些,那些是设备。只关心如何传输数据,传输的是比特流 0 1。 应用层:…

汇编物理地址计算与段地址认识

1.物理地址概念: 所有内存单元构造的存储空间是一个一维性空间.每个内存单元在这个空间都有一个唯一的地址,这个唯一的地址称为物理地址. CPU通过地址总线送入存储器的必须是一个内存单元的物理地址. 不同的CPU有不同形式的物理地址形成方式. 物理地址计算公式: 物理地址 …

微服务的演变史(单体式、分布式、SOA架构、微服务架构)

单体式架构 从架构层面来考虑:一个应用只部署一个服务,或该应用由多个服务组成的时候,只部署在一台服务器上 把一种系统的所有功能全部耦合在一个应用中的框架方式 这种开发方式简单,但是只适合体量较小的业务,一旦业务体量增加到一定程度的时候,单机的硬件资源将没办法满足…

JOSEF约瑟 JDL-1001A 电流继电器 导轨式安装 批发价格

名称:电流继电器品牌:JOSEF约瑟型号:JDL-1001A触点容量:250V2A整定范围:0.03-9.99A返回系数:≥0.9特点:交直流两用、消耗小、返回系数高。 型号说明 JD L -1 XXX X/ XXX / XXX 系列型号 JDL…

首发Yolov5/Yolov7优化:Adam该换了!斯坦福最新Sophia优化器,比Adam快2倍 | 2023.5月斯坦福最新成果

1.Sophia优化器介绍 斯坦福2023.5月发表的最新研究成果,他们提出了「一种叫Sophia的优化器,相比Adam,它在LLM上能够快2倍,可以大幅降低训练成本」。 论文:https://arxiv.org/pdf/2305.14342.pdf 本文介绍了一种新的模型预训练优化器:Sophia(Second-order Clippe…

vue2_模版语法

目录 模版语法 react用jsx语法编译后的null作用 插值表达式{{}} v-bind和{{}} 关于国内谷歌自带翻译停用如何解决(额外) 会一点的插值表达式,也有限制 模版语法 更接近原生js的写法jsx语法 jsx是react提出的;后很多前端框架…

LeetCode 周赛 347(2023/05/28)二维空间上的 LIS 最长递增子序列问题

本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 提问。 往期回顾:LeetCode 单周赛第 346 场 仅 68 人 AK 的最短路问题 周赛 347 概览 T1. 移除字符串中的尾随零(Easy) 标签:模拟、…

HTTP协议深入理解+如何使用Fiddler抓包

博主简介:想进大厂的打工人博主主页:xyk:所属专栏: JavaEE初阶 目录 文章目录 一、HTTP概述 1.1 什么是HTTP 1.2 理解应用层协议 二、抓包工具fiddler的使用 2.1 几个需要注意的点 2.2 fiddler的原理 2.3 fiddler的使用技巧 三、HTTP请求(Re…

intel驱动程序和支持助理常见问题:不识别、无法检测等问题解决方法

起因: wifi驱动有点问题,于是想着更新一下官方的驱动,下载intel驱动程序和支持助理并安装完成后,打开成了这个样子,刷新多少次都没有用,就是不识别。 解决方法: 经过一波胡乱操作&#xff0…

华为OD机试之真正的密码(Java源码)

真正的密码 题目描述 一行中输入一个字符串数组,如果其中一个字符串的所有以索引0开头的子串在数组中都有,那么这个字符串就是潜在密码在所有潜在密码中最长的是真正的密码,如果有多个长度相同的真正的密码,那么取字典序最大的为…

使用CompletionService进行多个文件打包为zip下载

最近没怎么写博客了,因为前段时间在准备软考复习,昨天考完试,现在总算轻松一点了,有更多自由的时间了,总结一下JUC包下的一些并发工具类,主要是从使用场景入手。 CompletionService可以用于实现任务并行化…

数据结构入门(C语言版)图的概念和功能函数实现

图的概念和功能函数实现 前言1.图的定义和术语1.1 定义1.2 常用术语 2.图的存储结构2.1 图的数组(邻接矩阵)存储表示2.2 图的邻接表存储表示 3.图的遍历3.1 深度优先搜索3.2 广度优先搜索3.3 示例 4.连通网的最小生成树4.1 克鲁斯卡尔(Kruskal)算法4.2 普里姆(Prim)算法 5.图的…