How to Calculate PSNR Using FFmpeg

This article provides a quick and practical guide on how to use the FFmpeg psnr filter to calculate the Peak Signal-to-Noise Ratio (PSNR) between two videos. You will learn the exact command-line syntax required to compare a compressed or processed video against its original reference, how to save the frame-by-frame results to a log file, and how to interpret the final output metrics.

The Basic Command Syntax

To calculate the PSNR, you must provide two input videos to FFmpeg: the processed (distorted) video and the original (reference) video. For the filter to work correctly, both videos must have the same resolution, frame rate, and pixel format.

Run the following command in your terminal:

ffmpeg -i distorted_video.mp4 -i original_video.mp4 -filter_complex psnr -f null -

Command Breakdown

  • -i distorted_video.mp4: The first input is the compressed or modified video you want to evaluate.
  • -i original_video.mp4: The second input is the high-quality source video used as the reference.
  • -filter_complex psnr: This invokes the complex filtergraph and applies the psnr comparison filter to both inputs.
  • -f null -: Since you only need the statistical calculation and do not want to export a new video file, this flag tells FFmpeg to discard the video output and only print the results to the console.

Saving PSNR Results to a Log File

If you want to analyze the PSNR values on a frame-by-frame basis, you can export the data to a text file using the stats_file option:

ffmpeg -i distorted_video.mp4 -i original_video.mp4 -filter_complex "psnr=stats_file=psnr_results.log" -f null -

This command generates a file named psnr_results.log in your working directory containing the frame number, loss metric, and PSNR values for the Y, U, and V color channels of every frame.

Understanding the Output

Once the analysis is complete, FFmpeg will display a summary line in the console that looks like this:

[Parsed_psnr_0 @ 0x55ccb67a9e00] PSNR y:41.25 u:45.67 v:46.12 average:42.34 min:35.10 max:54.89
  • y, u, v: Represents the average PSNR for the luminance (Y) and chrominance (U, V) channels.
  • average: The overall average PSNR of the entire video.
  • min / max: The lowest and highest PSNR values recorded among all processed frames.

PSNR is measured in decibels (dB). Higher values indicate a higher-quality video that is closer to the original. In lossy video compression, a PSNR value between 30 dB and 50 dB is generally considered good to excellent.