I'm trying to extract key frames from a video clip. I tried the following command, but it extracts all frames.
ffmpeg -vf select="eq(pict_type\,PICT_TYPE_I)" -i 2.flv -vsync 2 -s 73x41 -r 30 -f image2 thumbnails-%%02d.jpeg
You can make this simpler using -skip_frame
without the need for select
video filter:
ffmpeg -skip_frame nokey -i 2.flv -vsync 0 -r 30 -f image2 thumbnails-%02d.jpeg
-threads 1
, compared to the default -threads auto
it makes a cropdetect
filter graph (ffmpeg -threads 1 -skip_frame nokey -i input.mkv -filter:v select='not(mod(n\,20))',cropdetect -an -f null /dev/null
) 2x as fast on my system (60s down to 30s)!
Feb 9, 2019 at 3:36
-vsync 0
is important for this task. I didn't know what it did and I ended up with a lot of duplicate jpegs because the output matched the framerate of the input, and you need the -vsync 0
option to avoid that
Nov 10, 2021 at 8:38
-r 30
mean? Should it be equal to video framerate? If I set 30 and it was in fact 60, will I lose 50% of frames? Can't it autodetect?
Example using the select
and scale
filters:
ffmpeg -i 2.flv -vf "select=eq(pict_type\,I),scale=73x41" \
-vsync vfr -qscale:v 2 thumbnails-%02d.jpeg
A few tips:
Filters should not come before the -i
option, as they're an output option. I don't know where exactly you got the command from, but PICT_TYPE_I
does not exist – it should be I
.
In the scale
filter you can replace 73
or 41
to have the filter automatically calculate the width or height to preserve aspect ratio: such as scale=73:-1
or scale=-1:41
. This prevents stretching or squishing that can result from "forced" scaling.
Output quality can be controlled with -qscale:v
(or the alias -q:v
). Effective range is a linear scale of 2 to 31 and a lower value is a higher quality.
That your ffmpeg
allows a filter before the input tells me it could be outdated. Download a recent static build for your operating system, or build it yourself according to the compilation guides if the above does not work.
ffmpeg -i 2.flv -vf "select=eq(pict_type\,I)" -vsync vfr frame-%02d.png
If this errors:
Option vf (set video filters) cannot be applied to input url 1508.mp4 -- you are trying to apply an input option to an output file or vice versa. Move this option before the file it belongs to. Error parsing options for input file 1508.mp4. Error opening input files: Invalid argument
you can do this:
ffmpeg -i 263.mp4 -vf select=eq(pict_type\,PICT_TYPE_I) -vsync 2 -s 480x320 -r 24 -f image2 thumbnails-%05d.jpeg
“-i” Parameters in advance