Member-only story

Update: I’ve added a new post describing how to do this client-side.
While working on kaizen.place, a music app that encourages continuous improvement of your music, I found a need to convert wav
files to mp3
. To keep hosting costs down, I set a limit of 10 MB for the file upload size. But a standard 3 minute song is just over 30 MB. Indirectly, this limit meant that for a full song, artists were required to upload mp3
files.
After hearing about (and seeing first hand) the annoyance of getting ready to upload a new version of a song, I figured it would probably be worth it to allow users to upload larger wav
files, but then convert them to mp3
. On average an mp3
converted track takes up about one tenth of the space of a wav
. This essentially means that wav files up to almost 100 MB can now be accepted without using more than 10 MB of storage space.
This post condenses the info that I picked up from several different sources to hopefully give you enough info for your next audio project.
Install fluent-ffmpeg
npm install fluent-ffmpegoryarn add fluent-ffmpeg
Installing ffmpeg
fluent-ffmpeg
is just a small layer on top of the ffmpeg
program. You therefore must have ffmpeg
installed
Ubuntu
apt-get install ffmpeg
Mac
brew install ffmpeg
Windows
Go download Ubuntu and install it at least on a partition of your hard drive. You’ll thank me later.
The Final Code
import ffmpeg from "fluent-ffmpeg";
import path from "path";function isWavFile(wavFilename: string) {
const ext = path.extname(wavFilename);
return ext === ".wav";
}function convertWavToMp3(wavFilename: string): Promise<string> {
return new Promise((resolve, reject) => {
if (!isWavFile(wavFilename)) {
throw new Error(`Not a wav file`);
} const outputFile = wavFilename.replace(".wav", ".mp3");
ffmpeg({
source: wavFilename,
}).on("error", (err) => {
reject(err);
}).on("end", () => {
resolve(outputFile);
}).save(outputFile);
});
}
Conclusion
And there you have it. The above code loads a wav
file from the filesystem and converts it to an mp3
.