10 KiB
VMAF Optimisation Pipeline - Setup Guide
Quick Start
Prerequisites
- Python 3.8+
- FFmpeg with VMAF support (
ffmpeg -filters 2>&1 | grep libvmaf) - ab-av1 binary (v0.10.3+)
Installation
On Linux (Server/WSL):
# Clone repository
git clone https://gitea.theflagroup.com/bnair/VMAFOptimiser.git /opt/Optmiser
# Download ab-av1
cd /opt/Optmiser/bin
wget https://github.com/alexheretic/ab-av1/releases/download/v0.10.3/ab-av1-x86_64-unknown-linux-musl
chmod +x ab-av1
# Set up directories
mkdir -p /opt/Optmiser/tmp /opt/Optmiser/logs /opt/Optmiser/.lock
On Windows:
# Clone repository
git clone https://gitea.theflagroup.com/bnair/VMAFOptimiser.git C:\Optmiser
# Install dependencies
winget install ffmpeg
# Install Rust and ab-av1
# Download from https://rust-lang.org/
cargo install ab-av1
# Set up directories
mkdir C:\Optmiser\tmp, C:\Optmiser\logs
On macOS:
# Clone repository
git clone https://gitea.theflagroup.com/bnair/VMAFOptimiser.git /opt/Optmiser
# Install dependencies
brew install ffmpeg
# Install Rust and ab-av1
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
cargo install ab-av1
# Set up directories
mkdir -p /opt/Optmiser/tmp /opt/Optmiser/logs /opt/Optmiser/.lock
Running the Optimiser
Choose Your Script
Linux / WSL / macOS:
# Interactive mode (shows prompts)
./run_optimisation.sh
# Direct execution with parameters
./run_optimisation.sh --directory /mnt/Media/Movies --vmaf 95 --preset 6 --workers 1
# For 50% CPU mode on server
./run_optimisation.sh --directory /mnt/Media/Movies --vmaf 95 --workers 1 --cpu-limit 50
Windows:
# Interactive mode (shows prompts)
.\run_optimisation.ps1
# Direct execution with parameters
.\run_optimisation.ps1 -directory "D:\Movies" --vmaf 95 --preset 6 --workers 1
# For hardware acceleration (AMD GPU)
.\run_optimisation.ps1 -directory "D:\Movies" --vmaf 95 --hwaccel auto
Script Parameters
All wrapper scripts (run_optimisation.sh on Linux, run_optimisation.ps1 on Windows) accept these parameters:
| Parameter | Description | Default |
|---|---|---|
--directory <path> |
Root directory to scan | Current directory |
--vmaf <score> |
Target VMAF score | 95.0 |
--preset <value> |
SVT-AV1 Preset (4=best, 6=balanced, 8=fast) | 6 |
--workers <count> |
Concurrent files to process | 1 |
--samples <count> |
Samples for CRF search | 4 |
--thorough |
Use thorough mode (slower, more accurate) | false |
--encoder <name> |
ab-av1 encoder | svt-av1 |
--hwaccel <value> |
Hardware acceleration | none (auto: auto-detect) |
Multi-Machine Setup
How Lock Files Prevent Conflicts
Each video file has a lock file: /opt/Optmiser/.lock/{video_filename}
Process:
- Machine A: Checks for lock → Not found, creates lock
- Machine A: Starts encoding
- Machine B: Checks for lock → Found, skips file
- Machine A: Finishes, removes lock
- Machine B: Can now process that file
Result: Different machines automatically process different files simultaneously!
Setup for Multiple Machines
Machine 1 - Linux Server (Intel i9-12900H):
cd /opt/Optmiser
git pull origin main
./run_optimisation.sh /mnt/Media/movies --vmaf 95
Machine 2 - Windows PC (AMD RX 7900 XT):
cd C:\Optmiser
git pull origin main
.\run_optimisation.ps1 D:\Media\movies --vmaf 95 --hwaccel auto
Machine 3 - Another Linux PC:
cd /opt/Optmiser
git pull origin main
./run_optimisation.sh /home/user/Media/tv --vmaf 95
All three can run simultaneously!
Hardware Acceleration
Automatic Detection
When --hwaccel auto is specified, the wrapper scripts automatically select the best available hardware acceleration:
| Platform | Auto Selection | Notes |
|---|---|---|
| Windows | d3d11va | Direct3D Video Acceleration |
| macOS | videotoolbox | VideoToolbox framework |
| Linux/WSL | vaapi | Video Acceleration via VA-API |
GPU vs iGPU Priority
- Discrete GPU takes priority: If a discrete GPU (like AMD RX 7900 XT) is present, it's selected over integrated GPU
- For AMD RX 7900 XT: Hardware encoding provides ~3-10x speedup over CPU
- Note: GPU encoding may need slightly lower VMAF targets to match CPU quality
Customization
Changing VMAF Targets
Edit optimize_library.py:
# More aggressive (smaller files, lower quality)
TARGETS = [92.0, 90.0, 88.0]
# Conservative (larger files, higher quality)
TARGETS = [95.0, 94.0, 93.0]
Changing Savings Threshold
# More aggressive (encode more)
MIN_SAVINGS_PERCENT = 8.0
# Less aggressive (encode fewer)
MIN_SAVINGS_PERCENT = 15.0
Changing Encoder Preset
# Faster encodes (larger files, lower quality)
PRESET = 8
# Better quality (slower encodes, smaller files)
PRESET = 4
Platform-Specific Tips
For Linux Servers (Intel i9-12900H)
-
Use 50% CPU mode if running other services:
./run_optimisation.sh --directory /media --vmaf 95 --workers 1 --cpu-limit 50 -
Run during off-peak hours to minimize user impact
-
Monitor CPU temperature:
watch -n 2 'sensors | grep "Package id"' -
Use higher preset for faster encodes:
./run_optimisation.sh --vmaf 93 --preset 8
For Windows PCs (AMD RX 7900 XT)
-
Enable hardware acceleration for massive speedup:
.\run_optimisation.ps1 --directory "D:\Movies" --hwaccel auto -
Test small sample first to verify settings:
.\run_optimisation.ps1 --directory "D:\Media\sample" --thorough --vmaf 95 -
Monitor GPU usage (Task Manager or third-party tools)
-
Consider quality compensation - GPU encoding may need slightly lower VMAF targets to match CPU quality
For WSL (Ubuntu/Debian)
-
Access Windows drives via
/mnt/c/:ls /mnt/c/Media/movies -
Increase memory limits if encoding 4K content:
# Edit ~/.wslconfig [wsl2] memory=16GB
Running in Docker (Optional)
# Build image
docker build -t vmaf-optimiser .
# Run with mount
docker run -v /path/to/media:/media vmaf-optimiser /media
Troubleshooting
Issue: Scripts not found
Solution: Ensure you're in the correct directory with the scripts installed.
Issue: "ab-av1: command not found"
Solution: Install ab-av1 via cargo:
cargo install ab-av1
Issue: FFmpeg VMAF not available
Solution: Recompile FFmpeg with VMAF support or download a pre-built version that includes libvmaf.
Issue: Out of Memory
Solution: Reduce workers or increase swap:
# Increase swap
sudo fallocate -l 4G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
# Use more conservative settings
./run_optimisation.sh --workers 1 --vmaf 93
Issue: Multiple machines encoding same file
Solution: This is prevented by lock files. If you see duplicates, check /opt/Optmiser/.lock/ for stale locks.
Issue: Encoding fails
Solution: Check logs:
cat /opt/Optmiser/logs/failed_encodes.jsonl | jq '.'
Issue: "unexpected argument" error
Solution: Use correct flags for your ab-av1 version. The wrapper scripts now validate support at runtime.
Git Workflow
Initial Setup
cd /opt/Optmiser
git init
git remote add origin https://gitea.theflagroup.com/bnair/VMAFOptimiser.git
git branch -M main
git add .
git commit -m "Initial commit: VMAF optimisation pipeline"
git push -u origin main
Daily Updates
cd /opt/Optmiser
git pull origin main
# Run optimisation
./run_optimisation.sh /media tv_movies
# Review changes
git diff
Committing Changes
cd /opt/Optmiser
git status
# Add changed files
git add optimize_library.py run_optimisation.sh run_optimisation.ps1
# Commit with message
git commit -m "feat: add Windows and Linux wrapper scripts"
# Push
git push
Viewing Logs
# Watch logs in real-time
tail -f /opt/Optmiser/logs/tv_movies.jsonl | jq '.'
# Check files logged for review
cat /opt/Optmiser/logs/low_savings_skips.jsonl | jq '.[] | select(.recommendations=="logged_for_review")'
# Statistics
jq -r '.status' /opt/Optmiser/logs/tv_movies.jsonl | sort | uniq -c
# Find what CRF/VMAF combinations are being used most
jq -r '[.vmaf, .crf] | @tsv' /opt/Optmiser/logs/tv_movies.jsonl | sort | uniq -c
View History
cd /opt/Optmiser
git log --oneline
git log --graph --all
FAQ
Q: Can I run this on multiple machines at once? A: Yes! Each machine will process different files due to lock file mechanism.
Q: Should I use Windows or WSL? A: WSL is recommended for Linux compatibility. Use Windows native if you need direct hardware access or performance.
Q: Will hardware encoding work better than CPU? A: For AMD RX 7900 XT, hardware AV1 encoding is ~3-10x faster than CPU. However, GPU encoding may need slightly lower VMAF targets to match CPU quality.
Q: What VMAF target should I use? A: Start with VMAF 94 or 95. Drop to 92-90 if you need more savings.
Q: How do I know which files are being processed?
A: Check .lock/ directory: ls -la /opt/Optmiser/.lock/
Q: Can I pause/resume? A: Pause by stopping the script (Ctrl+C). Resume by running again - it skips processed files.
Q: What happens if encoding fails?
A: Error is logged to failed_encodes.jsonl. Original file is NOT modified.
Q: How much CPU does encoding use?
A: Full CPU by default. Use --workers 1 for single-threaded, or limit with --cpu-limit 50 for 50% (12 threads on 24-core).
Q: What are the log files? A:
tv_movies.jsonl- Successful TV & Movie encodescontent.jsonl- Successful Content folder encodeslow_savings_skips.jsonl- Files with <12% savings + 15% estimatesfailed_searches.jsonl- Files that couldn't hit any VMAF targetfailed_encodes.jsonl- Encoding errors
Q: How do I see real-time progress? A: The script streams all ab-av1 output in real-time, showing ETA, encoding speed, and frame count.
Last Updated: December 31, 2025 Version: 2.0 with Windows and Linux Wrapper Scripts