FFMPEG - Extract Images
Sometimes it's useful to extract images from videos. The most common need for this is for creating thumbnails for your video files on a website. The examples below show you various ways to extract images from videos using FFmpeg.
Setting Image Quality/Compression
For all the examples below, when outputting as a jpg file, you can specify
-q:v 1 to tell FFmpeg to take the highest quality image possible.
You can specify a value up to 31 for more compressed images, but I go with the highest quality and perform my image manipulation later with other tools.
Extract 1 Image At Specific Point
The code below will extract 1 frame from an input file at the specified time.
ffmpeg \ -ss hh:mm:ss \ -i $INPUT_FILE \ -vframes 1 \ output.jpg
-ss parameter ahead of the input, FFmpeg will seek to the closest point in the file first, and then take the screenshot.
There is a chance this may result in artifacts, but it is much faster. I have not noticed any artifacts so far.
-q:v 1 tells FFmpeg to take the highest quality image possible. You can specify a value up to 31 for more compressed images, but I go with the highest quality and perform my image manipulation later with other tools.
Extract Image Every Second
ffmpeg \ -i input.flv \ -vf fps=1 \ image_%d.png
Outputs will be
Extract Image Every X Seconds
You can extract images every time interval by using fractions. E.g the example below will output 1 image every 450 seconds
ffmpeg \ -i input.flv \ -vf fps=fps=1/450 \ image_%d.png
Extract Every I-frame (Keyframes)
Use the command below to extract the keyframes (the frames that contain all the data necessary for the image and are not interpolated).
ffmpeg \ -i input.flv \ -vf "select='eq(pict_type,PICT_TYPE_I)'" \ -vsync vfr \ image_%d.png