Audio Customizer
- TYPE
- Audio processing web app
- STACK
- 15 COMPONENTS
- STATUS
- SOURCE AVAILABLE
- FEATURED
- —
- LINKS
- SOURCE ↗
01 / OVERVIEW
A full-stack app that lets you upload an audio file and trim, speed-shift, pitch-shift, fade, reverse, or re-volume it — all processed server-side with FFmpeg.
Audio Customizer is a MERN-style project (React frontend, Express/Node backend) that lets a user upload an audio file and apply a range of FFmpeg-driven transformations to it — trimming, changing playback speed, adjusting volume, reversing, applying fade in/out, generating a waveform image, and shifting pitch. The frontend is a single-page React app built with Create React App, using react-dropzone-style file input, a styled 'Audio Customizer' upload panel, and the react-h5-audio-player component to preview uploaded/processed audio. The backend is an Express server that accepts uploads via Multer, stores file metadata (original path plus an array of processed outputs) in MongoDB via Mongoose, and shells out to `ffmpeg`/`fluent-ffmpeg` for each processing operation, serving the results back as static files from an /uploads route. There are two parallel backend implementations in the repo — a lean version in app.js that does everything inline with `child_process.exec`-style FFmpeg command strings, and a more structured version using a Mongoose model (AudioFile), a dedicated controller (audioController.js) and fluent-ffmpeg's fluent API for bitrate conversion and ffprobe-based metadata extraction (duration, format, bitrate). The project is still early-stage: several planned features (an AudioEditor component with trim/volume UI, an apiService.js Axios wrapper) exist but aren't fully wired to the backend yet.
02/ STACK & ARCHITECTURE
FRONTEND
- React
- JavaScript
- CSS
- react-h5-audio-player
- react-dropzone
- Axios
BACKEND
- Node.js
- Express
- MongoDB
- Mongoose
- Multer
- FFmpeg
- fluent-ffmpeg
- dotenv
- CORS
03 / WHAT WAS ACTUALLY HARD
- 01
Drag-and-drop upload with metadata persistence
Users upload an audio file via a Multer-backed /upload endpoint; the file is stored on disk with a timestamped filename, and its path plus an empty processedFiles array is saved to MongoDB as a new Audio/AudioFile document, returning an audioId used for all subsequent operations.
- 02
Seven FFmpeg-driven audio transformations
Dedicated endpoints for trim (start/end via -ss/-to), change-speed (atempo filter), adjust-volume (volume filter), reverse (areverse), apply-fade (afade in/out with configurable durations), generate-waveform (showwavespic, rendered as a PNG), and increase-pitch (combined asetrate + atempo). Each operation appends a record to the audio document's processedFiles array and returns a downloadable output path.
- 03
Alternate processing pipeline with metadata extraction
A separate audioController.js implementation re-encodes uploads with fluent-ffmpeg's audioBitrate(), then runs ffprobe to pull duration, format, and bitrate before saving an AudioFile record and cleaning up the original upload — showing an alternate, more metadata-rich design path alongside the primary app.js routes.
- 04
In-browser playback and processed-file management
The React UI (AudioUpload.js) lists every applied transformation with a live download link, and embeds react-h5-audio-player for immediate playback preview; a themed audio-uploader panel with gradient styling and hover animations wraps the whole workflow.