小程式:使用wasm版ffmpeg轉換m4a成wav音檔

使用WASM版ffmpeg緣由

這個東西會在Line BOT中使用到,因為不是所有雲服務上都能夠安裝ffmpeg套件,所以這個機制就能,雖然轉換效率不太好,就是一個可運行的方案。

1. 安裝node.js 

建議使用node.js 18 LTS版本

2. 安裝套件

npm install @ffmpeg/core@^0.11 @ffmpeg/ffmpeg@^0.11

@ffmpeg/ffmpeg在0.12之後做了API的改變,並且不支援Node.js了

3. 寫程式

使用ffmpeg轉換器 Transcoder.js

const fs = require('fs');
const { createFFmpeg, fetchFile } = require('@ffmpeg/ffmpeg');

const m4a2wav = async (inpath, outpath) => {
console.log('m4a2wav by ffmpegwasm',inpath, outpath);
const ffmpeg = createFFmpeg();
ffmpeg.setLogger(({message})=>console.log(message));
await ffmpeg.load();
ffmpeg.FS('writeFile', 'inputfile.m4a', await fetchFile(inpath));
const cmdArray = `-hide_banner -i inputfile.m4a -acodec pcm_s16le -ar 16000 -ac 1 output.wav`.split(' ');
await ffmpeg.run(...cmdArray);
await fs.promises.writeFile(outpath, ffmpeg.FS('readFile', 'output.wav'));
ffmpeg.exit();
return outpath;
}

module.exports = { m4a2wav };


4. 跑程式,紅字部份沒加會發生Failed to parse URL from

node --no-experimental-fetch main.js

command line主程式main.js

const { exit } = require("process");
const { m4a2wav } = require("./Transcoder");
let args = process.argv.slice(2);
if (args.length < 2) {
console.error('must given 2 args for input and output path');
exit(1);
}
async function main() {
console.log(args);
try {
await m4a2wav(args[0], args[1]);
console.log('done');
} catch (err) {
console.error('err', err);
}
}
main()

留言