nodejs轉(zhuǎn)換音頻文件格式并壓縮導(dǎo)出zip格式(vscode語(yǔ)音插件開(kāi)發(fā))
繼我的上一篇文章:!vscode錄音及語(yǔ)音實(shí)時(shí)轉(zhuǎn)寫(xiě)插件開(kāi)發(fā)并在工作區(qū)生成本地mp3文件 踩坑日記
音頻格式轉(zhuǎn)換這里我使用的是ffmpeg
第三方庫(kù),官網(wǎng)文檔。
ffmpeg簡(jiǎn)介
FFmpeg
是一個(gè)跨平臺(tái)的自由軟件,用于實(shí)時(shí)音頻、視頻流以及音頻、視頻文件的錄制、轉(zhuǎn)換。FFmpeg
是一套開(kāi)源的音視頻處理工具,通俗地講,可以對(duì)音視頻文件進(jìn)行剪切、拼接、水印、轉(zhuǎn)碼等處理。由于其強(qiáng)大的功能和免費(fèi)開(kāi)源的特性,目前在全球范圍內(nèi)得到廣泛應(yīng)用。FFmpeg支持多種音視頻格式的編碼、解碼、轉(zhuǎn)換,可以輸出各種容器格式。FFmpeg既可以作為命令行工具使用,也可以通過(guò)各種語(yǔ)言的API調(diào)用,進(jìn)行二次開(kāi)發(fā)。
在音視頻處理工具方面的方案可能會(huì)搜到多種,但是大多的核心都是對(duì)FFmpeg進(jìn)行了包裝使用,FFmpeg
可以說(shuō)在音視頻處理方面做到了一統(tǒng)江湖。
這里我使用的是命令工具
下載地址:https://ffmpeg.org/download.html
mac:
wins:
例子
先上傳一個(gè)語(yǔ)音文件,并拿到url
如果是mp3
文件, 直接導(dǎo)入到本地
// const fs = require('fs') // var readStream = fs.createReadStream('./test.mp3') // var writeStream = fs.createWriteStream('./data/copied.mp3') // readStream.pipe(writeStream) // 如果是mp3格式 直接上傳服務(wù)端并且存在本地工作區(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
文件轉(zhuǎn)為.mp3
const url = await vscode.window.showOpenDialog({ openLabel: '導(dǎo)入語(yǔ)音文件', title: '選擇語(yǔ)音文件以導(dǎo)入', canSelectFolders: false, canSelectFiles: true, canSelectMany: false, defaultUri: undefined, filters: { 'audio': ['mp3', 'wav', 'wma', 'avi', 'amr', 'aac', 'm4a', 'flac', 'opus'] } })
封裝一個(gè)轉(zhuǎn)換方法
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'); } // 調(diào)用FFmpeg命令 var ffmpeg: ChildProcessWithoutNullStreams | null = spawn(exeFilePath, ['-i', inputFile, '-acodec', 'libmp3lame', '-qscale:a', '2', outputFile]); // 監(jiān)聽(tīng)FFmpeg輸出,可以在終端看到轉(zhuǎn)換進(jìn)度等信息 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]`); }); }); }
調(diào)用
// 2. 轉(zhuǎn)成mp3文件存本地 await this.convertToMp3(url[0].fsPath, path.join(path.dirname(this.documentUri!.fsPath), 'main.mp3'), this.platform);
文件壓縮導(dǎo)出zip
一開(kāi)始我使用的是jszip
第三方包,但是最后生成zip文件的時(shí)候采用的是blob數(shù)據(jù)格式,我的node版本低 另外項(xiàng)目原因也不支持我升級(jí)node版本,最后我使用了adm-zip
庫(kù).
github地址:https://github.com/cthackers/adm-zip
開(kāi)發(fā)文檔地址:https://github.com/cthackers/adm-zip/wiki/ADM-ZIP
有大神做了翻譯:http://chabaoo.cn/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)建一個(gè)新的 zip 文件對(duì)象 const zip = new AdmZip(); // 將每個(gè)文件添加到 zip 文件中 filePaths.forEach(filePath => { // // 讀取文件內(nèi)容 // const fileContent = fs.readFileSync(filePath); // // 將文件添加到 zip 文件中,使用文件名作為 zip 文件中的路徑 // zip.addFile(filePath, fileContent); zip.addLocalFile(filePath); }); // 將 zip 文件寫(xiě)入磁盤(pán) zip.writeZip(path.join(url[0].fsPath, 'result.zip'));
到此這篇關(guān)于nodejs轉(zhuǎn)換音頻文件格式并壓縮導(dǎo)出zip格式(vscode語(yǔ)音插件開(kāi)發(fā))的文章就介紹到這了,更多相關(guān)nodejs音頻格式轉(zhuǎn)換內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Node.js全局對(duì)象Global的實(shí)現(xiàn)
在Nodejs下全局變量和全局函數(shù)都是可以使用global來(lái)訪問(wèn)到的,本文主要介紹了Node.js全局對(duì)象Global的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2023-12-12Node.js 獲取微信JS-SDK CONFIG的方法示例
這篇文章主要介紹了Node.js 獲取微信JS-SDK CONFIG的方法示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05node.js中的events.emitter.listeners方法使用說(shuō)明
這篇文章主要介紹了node.js中的events.emitter.listeners方法使用說(shuō)明,本文介紹了events.emitter.listeners 的方法說(shuō)明、語(yǔ)法、接收參數(shù)、使用實(shí)例和實(shí)現(xiàn)源碼,需要的朋友可以參考下2014-12-12NodeJS使用文件流解決大文件處理的內(nèi)存與時(shí)間效率問(wèn)題
在 NodeJS 中,文件操作是常見(jiàn)的任務(wù)之一,然而,當(dāng)處理大文件時(shí),直接將整個(gè)文件加載到內(nèi)存中可能會(huì)導(dǎo)致內(nèi)存溢出或性能瓶頸,為了解決這一問(wèn)題,NodeJS 提供了文件流(Stream)機(jī)制,本文將詳細(xì)介紹文件流的優(yōu)點(diǎn)、使用方法、應(yīng)用場(chǎng)景,并探討背壓(Backpressure)的概念2025-01-01基于socket.io和node.js搭建即時(shí)通信系統(tǒng)
socket.IO是一個(gè)websocket庫(kù),包括了客戶端的js和服務(wù)器端的nodejs。官方地址:http://socket.io2014-07-07Node服務(wù)端實(shí)戰(zhàn)之操作數(shù)據(jù)庫(kù)示例詳解
這篇文章主要為大家介紹了Node服務(wù)端實(shí)戰(zhàn)之操作數(shù)據(jù)庫(kù)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12