https://github.com/tr4cks/ffmpeg-vmaf-gpu-benchmark
Benchmarking FFmpeg GPU encodings with VMAF
https://github.com/tr4cks/ffmpeg-vmaf-gpu-benchmark
benchmark docker ffmpeg gpu nvidia vmaf
Last synced: 2 months ago
JSON representation
Benchmarking FFmpeg GPU encodings with VMAF
- Host: GitHub
- URL: https://github.com/tr4cks/ffmpeg-vmaf-gpu-benchmark
- Owner: tr4cks
- Created: 2025-09-17T16:21:53.000Z (9 months ago)
- Default Branch: main
- Last Pushed: 2025-09-17T18:26:05.000Z (9 months ago)
- Last Synced: 2025-09-17T19:51:23.740Z (9 months ago)
- Topics: benchmark, docker, ffmpeg, gpu, nvidia, vmaf
- Language: Python
- Homepage:
- Size: 18.6 KB
- Stars: 0
- Watchers: 0
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# FFmpeg GPU Transcoding & VMAF Benchmark
This project allows testing different **FFmpeg** configurations using GPU acceleration with an **NVIDIA Quadro P400**, and evaluating the visual quality of the generated videos with **VMAF**.
The goal is to compare multiple encoding settings on the same source video (containing diverse scenes: motion, static, dark, etc.), and produce a CSV report with both performance and quality metrics.
---
## 🎯 Goals
* Test different encoding configurations with **FFmpeg** and NVENC/NVDEC
* Measure the impact of each setting on:
* output file size
* encoding speed
* perceived quality (**VMAF** and **VMAF NEG**)
* Generate a consolidated CSV report
---
## 📦 Project Contents
* **Dockerfile**
* Builds **FFmpeg 8.0** with NVENC/NVDEC, libx264/libx265, and libvmaf support
* Installs **VMAF v3.0.0** and NVENC headers
* Based on CUDA, adapted for the **NVIDIA Quadro P400**
* **Python script (`ffmpeg_vmaf_benchmark.py`)**
* Reads a CSV file describing FFmpeg encoding settings
* Runs GPU-accelerated transcodes
* Automatically computes **VMAF** and **VMAF NEG**
* Produces a CSV report (file size, ratio, encoding time, quality metrics)
* **Examples**
* Input CSV with encoding parameters
* Output CSV with performance and quality results
---
## 🛠️ Requirements
* **NVIDIA GPU** with NVENC support (tested with Quadro P400)
* **Docker** and **NVIDIA Container Toolkit** installed
* A **source video** with varied scenes (motion, static, different lighting)
---
## 📦 Build the Docker image
```bash
docker build -t ffmpeg-vmaf-nvidia .
```
---
## ▶️ Usage
### 1. Prepare a configuration CSV
Example (`encoding_settings.csv`):
```csv
quality;flags
22;-c:v hevc_nvenc -cq:v 22
23;-c:v hevc_nvenc -cq:v 23
24;-c:v hevc_nvenc -cq:v 24
25;-c:v hevc_nvenc -cq:v 25
```
Each line defines a configuration to test:
* **quality**: identifier/quality parameter
* **flags**: FFmpeg options
---
### 2. Run the container
```bash
docker run --gpus all -it --rm \
-v $(pwd):/workspace \
ffmpeg-vmaf-nvidia bash
```
---
### 3. Launch the tests
Inside the container:
```bash
cd /workspace
python3 ffmpeg_vmaf_benchmark.py \
--input_csv encoding_settings.csv \
--source_video input.mp4 \
--output_dir results_videos \
--output_csv results.csv \
--max_transcode_workers 1 \
--max_vmaf_workers 2
```
---
## 📊 Example Results
### Example of generated CSV (`results.csv`):
```csv
index,quality,flags,size,ratio_size,walltime,usertime,vmaf_min,vmaf_max,vmaf_mean,vmaf_harmonic_mean,vmaf_neg_min,vmaf_neg_max,vmaf_neg_mean,vmaf_neg_harmonic_mean
0,22,"-c:v hevc_nvenc -cq:v 22","13706.75 KB",0.926,00:00:02:943:430,00:00:00:000:424,95.48,100.0,97.88,97.87,91.57,100.0,97.11,97.10
1,23,"-c:v hevc_nvenc -cq:v 23","11826.97 KB",0.799,00:00:02:929:708,00:00:00:001:107,95.35,100.0,97.86,97.85,91.70,100.0,97.01,97.00
```
Key columns:
* **size**: generated file size
* **ratio\_size**: output size / source size ratio
* **walltime**: actual transcoding time
* **usertime**: CPU time consumed
* **vmaf / vmaf\_neg**: min, max, mean, harmonic mean scores
---
## ⚙️ Script Options
| Option | Description | Default |
| ------------------------- | ------------------------------ | -------------------- |
| `--input_csv` | CSV file with FFmpeg configs | **required** |
| `--source_video` | Source video path | **required** |
| `--output_dir` | Directory for encoded videos | `out` |
| `--output_csv` | CSV results file | `output_results.csv` |
| `--max_transcode_workers` | Max parallel transcodes | `1` |
| `--max_vmaf_workers` | Max parallel VMAF calculations | `2` |
| `--sequential` | Sequential execution | `false` |
| `--vmaf_threads` | Number of CPU threads for VMAF | `1` |
---
## 📝 Notes
* The Dockerfile includes CUDA and dependencies for the Quadro P400.
* The project can be used with any NVIDIA GPU supporting NVENC.
* VMAF is computed twice:
* **Standard VMAF**
* **VMAF NEG** (stricter model).
---
## 🔗 Inspired by
This project was inspired by the article: [Benchmarking FFMPEG's H.265 Options](https://scottstuff.net/posts/2025/03/17/benchmarking-ffmpeg-h265/)