A hackathon MVP for uploading, processing, normalizing, merging, and streaming large video files using an async, scalable backend architecture.
This project demonstrates how heterogeneous video assets (different resolutions, FPS, audio levels, sources) can be analyzed, normalized, merged, and streamed through a unified API.
- Upload large video files safely (no backend memory usage)
- Analyze video/audio metadata (FFprobe)
- Normalize video & audio to a target profile
- Merge multiple videos (with transitions)
- Track processing jobs asynchronously
- Stream processed videos directly to the frontend
All processing is done asynchronously using a job queue and background workers.
- Large-file safe uploads using signed URLs
- Async job processing with Redis queue
- Video normalization (resolution, FPS, audio loudness)
- Video merging (crossfade support)
- Streamable outputs via object storage
- Hackathon-ready MVP architecture
Frontend (React)
↓
FastAPI Backend
├── Signed upload URLs
├── Job orchestration
├── Job status APIs
↓
Redis (Job Queue)
↓
Worker Process
├── FFprobe (analysis)
├── FFmpeg (normalize / merge)
↓
MinIO (Object Storage)
├── raw videos
├── processed videos
└── previews
- FastAPI
- Python
- FFmpeg / FFprobe
- Redis (job broker)
- MinIO (S3-compatible object storage)
- React
- Docker & Docker Compose
docker compose up -dCreate a bucket in MinIO named:
media
cd backend
uvicorn main:app --reloadAPI docs:
http://localhost:8000/docs
python worker.pyPOST /assets/upload-url→ get signed upload URLPOST /create-job→ create processing jobGET /get-job-status/{job_id}→ job progressGET /stream/{asset_id}→ stream video
This is a hackathon MVP, not a production system.
- In-memory job state
- Single worker
- No auth
- No retries or persistence guarantees
This project demonstrates:
- Practical handling of large media files
- Async processing pipelines
- Real-world media tooling (FFmpeg)