How to extract 1 screenshot for a video with ffmpeg at a given time?
VideoFfmpegVideo Problem Overview
There are many tutorials and stuff showing how to extract multiple screenshots from a video using ffmpeg. You set -r and you can even start a certain amount in.
But I just want 1 screenshot at, say 01:23:45 in. Or 1 screenshot at 86% in.
This is all possible with ffmpegthumbnailer but it's another dependency I don't want to depend on. I want to be able to do it with ffmpeg.
Video Solutions
Solution 1 - Video
Use the -ss
option:
ffmpeg -ss 01:23:45 -i input -frames:v 1 -q:v 2 output.jpg
-
For JPEG output use
-q:v
to control output quality. Full range is a linear scale of 1-31 where a lower value results in a higher quality. 2-5 is a good range to try. -
The select filter provides an alternative method for more complex needs such as selecting only certain frame types, or 1 per 100, etc.
-
Placing
-ss
before the input will be faster. See FFmpeg Wiki: Seeking and this excerpt from theffmpeg
cli tool documentation:
> -ss
position (input/output)
>
> When used as an input option (before -i
), seeks in this input file to position. Note the in most formats it is not possible to seek
> exactly, so ffmpeg
will seek to the closest seek point before
> position. When transcoding and -accurate_seek
is enabled (the
> default), this extra segment between the seek point and position will
> be decoded and discarded. When doing stream copy or when
> -noaccurate_seek
is used, it will be preserved.
>
> When used as an output option (before an output filename), decodes but discards input until the timestamps reach position.
>
> position may be either in seconds or in hh:mm:ss[.xxx]
form.
Solution 2 - Video
FFMpeg can do this by seeking to the given timestamp and extracting exactly one frame as an image, see for instance:
ffmpeg -i input_file.mp4 -ss 01:23:45 -vframes 1 output.jpg
Let's explain the options:
-i input file the path to the input file
-ss 01:23:45 seek the position to the specified timestamp
-vframes 1 only handle one video frame
output.jpg output filename, should have a well-known extension
The -ss
parameter accepts a value in the form HH:MM:SS[.xxx]
or as a number in seconds. If you need a percentage, you need to compute the video duration beforehand.