Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I extract a good quality JPEG image from a video file with ffmpeg?

Currently I am using this command to extract the images:

ffmpeg -i input.mp4 output_%03d.jpeg

But how can I improve the JPEG image quality?

like image 691
Daniel Gartmann Avatar asked Apr 19 '12 09:04

Daniel Gartmann


People also ask

How do I use FFmpeg without losing quality?

Instead of -sameq (removed by FFMpeg), use -qscale 0 : the file size will increase but it will preserve the quality.

How do I extract an image from a video using FFmpeg?

Extracting Images at a Given Time The -ss argument tells FFmpeg to seek x seconds into the input file. We can use the same argument to tell FFmpeg to seek x seconds into the input video and starts extracting images from that specific point.

Does FFmpeg work with images?

FFmpeg uses string matching to identify and line up the input images — and so it is important that the input images are sequentially numbered. FFmpeg provides support for approximately three different patterns.


2 Answers

Use -qscale:v to control quality

Use -qscale:v (or the alias -q:v) as an output option.

  • Normal range for JPEG is 2-31 with 31 being the worst quality.
  • The scale is linear with double the qscale being roughly half the bitrate.
  • Recommend trying values of 2-5.
  • You can use a value of 1 but you must add the -qmin 1 output option (because the default is -qmin 2).

To output a series of images:

ffmpeg -i input.mp4 -qscale:v 2 output_%03d.jpg

See the image muxer documentation for more options involving image outputs.

To output a single image at ~60 seconds duration:

ffmpeg -ss 60 -i input.mp4 -qscale:v 4 -frames:v 1 output.jpg

To continuously overwrite/update/save to a single image

Use -update 1 image muxer option. Example for once per second from a live streaming input:

ffmpeg -i rtmp://input.foo -q:v 4 -r 1 -update 1 output.jpg

Also see

  • FFmpeg FAQ: How do I encode movie to single pictures?
  • FFmpeg Wiki: Create a thumbnail image every X seconds of the video
like image 179
llogan Avatar answered Oct 09 '22 02:10

llogan


Output the images in a lossless format such as PNG:

mkdir stills
ffmpeg -i my-film.mp4 -vsync 0 -f image2 stills/my-film-%06d.png

Then use another program (where you can more precisely specify quality, subsampling and DCT method – e.g. GIMP) to convert the PNGs you want to JPEG.

It is possible to obtain slightly sharper images in JPEG format this way than is possible with -qmin 1 -q:v 1 and outputting as JPEG directly from ffmpeg.

If you want to extract only the key frames (which are likely to be of higher quality post-edit) you can use something like this:

ffmpeg -skip_frame nokey -i my-film.mp4 -vsync 0 -f image2 stills/my-film-%06d.png

The -vsync 0 parameter avoids needing to specify the frame rate with -r and means all frames in the input file are treated as, um, a frame.

like image 36
Jake Avatar answered Oct 09 '22 02:10

Jake