I'm using ffmpeg to take a mjpeg feed from an IP camera and convert it into a series of still jpeg images. Here's the command I'm using:

ffmpeg -i http://xxx:xxx@xx.xx.xx.xx/vid.mjpg -f image2 -vcodec mjpeg %05d.jpg

Does anyone know a way to specify the level of jpg compression when using ffmpeg to create stills?

migrated from stackoverflow.com Aug 4 '11 at 4:31

This question came from our site for professional and enthusiast programmers.

up vote 32 down vote accepted

Here's what ended up doing the trick for me:

ffmpeg -i http://xx.xx/mjpg/video.mjpg -q:v 1 %05d.jpg

The -q:v 1 was the ticket. It sets the quality of the video encoder, where the -q means quality and the :v means video. Values range from 1 to 31, where lower means better.

  • 2
    I don't know if this was available years ago but if you want the source JPEG images unmodified from MJPEG, the answer is here: ffmpeg.org/ffmpeg-bitstream-filters.html#mjpeg2jpeg ---- In short: -c:v copy -bsf:v mjpeg2jpeg instead of q:v 1. – juanitogan Dec 24 '16 at 11:51
  • Does anyone know what default value it uses? – Jay R. Wren Oct 10 '17 at 16:35

$ ffmpeg -r 1/4 -i %03d.jpg -b 5000 -vcodec mjpeg -qscale 1 5000.avi

OR

$ ffmpeg -r 1/4 -i %03d.jpg -vcodec copy -qscale 1 copy.avi

Reference:

r       delay between next jpg, results 4 second
b       bitrate
vcodec  use jpeg encode
qscale  quality ratio
  • does qscale "compete" with the bitrate specifier, I wonder? – rogerdpack Jan 19 '13 at 17:45
  • 1
    Isn't this opposite of what is being asked? This looks like jpeg to mjpeg. mjpeg to jpeg is the ask. – juanitogan Dec 22 '16 at 23:35

You could try to export into PPM and use some other tool to convert into JPEG.

I looked into ffmpeg/libavcodec/mjpeg.c. I believe the quality is set to a fixed value.

Also you seem to convert a MJPEG video into JPEG still frames. I think in this case the code in ffmpeg/libavcodec/mjpeg2jpeg_bsf.c runs and the data isn't recoded. So the image quality wouldn't improve anyway.

This is the quantization table definition, I didn't see any reference to *val_?c where the values were scaled before use.

/* Set up the standard Huffman tables (cf. JPEG standard section K.3) */
/* IMPORTANT: these are only valid for 8-bit data precision! */
const uint8_t ff_mjpeg_bits_dc_luminance[17] =
{ /* 0-base */ 0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 };
const uint8_t ff_mjpeg_val_dc[12] =
{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };

const uint8_t ff_mjpeg_bits_dc_chrominance[17] =
{ /* 0-base */ 0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 };

const uint8_t ff_mjpeg_bits_ac_luminance[17] =
{ /* 0-base */ 0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 0x7d };
const uint8_t ff_mjpeg_val_ac_luminance[] =
{ 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12,
  • I'm not familiar with PPM, what is that? – weotch Aug 3 '11 at 22:28
  • Also, the images look better when I access the camera from the browser compared to the jpgs I'm creating. That's why I was thinking some compression was occurring. – weotch Aug 3 '11 at 22:31
  • PPM is simplest color image format one can imagine. Its just a header like "P6 640 480 255\n" and then the raw data. I just looked. Maybe it actually can't output this format. The only other option then would be -vc rawvideo. Did you try -quality? – whoplisp Aug 3 '11 at 22:41
  • 1
    -vcodec ppm is needed to export ppm – OrangeDog Jan 10 '12 at 14:08

Your Answer

By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

Not the answer you're looking for? Browse other questions tagged or ask your own question.