{"id":1243,"date":"2026-08-06T13:34:11","date_gmt":"2026-08-06T06:34:11","guid":{"rendered":"https:\/\/liveapi.com\/blog\/vmaf\/"},"modified":"2026-08-06T13:34:36","modified_gmt":"2026-08-06T06:34:36","slug":"vmaf","status":"publish","type":"post","link":"https:\/\/liveapi.com\/blog\/vmaf\/","title":{"rendered":"What Is VMAF? How Netflix&#8217;s Video Quality Metric Works and How to Use It"},"content":{"rendered":"<span class=\"rt-reading-time\" style=\"display: block;\"><span class=\"rt-label rt-prefix\">Reading Time: <\/span> <span class=\"rt-time\">13<\/span> <span class=\"rt-label rt-postfix\">minutes<\/span><\/span><p>VMAF is how streaming engineers answer a deceptively hard question: does this encode actually look good? Netflix open-sourced the metric in June 2016, and it now predicts human viewer ratings on a 0-100 scale with a correlation of roughly 0.90-0.95.<\/p>\n<p>That&#8217;s far better than the pixel-difference math the industry relied on for decades.<\/p>\n<p>In June 2026, Netflix shipped VMAF v1, the first major model overhaul since v0.6.1. It changes which artifacts the metric can see, which defaults you get, and which model files you should be pointing at. If your pipeline still references <code>vmaf_v0.6.1<\/code>, some of what follows will be news.<\/p>\n<h2>What Is VMAF?<\/h2>\n<p>VMAF (Video Multimethod Assessment Fusion) is a full-reference video quality metric that predicts subjective viewer ratings by fusing several image-quality features through a trained machine learning model, producing a score from 0 to 100 for every frame.<\/p>\n<p>&#8220;Full-reference&#8221; is the part that trips people up. VMAF needs both files: the pristine source and the compressed output.<\/p>\n<p>It can&#8217;t look at a single video and tell you how good it is. It tells you how much quality the encode lost relative to what went in, which is exactly the question you&#8217;re asking when you tune a <a href=\"https:\/\/liveapi.com\/blog\/what-is-video-codec\/\" target=\"_blank\">video codec<\/a> or build a bitrate ladder.<\/p>\n<p>The metric came out of a collaboration between Netflix, the University of Southern California, Nantes Universit\u00e9&#8217;s IPI\/LS2N lab, and the LIVE lab at the University of Texas at Austin. Netflix released it under a BSD+Patent license, so anyone can run it, retrain it, or ship it inside a product. The work earned a Technology and Engineering Emmy in 2021.<\/p>\n<p>VMAF exists because the old metrics lied. Two encodes could post identical PSNR numbers while one looked visibly worse to a person watching it. Netflix needed a number it could trust across thousands of titles and dozens of encoding decisions, so it built one from features that track how human vision actually fails.<\/p>\n<p>Here&#8217;s what the scale means in practice:<\/p>\n<figure class=\"wp-block-table\">\n<table>\n<thead>\n<tr>\n<th>VMAF score<\/th>\n<th>Perceived quality<\/th>\n<th>Typical use<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>90-100<\/td>\n<td>Excellent: near-transparent to the source<\/td>\n<td>Premium tier, mezzanine QC<\/td>\n<\/tr>\n<tr>\n<td>80-90<\/td>\n<td>Good: minor artifacts under scrutiny<\/td>\n<td>Top rungs of most ABR ladders<\/td>\n<\/tr>\n<tr>\n<td>70-80<\/td>\n<td>Fair to good: visible but acceptable<\/td>\n<td>Mid ladder rungs, mobile delivery<\/td>\n<\/tr>\n<tr>\n<td>50-70<\/td>\n<td>Fair: noticeable degradation<\/td>\n<td>Low-bandwidth fallback rungs<\/td>\n<\/tr>\n<tr>\n<td>20-50<\/td>\n<td>Poor: obvious artifacts<\/td>\n<td>Below most delivery thresholds<\/td>\n<\/tr>\n<tr>\n<td>0-20<\/td>\n<td>Bad: severe distortion<\/td>\n<td>Failure state<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<h2>VMAF vs PSNR vs SSIM<\/h2>\n<p>Three full-reference metrics dominate video engineering, and they measure genuinely different things. Picking the wrong one is how teams end up shipping encodes that score well and look bad.<\/p>\n<p><strong>PSNR<\/strong> (peak signal-to-noise ratio) measures pixel-level error between two frames and reports it in decibels. It&#8217;s cheap to compute and it&#8217;s been the codec-comparison standard since the 1990s.<\/p>\n<p>It&#8217;s also close to blind to how people perceive video. A blurry frame and a blocky frame can post the same <a href=\"https:\/\/liveapi.com\/blog\/psnr\/\" target=\"_blank\">PSNR<\/a> while looking nothing alike to a viewer.<\/p>\n<p><strong>SSIM<\/strong> (structural similarity index) improved on that by comparing luminance, contrast, and structure across local neighborhoods instead of individual pixels. MS-SSIM, the multi-scale variant, tracks perception better still. Both remain frame-by-frame measurements with no sense of motion.<\/p>\n<p><strong>VMAF<\/strong> fuses multiple features, including a temporal one, through a model trained on actual human ratings. That training step is the difference. PSNR and SSIM are formulas someone derived; VMAF is a prediction fitted to what viewers said.<\/p>\n<figure class=\"wp-block-table\">\n<table>\n<thead>\n<tr>\n<th>Attribute<\/th>\n<th>PSNR<\/th>\n<th>SSIM<\/th>\n<th>VMAF<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>What it measures<\/td>\n<td>Pixel error<\/td>\n<td>Structural similarity<\/td>\n<td>Predicted viewer opinion<\/td>\n<\/tr>\n<tr>\n<td>Scale<\/td>\n<td>Decibels, logarithmic<\/td>\n<td>0-1, logarithmic feel<\/td>\n<td>0-100, roughly linear<\/td>\n<\/tr>\n<tr>\n<td>Temporal awareness<\/td>\n<td>None<\/td>\n<td>None<\/td>\n<td>Yes (motion feature)<\/td>\n<\/tr>\n<tr>\n<td>Trained on human ratings<\/td>\n<td>No<\/td>\n<td>No<\/td>\n<td>Yes<\/td>\n<\/tr>\n<tr>\n<td>Compute cost<\/td>\n<td>Very low<\/td>\n<td>Low<\/td>\n<td>Moderate to high<\/td>\n<\/tr>\n<tr>\n<td>Correlation with MOS<\/td>\n<td>Weak<\/td>\n<td>Moderate<\/td>\n<td>Strong (~0.90-0.95)<\/td>\n<\/tr>\n<tr>\n<td>Handles scaling artifacts<\/td>\n<td>Poorly<\/td>\n<td>Partially<\/td>\n<td>Yes<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>The linear scale matters more than it sounds. Moving PSNR from 38 dB to 40 dB tells you almost nothing about how much better the video looks. Moving VMAF from 85 to 93 maps to something a viewer would actually notice, which makes it usable as a target in automated encoding decisions and in <a href=\"https:\/\/liveapi.com\/blog\/definition-of-qoe\/\" target=\"_blank\">quality of experience<\/a> reporting.<\/p>\n<p>None of this makes PSNR useless. It&#8217;s fast, it&#8217;s deterministic, and it&#8217;s a decent smoke test for &#8220;did this encode break.&#8221; Most production pipelines compute all three and use VMAF for the decisions that matter.<\/p>\n<h2>How Does VMAF Work?<\/h2>\n<p>VMAF doesn&#8217;t compute one thing. It computes several elementary features per frame, then feeds them into a trained regressor that outputs a single number.<\/p>\n<ol>\n<li><strong>Align the two videos.<\/strong> Reference and distorted clips have to match in resolution, frame rate, and frame count. Mismatch here is the single most common source of nonsense scores.<\/li>\n<li><strong>Extract elementary features per frame.<\/strong> The v0 models use Visual Information Fidelity (VIF) at multiple spatial scales, the Detail Loss Metric (DLM), and Mean Co-Located Pixel Difference (MCPD) for motion. VMAF v1 drops VIF, keeps DLM and MCPD, and adds a banding detector and chroma features.<\/li>\n<li><strong>Feed the features into the fusion model.<\/strong> A support vector machine regressor, trained on subjective scores from human viewing sessions, maps the feature vector to a predicted opinion score.<\/li>\n<li><strong>Clamp to the score range.<\/strong> Each frame gets a value from 0 to 100, where 100 means indistinguishable from the reference.<\/li>\n<li><strong>Pool the per-frame scores.<\/strong> By default VMAF takes the arithmetic mean across every frame to produce the clip-level score you see reported.<\/li>\n<\/ol>\n<p>The motion feature is what separates VMAF from its predecessors. MCPD measures how much the luminance channel changes between consecutive frames, which lets the model account for temporal masking: viewers tolerate far more compression artifacts in fast-moving content than in a slow pan across a gradient sky.<\/p>\n<p>A frame-by-frame metric can&#8217;t make that distinction. That&#8217;s why per-frame metrics penalize action sequences that look fine and wave through static scenes that look terrible.<\/p>\n<p>The per-frame output is also the part most teams ignore, and the clip average hides everything. A file averaging VMAF 92 with a 30-frame dip to 60 produces a visible glitch the headline number never reveals.<\/p>\n<p>That kind of dip is a common cause of complaints about <a href=\"https:\/\/liveapi.com\/blog\/what-is-video-encoding\/\" target=\"_blank\">video encoding<\/a> quality that &#8220;tests fine.&#8221;<\/p>\n<h2>VMAF Models Explained: v0.6.1 vs VMAF v1<\/h2>\n<p>VMAF isn&#8217;t one model. It&#8217;s a family, and the one you pick encodes an assumption about how your viewers watch. Point at the wrong file and your scores will be internally consistent and externally meaningless.<\/p>\n<h3>The v0.6.1 family (2016-2026)<\/h3>\n<p><code>vmaf_v0.6.1<\/code> is the default model almost every tutorial and blog post references. It assumes a 1080p display viewed from three times the screen height, which is roughly a TV across a living room. Netflix added a phone model in 2017 that applies a polynomial adjustment for small screens held close, and a 4K model in 2018 trained for <a href=\"https:\/\/liveapi.com\/blog\/4k-live-streaming-encoder\/\" target=\"_blank\">4K<\/a> TVs at 1.5x display height.<\/p>\n<p>There&#8217;s also <code>vmaf_v0.6.1neg<\/code>, the no-enhancement-gain variant. Netflix published it after researchers showed that sharpening a video before encoding could inflate its VMAF score without improving how it looked. NEG caps the reward for enhancement, which makes it the honest choice for comparing encoders.<\/p>\n<h3>The VMAF v1 family (June 2026)<\/h3>\n<p>VMAF v1 is the first structural rewrite in a decade, and it changes four things:<\/p>\n<ul>\n<li><strong>NEG behavior is on by default.<\/strong> You no longer opt into the anti-gaming variant; it&#8217;s the baseline.<\/li>\n<li><strong>Banding detection is built in.<\/strong> VMAF v1 folds in CAMBI, the Contrast Aware Multiscale Banding Index, so the model finally sees the staircase edges that appear in smooth gradients. The v0 models were blind to banding entirely.<\/li>\n<li><strong>Chroma artifacts count.<\/strong> VMAF v0 extracted luma-only features, which meant color quantization and chroma subsampling damage went unscored. VMAF v1 applies a modified SpEED-QA to the chroma channels.<\/li>\n<li><strong>Viewing distance replaced the phone hack.<\/strong> Instead of a phone-specific polynomial, v1 uses a contrast-sensitivity model parameterized by viewing distance, and ships a model file per distance.<\/li>\n<\/ul>\n<p>Netflix also removed VIF, which was the most expensive feature to compute and stopped contributing accuracy once the other features improved. The net result is a model that sees more artifacts and runs faster than the one it replaces. The <a href=\"https:\/\/netflixtechblog.com\/vmaf-v1-good-is-not-good-enough-60d7e4244ea8\" target=\"_blank\" rel=\"nofollow\">VMAF v1 announcement<\/a> documents the accuracy gains in detail.<\/p>\n<h3>Which model file to use<\/h3>\n<figure class=\"wp-block-table\">\n<table>\n<thead>\n<tr>\n<th>Model file<\/th>\n<th>Resolution<\/th>\n<th>Viewing distance<\/th>\n<th>Use for<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>vmaf_v1.0.16_3d0h.json<\/code><\/td>\n<td>1080p<\/td>\n<td>3H<\/td>\n<td>Living-room TV, general default<\/td>\n<\/tr>\n<tr>\n<td><code>vmaf_v1.0.16_5d0h.json<\/code><\/td>\n<td>1080p<\/td>\n<td>5H<\/td>\n<td>Phone and small-screen viewing<\/td>\n<\/tr>\n<tr>\n<td><code>vmaf_v1.0.16_1d5h_2160.json<\/code><\/td>\n<td>2160p<\/td>\n<td>1.5H<\/td>\n<td>4K close viewing<\/td>\n<\/tr>\n<tr>\n<td><code>vmaf_v1.0.16_3d0h_2160.json<\/code><\/td>\n<td>2160p<\/td>\n<td>3H<\/td>\n<td>4K consumer TV (range 0-110)<\/td>\n<\/tr>\n<tr>\n<td><code>vmaf_v0.6.1<\/code><\/td>\n<td>1080p<\/td>\n<td>3H<\/td>\n<td>Legacy comparisons, historical baselines<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>Each v1 model also ships an <code>_hfr<\/code> variant under <code>model\/vmaf_v1.0.16_hfr\/<\/code> for high-frame-rate content around 50-60 fps. One more thing worth knowing: Netflix recommends running VMAF v1 at 10-bit precision for SDR content, because 8-bit processing masks the banding the new model is specifically trained to catch.<\/p>\n<p>If you have historical VMAF data, don&#8217;t mix generations. A v1 score and a v0.6.1 score on the same file are different numbers answering slightly different questions. Rebaseline before you migrate.<\/p>\n<h2>What Is a Good VMAF Score?<\/h2>\n<p>Target 93 or higher for premium delivery, 85-93 for the top rung of a normal ladder, and treat anything below 60 as a complaint waiting to happen. The exact number depends on your delivery tier, but the industry has converged on defensible bands.<\/p>\n<p><strong>VMAF 93-95 is the transparency threshold.<\/strong> At 95, most viewers can&#8217;t distinguish the encode from the source in a side-by-side test. This is the target for mezzanine files and premium tiers where storage and bandwidth aren&#8217;t the binding constraint.<\/p>\n<p><strong>VMAF 85-93 is the sweet spot for top ladder rungs.<\/strong> You&#8217;re spending far fewer bits than transparency requires, and the difference is invisible during normal viewing. Large UGC platforms typically land in the 84-92 range for their highest rungs.<\/p>\n<p><strong>VMAF 70-85 covers the middle of an <a href=\"https:\/\/liveapi.com\/blog\/adaptive-bitrate-streaming\/\" target=\"_blank\">adaptive bitrate streaming<\/a> ladder.<\/strong> Viewers on constrained connections get something that looks fine on a phone and merely acceptable on a TV.<\/p>\n<p><strong>Below VMAF 60, you&#8217;re in complaint territory<\/strong> for paid services. Research on acceptance rates puts the 50% acceptability line around VMAF 55 for free services and around 70 for paid ones.<\/p>\n<h3>The 6-point rule<\/h3>\n<p>A widely used rule of thumb holds that roughly 6 VMAF points equal one Just Noticeable Difference. If encode A scores 88 and encode B scores 90, stop arguing about it and pick whichever is cheaper. If A scores 88 and B scores 96, that&#8217;s a gap your viewers will see.<\/p>\n<h3>Pooling changes the answer<\/h3>\n<p>The default arithmetic mean rewards content that&#8217;s easy to encode and hides localized failures. Human opinion doesn&#8217;t work that way. Viewers weight the worst moments far more heavily than the average, which is why a single bad scene sinks a session that was otherwise clean.<\/p>\n<p>libvmaf supports alternative pooling methods for exactly this reason: <code>mean<\/code>, <code>harmonic_mean<\/code>, <code>median<\/code>, <code>min<\/code>, <code>perc5<\/code>, <code>perc10<\/code>, and <code>perc20<\/code>. The harmonic mean and the 5th-percentile score both punish dips the arithmetic mean smooths over.<\/p>\n<p>A practical setup reports three numbers per file:<\/p>\n<ul>\n<li><strong>Arithmetic mean<\/strong> for the headline score<\/li>\n<li><strong>5th percentile<\/strong> for the worst stretches<\/li>\n<li><strong>Frame count below your floor<\/strong> for localized failures<\/li>\n<\/ul>\n<p>Tune your <a href=\"https:\/\/liveapi.com\/blog\/video-bitrate\/\" target=\"_blank\">video bitrate<\/a> against all three, not just the first.<\/p>\n<h2>Advantages of VMAF<\/h2>\n<h3>It predicts human opinion, not pixel math<\/h3>\n<p>VMAF is trained on subjective scores from real viewing sessions, so it&#8217;s fitted to perception rather than derived from an equation someone hoped would match perception. That&#8217;s why it correlates with mean opinion scores at 0.90-0.95 while PSNR sits far below.<\/p>\n<h3>It works across codecs<\/h3>\n<p>Because it scores output rather than bitstream internals, VMAF compares encodes from different codecs on the same scale. Benchmark testing has shown it outperforming other metrics across H.265, VP9, <a href=\"https:\/\/liveapi.com\/blog\/av1-codec\/\" target=\"_blank\">AV1<\/a>, and VVC. That&#8217;s what makes it usable for the &#8220;is <a href=\"https:\/\/liveapi.com\/blog\/hevc-vs-h264\/\" target=\"_blank\">AV1 worth the encode cost versus H.264<\/a>&#8221; question that every streaming team eventually faces.<\/p>\n<h3>The scale is readable<\/h3>\n<p>A 0-100 linear range means anyone on the team can interpret it. Product managers understand &#8220;we&#8217;re shipping at 91.&#8221; Nobody outside video engineering has an intuition for 41.3 dB.<\/p>\n<h3>It catches scaling artifacts<\/h3>\n<p>VMAF accounts for both quantization damage like blockiness and scaling damage like the softness introduced when a 720p encode gets upscaled to a 1080p display. Metrics that compare same-resolution frames miss half of that, which matters enormously for lower ladder rungs where resolution changes are the whole point.<\/p>\n<h3>It&#8217;s open source and auditable<\/h3>\n<p>The <a href=\"https:\/\/github.com\/Netflix\/vmaf\" target=\"_blank\" rel=\"nofollow\">open-source VMAF repository<\/a> ships the C library, the Python bindings, the model files, and the training code. You can retrain on your own subjective data if your content differs from what Netflix trained on. Animation, screen content, and sports all have quirks the default models weren&#8217;t fitted for.<\/p>\n<h3>Automation makes it cheap to act on<\/h3>\n<p>Once VMAF is in your pipeline, it stops being a report and becomes a control signal. You can target a score instead of a bitrate, which is the foundation of per-title encoding: encode each title at multiple bitrates and resolutions, find the settings that hit your quality target for the fewest bits, and ship that ladder. Compared against <a href=\"https:\/\/liveapi.com\/blog\/vp9-codec\/\" target=\"_blank\">VP9<\/a> or H.264 baselines, the savings are usually double digits.<\/p>\n<h2>Limitations of VMAF<\/h2>\n<p>VMAF is the best general-purpose metric available, and it will still mislead you in specific, predictable ways.<\/p>\n<h3>It can be gamed<\/h3>\n<p>Preprocessing a video before encoding can inflate its VMAF score without improving how it looks. Research on <a href=\"https:\/\/arxiv.org\/abs\/2107.04510\" target=\"_blank\" rel=\"nofollow\">preprocessing vulnerability<\/a> found sharpening and histogram equalization pushing scores up by as much as 218.8% in extreme cases, with subjective quality flat or worse.<\/p>\n<p>The NEG variant reduces this but doesn&#8217;t eliminate it. The same study found NEG still inflatable by up to 23.6%.<\/p>\n<p>So if a vendor quotes you a VMAF number, ask what preprocessing ran first.<\/p>\n<h3>Resolution assumptions distort low-res scores<\/h3>\n<p>The default model assumes a 1080p display. Feed it a 480p file directly and VMAF treats it as a crop from 1080p, effectively modeling a viewer sitting 6.75 picture heights away, which hides artifacts and returns an implausibly high score. The fix is mandatory: upscale the encode to the model&#8217;s resolution before measuring, and use bicubic if you don&#8217;t know what the actual display device uses.<\/p>\n<h3>Averaging hides the failures that matter<\/h3>\n<p>The arithmetic mean over a two-hour film tells you almost nothing about the thirty seconds that made someone close the tab. Percentile pooling and per-frame logs are the mitigation, and most teams skip both.<\/p>\n<h3>It scores files, not sessions<\/h3>\n<p>VMAF measures encode quality. It says nothing about rebuffering, startup delay, or ABR switching behavior, which drive abandonment at least as much as picture quality. A ladder with a perfect average VMAF that causes <a href=\"https:\/\/liveapi.com\/blog\/buffering-when-streaming\/\" target=\"_blank\">buffering<\/a> on real connections is a worse product than a slightly softer one that plays through.<\/p>\n<h3>It&#8217;s expensive at scale<\/h3>\n<p>Running VMAF across every asset in a large library costs real compute. VMAF v1 is cheaper than v0 after the VIF removal, and GPU acceleration through <code>libvmaf_cuda<\/code> helps considerably, but a full-reference metric still means decoding two videos in lockstep for every measurement.<\/p>\n<p>That&#8217;s what VMAF measures and where it breaks down. Now for the practical side: how to install it, how to run it, and how to fit it into a working pipeline.<\/p>\n<h2>How to Run VMAF with FFmpeg<\/h2>\n<p>The <code>libvmaf<\/code> filter is the standard path. Everything below assumes an FFmpeg build with VMAF support compiled in.<\/p>\n<h3>Check whether your build already has it<\/h3>\n<pre><code class=\"language-bash\">ffmpeg -filters | grep vmaf<\/code><\/pre>\n<p>If nothing comes back, check the configuration flags:<\/p>\n<pre><code class=\"language-bash\">ffmpeg -version | tr &#x27; &#x27; &#x27;\\n&#x27; | grep vmaf<\/code><\/pre>\n<p>You want <code>--enable-libvmaf<\/code> in the output.<\/p>\n<h3>Install libvmaf and rebuild FFmpeg<\/h3>\n<p>libvmaf builds with Meson and Ninja. Version 3.0.0 is the current stable release.<\/p>\n<pre><code class=\"language-bash\">git clone https:\/\/github.com\/Netflix\/vmaf.git\ncd vmaf\/libvmaf\nmeson setup build --buildtype release\nninja -C build\nsudo ninja -C build install<\/code><\/pre>\n<p>Then rebuild FFmpeg against it:<\/p>\n<pre><code class=\"language-bash\">.\/configure --enable-libvmaf --enable-gpl\nmake -j&quot;$(nproc)&quot;\nsudo make install<\/code><\/pre>\n<p>On macOS, <code>brew install ffmpeg<\/code> ships with libvmaf enabled in most recent formulas, so check before you build anything.<\/p>\n<h3>Run a basic comparison<\/h3>\n<p>Order matters. The first input is the distorted file, the second is the reference.<\/p>\n<pre><code class=\"language-bash\">ffmpeg -i encoded.mp4 -i source.mp4 \\\n  -lavfi libvmaf=log_fmt=json:log_path=vmaf.json \\\n  -f null -<\/code><\/pre>\n<p>You&#8217;ll see a line like <code>VMAF score: 92.417213<\/code> when it finishes, and the JSON log will contain every per-frame value.<\/p>\n<h3>Handle a resolution mismatch<\/h3>\n<p>This is the step teams skip, and it&#8217;s the one that produces wrong numbers. If your encode is 720p and your source is 1080p, upscale the encode first:<\/p>\n<pre><code class=\"language-bash\">ffmpeg -i encoded_720p.mp4 -i source_1080p.mp4 \\\n  -lavfi &quot;[0:v]scale=1920:1080:flags=bicubic,setsar=1[dist];\\\n[1:v]setsar=1[ref];\\\n[dist][ref]libvmaf=model=&#x27;version=vmaf_v0.6.1&#x27;:n_threads=8:log_fmt=json:log_path=vmaf.json&quot; \\\n  -f null -<\/code><\/pre>\n<p>Frame rates have to match too. Add <code>fps=fps=30<\/code> to whichever branch needs it.<\/p>\n<h3>Pick a model and a pooling method<\/h3>\n<pre><code class=\"language-bash\">ffmpeg -i encoded.mp4 -i source.mp4 \\\n  -lavfi &quot;libvmaf=model=&#x27;path=\/usr\/local\/share\/model\/vmaf_v1.0.16_3d0h.json&#x27;:\\\npool=harmonic_mean:n_threads=8:log_fmt=json:log_path=vmaf.json&quot; \\\n  -f null -<\/code><\/pre>\n<p>The filter&#8217;s useful options are <code>model<\/code>, <code>feature<\/code>, <code>log_path<\/code>, <code>log_fmt<\/code>, <code>pool<\/code>, <code>n_threads<\/code>, and <code>n_subsample<\/code>. Setting <code>n_subsample=5<\/code> scores every fifth frame, which cuts runtime by roughly 80% at the cost of missing short dips. Use it for sweeps, not for final QC.<\/p>\n<h3>Compute PSNR and SSIM in the same pass<\/h3>\n<pre><code class=\"language-bash\">ffmpeg -i encoded.mp4 -i source.mp4 \\\n  -lavfi &quot;libvmaf=feature=&#x27;name=psnr|name=float_ssim&#x27;:log_fmt=json:log_path=metrics.json&quot; \\\n  -f null -<\/code><\/pre>\n<h3>Use GPU acceleration<\/h3>\n<p><code>libvmaf_cuda<\/code> runs the feature extraction on NVIDIA hardware and is dramatically faster on large libraries. It pairs naturally with a <a href=\"https:\/\/liveapi.com\/blog\/software-vs-hardware-encoding\/\" target=\"_blank\">hardware encoding<\/a> workflow where the frames are already on the GPU.<\/p>\n<pre><code class=\"language-bash\">ffmpeg -hwaccel cuda -hwaccel_output_format cuda -i encoded.mp4 \\\n       -hwaccel cuda -hwaccel_output_format cuda -i source.mp4 \\\n       -lavfi libvmaf_cuda=log_fmt=json:log_path=vmaf.json \\\n       -f null -<\/code><\/pre>\n<h3>Skip FFmpeg entirely<\/h3>\n<p>The standalone <code>vmaf<\/code> CLI takes raw YUV or Y4M input and gives you more direct control:<\/p>\n<pre><code class=\"language-bash\">vmaf --reference source.y4m --distorted encoded.y4m \\\n     --model version=vmaf_v0.6.1 \\\n     --feature psnr --feature float_ssim \\\n     --output vmaf.json --json<\/code><\/pre>\n<p>For scripted analysis, the <code>ffmpeg-quality-metrics<\/code> Python package wraps all of this and returns parsed results, which saves you from writing yet another JSON reader. If you&#8217;d rather not touch a terminal, FFMetrics and similar VMAF GUI tools wrap the same libraries with a drag-and-drop interface.<\/p>\n<h2>Where VMAF Fits in a Streaming Pipeline<\/h2>\n<p>Measuring VMAF is straightforward. Building the pipeline that acts on it is where the work actually lives.<\/p>\n<h3>Encoder tuning and codec selection<\/h3>\n<p>The first place VMAF earns its keep is settings comparison. Encode the same source at a range of CRF or bitrate values, plot VMAF against bitrate, and you get a rate-quality curve that tells you exactly where diminishing returns start. Do it per codec and you have a defensible answer on whether a <a href=\"https:\/\/liveapi.com\/blog\/what-is-video-transcoding\/\" target=\"_blank\">transcoding<\/a> migration pays for itself.<\/p>\n<h3>Per-title and per-shot ladder construction<\/h3>\n<p>This is what Netflix built VMAF for. Instead of one static ABR ladder for every asset, you encode each title at multiple bitrate and resolution combinations, score each with VMAF, and keep the points that sit on the convex hull of the rate-quality curve.<\/p>\n<p>An animated short and a handheld sports clip need very different ladders. A static ladder overspends on one while starving the other, and teams that switch typically cut delivery bitrates by 20-40% at matched quality.<\/p>\n<h3>Automated QC gates<\/h3>\n<p>Once VMAF is in CI, it becomes a gate. Any encode landing below your floor fails the build instead of reaching viewers. Pair the aggregate score with a per-frame minimum so a clean average can&#8217;t smuggle a broken scene through.<\/p>\n<h3>The build-versus-buy reality<\/h3>\n<p>Running this yourself means a <a href=\"https:\/\/liveapi.com\/blog\/cloud-based-video-encoding\/\" target=\"_blank\">cloud-based video encoding<\/a> farm, a quality-measurement layer, ladder logic, packaging, and CDN delivery. That&#8217;s a team and a roadmap, not a sprint. Most product teams don&#8217;t want to own it.<\/p>\n<p>This is where a <a href=\"https:\/\/liveapi.com\/blog\/video-transcoding-api\/\" target=\"_blank\">video transcoding API<\/a> changes the math. LiveAPI handles encoding, adaptive bitrate rendition generation, and <a href=\"https:\/\/liveapi.com\/blog\/what-is-hls-streaming\/\" target=\"_blank\">HLS<\/a> output, with instant encoding that makes uploads playable within seconds regardless of file length, support up to 4K, and delivery across Akamai, Cloudflare, and Fastly.<\/p>\n<p>You still measure VMAF on your own mezzanine files when you need to make a codec or quality decision. You just don&#8217;t operate the encoding farm that produces the renditions, or the <a href=\"https:\/\/liveapi.com\/blog\/multi-cdn\/\" target=\"_blank\">multi-CDN<\/a> layer that delivers them.<\/p>\n<h2>Is VMAF Worth Measuring Yourself?<\/h2>\n<p>Not every team needs this. Running VMAF properly means storing mezzanine sources, budgeting compute, and having someone who can interpret the output.<\/p>\n<p><strong>Measure VMAF yourself if:<\/strong><\/p>\n<ul>\n<li>You encode enough volume that a 20% bitrate reduction pays real money<\/li>\n<li>You&#8217;re evaluating a codec or encoder migration and need evidence<\/li>\n<li>Your content is unusual (animation, screen recordings, high-motion sports) and generic presets underperform<\/li>\n<li>You have contractual quality obligations to a customer or licensor<\/li>\n<li>You&#8217;re building per-title or per-shot ladders<\/li>\n<\/ul>\n<p><strong>Skip it if:<\/strong><\/p>\n<ul>\n<li>You stream live and never re-encode from a mezzanine<\/li>\n<li>Your volume is low enough that engineering time costs more than the bandwidth you&#8217;d save<\/li>\n<li>You&#8217;re using a managed encoding service whose defaults already land above 90<\/li>\n<li>You don&#8217;t retain source files to compare against<\/li>\n<\/ul>\n<p>If you&#8217;re in the second group, the useful move is picking infrastructure with sane defaults and spending your attention on playback reliability instead. Buffering and startup time drive more churn than a few VMAF points ever will.<\/p>\n<h2>VMAF FAQ<\/h2>\n<h3>What does VMAF stand for?<\/h3>\n<p>Video Multimethod Assessment Fusion. The name describes the design: multiple quality assessment methods fused by a trained model into one score.<\/p>\n<h3>Is a VMAF score of 80 good?<\/h3>\n<p>For most delivery it&#8217;s acceptable but not premium. VMAF 80 means visible artifacts under scrutiny and fine during normal viewing. Aim for 90+ on your top ladder rung and treat 80 as reasonable for mid-tier renditions.<\/p>\n<h3>Can VMAF work without the original video?<\/h3>\n<p>No. VMAF is a full-reference metric and needs both the source and the encode. If you only have the encode, you need a no-reference metric instead, and those are considerably less accurate.<\/p>\n<h3>Why does my 480p video score higher than expected?<\/h3>\n<p>The default model assumes a 1080p display. A 480p file gets treated as a small crop of a 1080p frame, which models an unrealistically distant viewer and hides artifacts. Upscale the encode to 1080p with bicubic before measuring.<\/p>\n<h3>What&#8217;s the difference between VMAF and VMAF NEG?<\/h3>\n<p>NEG stands for no-enhancement gain. It caps the score boost that preprocessing like sharpening can produce, so it&#8217;s the right choice for honest encoder comparisons. In VMAF v1, NEG behavior is the default rather than a separate model.<\/p>\n<h3>Should I switch to VMAF v1?<\/h3>\n<p>For new work, yes. VMAF v1 detects banding and chroma artifacts that v0 was blind to, and it runs faster after VIF was removed. Just don&#8217;t compare v1 scores to historical v0.6.1 numbers directly. Rebaseline first.<\/p>\n<h3>Does VMAF work for live streaming?<\/h3>\n<p>Not in the delivery path. Live encoding has no mezzanine reference to compare against in real time, and the compute cost is prohibitive at low latency. Teams use VMAF offline to tune the live encoder profiles they then run in production.<\/p>\n<h3>How long does VMAF take to run?<\/h3>\n<p>Roughly real time to several times real time on CPU, depending on resolution, thread count, and model. GPU acceleration through <code>libvmaf_cuda<\/code> cuts that substantially, and <code>n_subsample<\/code> trades accuracy for speed when you&#8217;re sweeping settings rather than doing final QC.<\/p>\n<h3>Can I use VMAF for images?<\/h3>\n<p>It&#8217;s built for video and its motion feature does nothing on a single frame. For still images, SSIM, MS-SSIM, or a dedicated image metric will serve you better.<\/p>\n<h3>Which VMAF model should I use for mobile?<\/h3>\n<p>Use <code>vmaf_v1.0.16_5d0h.json<\/code>, the 5H viewing-distance model, which replaces the old <code>phone_model=1<\/code> flag from the v0 generation. Small screens held close tolerate more compression than a TV across a room.<\/p>\n<h2>The Bottom Line on VMAF<\/h2>\n<p>VMAF gives you a number that tracks what viewers actually perceive, which makes it the right tool for encoder tuning, codec decisions, and per-title ladder construction. VMAF v1 extends that to banding and chroma artifacts the previous generation couldn&#8217;t see, and it does so at lower compute cost.<\/p>\n<p>The trap is treating the average score as the whole answer. Match your model to your viewing context, upscale before you measure, watch the per-frame minimums, and remember that a metric tuned against itself stops measuring anything real.<\/p>\n<p><strong>Ready to ship video without building the encoding stack behind it?<\/strong> LiveAPI handles transcoding, adaptive bitrate renditions, HLS delivery up to 4K, and global CDN distribution through a single API, so your team can go live in days instead of months. <a href=\"https:\/\/liveapi.com\/\" target=\"_blank\">Get started with LiveAPI<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p><span class=\"rt-reading-time\" style=\"display: block;\"><span class=\"rt-label rt-prefix\">Reading Time: <\/span> <span class=\"rt-time\">13<\/span> <span class=\"rt-label rt-postfix\">minutes<\/span><\/span> VMAF is how streaming engineers answer a deceptively hard question: does this encode actually look good? Netflix open-sourced the metric in June 2016, and it now predicts human viewer ratings on a 0-100 scale with a correlation of roughly 0.90-0.95. That&#8217;s far better than the pixel-difference math the industry relied on for decades. In June [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":1244,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_yoast_wpseo_title":"What Is VMAF? Netflix's Video Quality Metric Explained %%sep%% %%sitename%%","_yoast_wpseo_metadesc":"Learn what VMAF is, how Netflix's video quality metric scores footage 0-100, what a good VMAF score is, and how to run VMAF with FFmpeg.","inline_featured_image":false,"footnotes":""},"categories":[45],"tags":[],"class_list":["post-1243","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-video-quality"],"jetpack_featured_media_url":"https:\/\/liveapi.com\/blog\/wp-content\/uploads\/2026\/08\/vmaf.jpg","yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v15.6.2 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<meta name=\"description\" content=\"Learn what VMAF is, how Netflix&#039;s video quality metric scores footage 0-100, what a good VMAF score is, and how to run VMAF with FFmpeg.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/liveapi.com\/blog\/vmaf\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"What Is VMAF? Netflix&#039;s Video Quality Metric Explained - LiveAPI Blog\" \/>\n<meta property=\"og:description\" content=\"Learn what VMAF is, how Netflix&#039;s video quality metric scores footage 0-100, what a good VMAF score is, and how to run VMAF with FFmpeg.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/liveapi.com\/blog\/vmaf\/\" \/>\n<meta property=\"og:site_name\" content=\"LiveAPI Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-08-06T06:34:11+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-08-06T06:34:36+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\">\n\t<meta name=\"twitter:data1\" content=\"20 minutes\">\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebSite\",\"@id\":\"https:\/\/liveapi.com\/blog\/#website\",\"url\":\"https:\/\/liveapi.com\/blog\/\",\"name\":\"LiveAPI Blog\",\"description\":\"Live Video Streaming API Blog\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":\"https:\/\/liveapi.com\/blog\/?s={search_term_string}\",\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"en-US\"},{\"@type\":\"ImageObject\",\"@id\":\"https:\/\/liveapi.com\/blog\/vmaf\/#primaryimage\",\"inLanguage\":\"en-US\",\"url\":\"https:\/\/liveapi.com\/blog\/wp-content\/uploads\/2026\/08\/vmaf.jpg\",\"width\":1880,\"height\":1253,\"caption\":\"Photo by Wallace Chuck on Pexels\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/liveapi.com\/blog\/vmaf\/#webpage\",\"url\":\"https:\/\/liveapi.com\/blog\/vmaf\/\",\"name\":\"What Is VMAF? Netflix's Video Quality Metric Explained - LiveAPI Blog\",\"isPartOf\":{\"@id\":\"https:\/\/liveapi.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/liveapi.com\/blog\/vmaf\/#primaryimage\"},\"datePublished\":\"2026-08-06T06:34:11+00:00\",\"dateModified\":\"2026-08-06T06:34:36+00:00\",\"author\":{\"@id\":\"https:\/\/liveapi.com\/blog\/#\/schema\/person\/98f2ee8b3a0bd93351c0d9e8ce490e4a\"},\"description\":\"Learn what VMAF is, how Netflix's video quality metric scores footage 0-100, what a good VMAF score is, and how to run VMAF with FFmpeg.\",\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/liveapi.com\/blog\/vmaf\/\"]}]},{\"@type\":\"Person\",\"@id\":\"https:\/\/liveapi.com\/blog\/#\/schema\/person\/98f2ee8b3a0bd93351c0d9e8ce490e4a\",\"name\":\"govz\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\/\/liveapi.com\/blog\/#personlogo\",\"inLanguage\":\"en-US\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/ab5cbe0543c0a44dc944c720159323bd001fc39a8ba5b1f137cd22e7578e84c9?s=96&d=mm&r=g\",\"caption\":\"govz\"},\"sameAs\":[\"https:\/\/liveapi.com\/blog\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","_links":{"self":[{"href":"https:\/\/liveapi.com\/blog\/wp-json\/wp\/v2\/posts\/1243","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/liveapi.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/liveapi.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/liveapi.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/liveapi.com\/blog\/wp-json\/wp\/v2\/comments?post=1243"}],"version-history":[{"count":1,"href":"https:\/\/liveapi.com\/blog\/wp-json\/wp\/v2\/posts\/1243\/revisions"}],"predecessor-version":[{"id":1245,"href":"https:\/\/liveapi.com\/blog\/wp-json\/wp\/v2\/posts\/1243\/revisions\/1245"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/liveapi.com\/blog\/wp-json\/wp\/v2\/media\/1244"}],"wp:attachment":[{"href":"https:\/\/liveapi.com\/blog\/wp-json\/wp\/v2\/media?parent=1243"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/liveapi.com\/blog\/wp-json\/wp\/v2\/categories?post=1243"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/liveapi.com\/blog\/wp-json\/wp\/v2\/tags?post=1243"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}