Skip to content
TARUN S / PORTFOLIOTAP OR PRESS ANY KEY TO SKIP

Developer

000

Audio Customizer

TYPE
Audio processing web app
STACK
15 COMPONENTS
STATUS
SOURCE AVAILABLE
FEATURED
—

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

  1. 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.

  2. 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.

  3. 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.

  4. 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.