How to extract 1 screenshot for a video with ffmpeg at a given time?

VideoFfmpeg

Video 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 the ffmpeg 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.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionPeter BengtssonView Question on Stackoverflow
Solution 1 - VideolloganView Answer on Stackoverflow
Solution 2 - VideoSirDariusView Answer on Stackoverflow