nodejs轉換音頻文件格式并壓縮導出zip格式(vscode語音插件開發(fā))
音頻格式轉換這里我使用的是ffmpeg第三方庫,官網文檔。
ffmpeg簡介
FFmpeg是一個跨平臺的自由軟件,用于實時音頻、視頻流以及音頻、視頻文件的錄制、轉換。FFmpeg是一套開源的音視頻處理工具,通俗地講,可以對音視頻文件進行剪切、拼接、水印、轉碼等處理。由于其強大的功能和免費開源的特性,目前在全球范圍內得到廣泛應用。FFmpeg支持多種音視頻格式的編碼、解碼、轉換,可以輸出各種容器格式。FFmpeg既可以作為命令行工具使用,也可以通過各種語言的API調用,進行二次開發(fā)。
在音視頻處理工具方面的方案可能會搜到多種,但是大多的核心都是對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格式 直接上傳服務端并且存在本地工作區(qū)
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]);
// 監(jiān)聽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
開發(fā)文檔地址:https://github.com/cthackers/adm-zip/wiki/ADM-ZIP
有大神做了翻譯:http://www.fzitv.net/javascript/285879moh.htm
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')];
// 創(chuàng)建一個新的 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'));到此這篇關于nodejs轉換音頻文件格式并壓縮導出zip格式(vscode語音插件開發(fā))的文章就介紹到這了,更多相關nodejs音頻格式轉換內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
詳解Nodejs 通過 fs.createWriteStream 保存文件
本篇文章主要介紹了Nodejs 通過 fs.createWriteStream 保存文件,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-10-10
在Mac OS上安裝使用Node.js的項目自動化構建工具Gulp
Gulp是一個在使用上比Grunt更加簡潔的自動化工具(文中附有對比),和Node的npm包管理器配合使用非常方便,下面就記錄一下在Mac OS上安裝使用Node.js的項目自動化構建工具Gulp的方法:2016-06-06

