NodeJs版
一、wav格式 Base64 轉音頻
var fs = require('fs'); (async () => { var fileData = fs.readFileSync('./base64.txt', 'utf-8'); // fileData = fileData.replace(/^data:audio\/\w+;base64,/, ""); // 不做替換也行 var dataBuffer = Buffer.from(fileData, 'base64'); var now = Date.now(); //獲取系統當前時間數值 var savePath = './' + now + '.wav'; //服務器存儲文件名 fs.writeFile(savePath, dataBuffer, function (err) { if (err) { console.log(err); } else { console.log('成功'); } }); })()
二、多段wav格式的Base64 合成一個 wav音頻文件
var fs = require('fs'); (async () => { var fileData = fs.readFileSync('./voice_base64.txt', 'utf-8'); // fileData = fileData.replace(/^data:audio\/\w+;base64,/, ""); // 不做替換也行 var dataBuffer = Buffer.from(fileData, 'base64'); var now = Date.now(); //獲取系統當前時間數值 var savePath = './' + now + '.wav'; //服務器存儲文件名 //模擬多段wav base64 var allBuffer = compliteWav([ dataBuffer, dataBuffer, dataBuffer ]) fs.writeFile(savePath, allBuffer, function (err) { if (err) { console.log(err); } else { console.log('成功'); } }); })() function compliteWav(res) { const wavHeadLen = 44; let times = res.length; let wavData = []; let allAudioLen = 0; for (let num = 0; num < times; num++) { let wav = Buffer.from(res[num], 'base64'); wavData.push(wav) allAudioLen += wav.length; } let wavHead = wavData[0].slice(0, wavHeadLen) //pcm部分 let pcmLen = allAudioLen - times * wavHeadLen let fileLen = pcmLen + wavHeadLen - 8 //修改4-8字節為<文件長度-4> 小端對齊 let fileLenBytes = Buffer.allocUnsafe(4); fileLenBytes.writeUIntLE(fileLen, 0, 4) wavHead = Buffer.concat([wavHead.slice(0, 4), fileLenBytes, wavHead.slice(8)]) //修改第40-44字節為<文件長度-44> let pcmLenBytes = Buffer.allocUnsafe(4); pcmLenBytes.writeUIntLE(pcmLen, 0, 4) wavHead = Buffer.concat([wavHead.slice(0, 40), pcmLenBytes]) let wavBytes = wavHead for (let num = 0; num < times; num++) { let b = wavData[num].slice(wavHeadLen) wavBytes = Buffer.concat([wavBytes, b]) } return wavBytes }
wav 與 mp3 的轉化使用 ffmpeg 工具
wav轉mp3
ffmpeg -i input.wav -f mp3 -acodec libmp3lame -y output.mp3
mp3轉wav
ffmpeg -i input.mp3 -f wav output.wav