VMAF (Video Multi-Method Assessment Fusion) is a perceptual video quality metric developed by Netflix. It scores an encode from 0 to 100 based on how close it looks to the source, weighted by what human viewers actually notice rather than by raw pixel difference.
This guide covers running a VMAF comparison in Video Commander, reading the result, and avoiding the setup mistakes that produce numbers you cannot trust.
What VMAF Actually Measures
VMAF is a full-reference metric. It always compares two files:
- The reference: your source or mezzanine file, the highest quality version you have.
- The distorted: the encode you want to evaluate.
The score describes how well the distorted file preserves the reference. It is a relative measurement, not an absolute grade. A 4K encode of a soft, noisy source can score higher than a 1080p encode of a pristine one, because VMAF is only ever answering one question: how much did this encode degrade compared to what it started with.
That matters for how you use it. VMAF is at its best when comparing encoder settings against each other on the same source, setting a quality floor for a delivery ladder, or catching a regression after changing an encoding pipeline.
Before You Start
You need three things:
- A reference file and a distorted file. They must be the same content, and they need matching resolution, frame rate, and frame count. libvmaf compares them frame by frame, so a trimmed clip, a different frame rate, or an extra leading black frame will misalign the comparison and drag the score down for reasons that have nothing to do with encoding quality.
- An FFmpeg build with libvmaf. Video Commander uses FFmpeg for analysis. Set the binary once in Settings, where the FFmpeg configuration is shared across Convert, Analyze, and Delivery. The app looks for
ffprobein the same directory. If the configured build cannot do VMAF, Video Commander tells you before any analysis starts rather than failing partway through. - Time. VMAF is computationally expensive. A full-length comparison at 1080p takes considerably longer than the encode did. For iteration, analyze a representative clip rather than the whole title.
Running the Analysis
Open your file, then select the Analyze tab. It has three sub-tabs: Options, Summary, and Timeline.
Set up the comparison
Options is where you choose the two files. Set the reference and the distorted file using the browse actions next to each field. Video Commander validates that you have selected two different files, which catches the most common setup error before it costs you an analysis run.
The Analyze view also surfaces recent job outputs, so after finishing an encode or a delivery job you can point the distorted field at that output without hunting through directories.
Read the summary
When the run finishes, Summary shows the aggregate result.
The Overall Quality Score is the headline number, with a plain-language label next to it (Excellent, Good, and so on). Below it sit three cards that matter more than the headline for most real work:
- Mean Score: the average across all frames.
- Minimum Score: the worst single frame in the file.
- Maximum Score: the best single frame.
The gap between mean and minimum is the interesting part. A file with a 97.80 mean and an 80.25 minimum has a handful of frames where quality fell off sharply, usually a hard cut, a high-motion sequence, or a scene the rate control underspent on. The mean alone hides that.
A Quality Interpretation panel below the cards maps score ranges to labels, with Excellent covering 95 to 100 and Good covering 80 to 95. As a rough working rule, differences of less than about 1 VMAF point are not reliably visible, so treat small deltas between two encodes as noise rather than a result.
Find where quality drops
Timeline plots the per-frame score across the full duration.
The header shows the frame count, and hovering over the chart inspects individual frames. This is how you turn a low minimum score into something actionable: find the dip, note the frame number, then open the same timecode in the Player tab to see what the encoder was struggling with.
Consistent scores across the timeline indicate rate control is holding quality steady. A sawtooth pattern, or repeated cliffs at regular intervals, usually points at GOP structure or buffer constraints rather than at the bitrate being too low overall.
Export the result
Both Summary and Timeline have an Export action for CSV and JSON. CSV suits per-frame data you want to chart or diff against another run. JSON suits feeding results into a regression check or attaching them to a ticket.
You do not have to rerun an analysis to revisit it. The Load Previous Analysis selector at the top of the Analyze view reloads any earlier VMAF job, which makes comparing this week's encode against last week's straightforward.
Choosing the Right Model
VMAF ships as a set of trained models, each targeting a viewing condition. Using the wrong one produces a valid score for the wrong scenario:
- HD is the default and assumes a 1080p display at a normal living room viewing distance. Use it for most streaming work.
- 4K assumes a 4K display. Use it when the delivery target is genuinely 4K, otherwise it will read high.
- Phone models the smaller screen and closer viewing distance of a handset. It scores the same encode higher than the HD model does, because compression artifacts are genuinely harder to see on a phone. Use it when tuning mobile-specific rungs of a ladder.
A model selector covering HD, 4K, and Phone is available in the encoding UI so libvmaf matches the intended playback target.
Letting the App Pick the Bitrate
Once you can measure quality, the natural next step is to encode to a quality target rather than to a bitrate. The Target VMAF quality mode in the Convert view does this: you set a VMAF threshold (the default is 93) and Video Commander finds the lowest-bitrate CRF that meets it.
It encodes a 30 second probe clip from the middle of the source, measures VMAF, and binary-searches over CRF values for up to six iterations until it converges, then runs the final encode at the CRF it found. The job detail reports the outcome, for example "Used CRF 21 · VMAF 93.47 · 145.3 MB · 2.4 Mbps".
This is usually the right way to build a delivery ladder. A fixed bitrate over-spends on simple content and starves complex content, while a fixed quality target lets each title land where it needs to.
Common Mistakes
Mismatched reference and distorted files. Different resolutions, frame rates, or durations break the frame-by-frame alignment. If a score comes back far lower than expected, verify the two files line up before concluding the encoder did something wrong.
Comparing against the wrong reference. The reference must be the source you encoded from. Measuring a 1080p encode against a 4K master measures the downscale as well as the encode, and the two are not separable in the result.
Trusting the mean alone. A high average with a low minimum means visible problems exist in specific scenes. Read the timeline.
Using the phone model to justify a lower bitrate for TV delivery. The score will look good and the delivered quality will not match it.
Reading small differences as real. Sub-1-point deltas fall inside the metric's own margin. Two encodes at 94.2 and 94.8 are, for practical purposes, the same.
The Short Version
- Set up the comparison: Analyze → Options, pick reference and distorted
- Aggregate score, mean, min, max: Analyze → Summary
- Per-frame quality and where it drops: Analyze → Timeline
- CSV or JSON output: Export, on either tab
- Revisit an earlier run: Load Previous Analysis
- Encode to a quality target instead of a bitrate: Convert → Target VMAF
Run VMAF without writing FFmpeg commands. Video Commander is a desktop app for Mac and Windows with VMAF analysis, container inspection, encoding, and packaging in one place. Download it here, or read more about Target VMAF encoding and the VMAF timeline graph.
