How to do video scaling using FFmpeg with examples for different types of upscaling and downscaling methods.
Scaling a video means to make it either larger (higher resolution) or smaller (smaller resolution).
The basis of scaling a video with FFmpeg uses the scale flag after the filtergraph (-vf
), then you can either do basic video scaling such as upscaling the video to twice the original resolution:
ffmpeg -i input.mp4 -vf scale=iw*2:ih*2 output.mp4
Or an advanced scale with flags and encoding:
ffmpeg -i input.mp4 -vf scale=2560x1440:flags=lanczos -c:v libx264 -preset slow -crf 20 output_compress_1440p.mp4
There is no flag or parameter to do either upscaling or downscaling rather this is determined by the values set for the scale flag.
Scaling by resolution
If you know the desired resolution, simply setting the specific width and height for scaling with the scale flag:
ffmpeg -i input.mp4 -vf scale=3840:2560 output4k.mp4
This will upscale input.mp4 to be 4k resolution.
Scaling by ratio
To scale the video file by “times its self” such as twice as large or twice as small you can use variables *
or /
along with iw
and ih
to specify the input width and input height respectively.
To double a videos resolution:
ffmpeg -i input.mp4 -vf scale=iw*2:ih*2 output.mp4
Make a video half its original size:
ffmpeg -i input.mp4 -vf scale=iw/2:ih/2 output.mp4
Scaling by resolution with the ratio
If you want to scale a video to a custom width but keep the ratio you can input -1
after the width:
ffmpeg -i input.mp4 -vf scale=1280:-1 output.mp4
This sets the width of the video as 1280 and then will automatically calculate the height keeping with the ratio of the input video. So if it was a video of 16:9 ratio then output.mp4 will be 1280×720.
Scaling video with an encode
Scale a video and also encode or compress it at the same time:
ffmpeg -i input.mp4 -vf scale=3840:2560 -c:v libx264 -preset fast -crf 22 output.mp4
You can read more about the encoding options here and here.
Scaling with a video scaling algorithm
The most complex of them all, specifying what video scaling algorithm to use when scaling.
This is a very complex methodology, more than a few sentences can fully explain. However, this link here from user slhck gives a good run down for image/video algorithms.
The default is bicubic, with lanczos being very popular.
The image above edited from matplotlib.org compares the scaling algorithm methods.
You can apply a certain algorithm with flags=
ffmpeg -i input.mp4 -vf scale=2560:1440:flags=lanczos output.mp4
The above command will scale the video to 2560×1440 with lanczos.