Take the 2-minute tour ×
Super User is a question and answer site for computer enthusiasts and power users. It's 100% free, no registration required.

I'm converting .flv movie to .gif file with ffmpeg.

ffmpeg -i input.flv -ss 00:00:00.000 -pix_fmt rgb24 -r 10 -s 320x240 -t 00:00:10.000  output.gif

It works great, but output gif file has a very low quality.

Any ideas how can I improve quality of converted gif?

Output of command:

ffmpeg -i input.flv -ss 00:00:00.000 -pix_fmt rgb24 -r 10 -s 320x240 -t 00:00:10.000  output.gif
ffmpeg version 0.8.5-6:0.8.5-0ubuntu0.12.10.1, Copyright (c) 2000-2012 the Libav developers
  built on Jan 24 2013 14:52:53 with gcc 4.7.2
This program is only provided for compatibility and will be removed in a future release. Please use avconv instead.
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'input.flv':
    major_brand     : mp42
    minor_version   : 0
    compatible_brands: isommp42
    creation_time   : 2013-02-14 04:00:07
  Duration: 00:00:18.85, start: 0.000000, bitrate: 3098 kb/s
    Stream #0.0(und): Video: h264 (High), yuv420p, 1280x720, 2905 kb/s, 25 fps, 25 tbr, 50 tbn, 50 tbc
      creation_time   : 1970-01-01 00:00:00
    Stream #0.1(und): Audio: aac, 44100 Hz, stereo, s16, 192 kb/s
      creation_time   : 2013-02-14 04:00:07
[buffer @ 0x92a8ea0] w:1280 h:720 pixfmt:yuv420p
[scale @ 0x9215100] w:1280 h:720 fmt:yuv420p -> w:320 h:240 fmt:rgb24 flags:0x4
Output #0, gif, to 'output.gif':
    major_brand     : mp42
    minor_version   : 0
    compatible_brands: isommp42
    creation_time   : 2013-02-14 04:00:07
    encoder         : Lavf53.21.1
    Stream #0.0(und): Video: rawvideo, rgb24, 320x240, q=2-31, 200 kb/s, 90k tbn, 10 tbc
      creation_time   : 1970-01-01 00:00:00
Stream mapping:
  Stream #0.0 -> #0.0
Press ctrl-c to stop encoding
frame=  101 fps= 32 q=0.0 Lsize=    8686kB time=10.10 bitrate=7045.0kbits/s dup=0 drop=149    
video:22725kB audio:0kB global headers:0kB muxing overhead -61.778676%


share|improve this question

migrated from stackoverflow.com Feb 22 '13 at 22:25

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

4 Answers 4

up vote 67 down vote accepted

ffmpeg version 2.0 improved the quality of GIF output. In case you got your version from your distribution's packages, or compiled it yourself a long time ago, consider downloading a recent static build, or compiling it yourself.

Your result would look like this, after scaling down:

ffmpeg -i input.flv -vf scale=320:-1 -t 10 -r 10 output.gif

Here, -t 10 limits the output to ten seconds. -r 10 forces a frame rate of 10 fps. I added the scale filter so you can declare a desired width and ffmpeg will deal with the height to preserve aspect.

With ffmpeg versions below 2.0, you're not going to get a great output, but you may see a slight improvement with:

ffmpeg -i input.flv -vf scale=320:-1,format=rgb8,format=rgb24 -t 10 -r 10 output.gif

Using format=rgb8,format=rgb24 is no longer necessary in newer ffmpeg.

Another command-line method would be to export the movie to frames using ffmpeg:

mkdir frames
ffmpeg -i input -vf scale=320:-1 -r 10 frames/ffout%03d.png

Then use convert from ImageMagick (or GraphicsMagick) to make your animated GIF:

convert -delay 5 -loop 0 frames/ffout*.png output.gif

convert willl provide a better looking output and provides a more obvious method to control the delay between frames.

share|improve this answer
Added some example results (just still frames though). Here, the first file is 4.1 MB, the second around 8 MB. –  slhck Feb 22 '13 at 21:44
@slhck Nice addition. I should remember how much answers dealing with video and images are improved with actual images. –  LordNeckbeard Feb 22 '13 at 21:46
@LordNeckbeard, you are awesome! much thanks for -vf scale=320:-1,format=rgb8,format=rgb24 –  Kamil Hismatullin Feb 22 '13 at 21:53
@KamilHismatullin I recommend the convert method for a much better looking output, but of course it is a bigger file size. You can display fewer frames as a tradeoff. You may want to investigate if convert works with stdin instead of creating many temporary files. –  LordNeckbeard Feb 22 '13 at 22:02
By the way, for the convert command for converting from the PNG frames I ended up using convert -delay 5 -loop 0 -dither None -colors 80 "frames/ffout*.png" -fuzz "40%" -layers OptimizeFrame "output.gif", which reduces the overall file size quite a bit –  Wilf Jul 24 '14 at 13:58

If you would prefer to avoid intermediate image files, the commands provided by LordNeckBeard can be piped between ffmpeg and ImageMagick's convert so that no intermediate files are required:

ffmpeg -i input -vf scale=320:-1 -r 10 -f image2pipe -vcodec ppm - | convert -delay 5 -loop 0 - output.gif

The -f image2pipe tells ffmpeg to split the video into images and make it suitable to be piped out, and -vcodec ppm specifies the output format to be ppm (for some reason if the format is png, either convert does not read all the images from the pipe, or ffmpeg does not output them all). The - for both commands specifies that a pipe will be used for output and input respectively.

To optimize the result without saving a file, you can pipe the output from convert to a second convert command:

ffmpeg -i input -vf scale=320:-1 -r 10 -f image2pipe -vcodec ppm - | convert -delay 5 -loop 0 - gif:- | convert -layers Optimize - output.gif

The gif:- tells convert to pipe its output as gif formatted data and -layers Optimize tells the second convert to perform optimize-frame and optimize-transparancy methods (see the ImageMagick Introduction to Animation Optimization). Note that the output from the -layers Optimize may not always provide a smaller file size, so you may want to try converting to a gif without optimization first to be sure.

Remember that during this whole process everything is in memory so you may need sufficient memory if the images are quite large.

share|improve this answer

I usually do this in photoshop, then I can visually see the effects of color depth and resolution on the quality of the end result gif. A basic tutorial is here: http://smallbusiness.chron.com/make-gifs-out-video-files-cs3-29283.html

It helps me to see the results I'm going to get vs. a command line method.

share|improve this answer
thanks for answer! hmm...but what if you have 200 video files or you want to integrate video convertation feature to your site? I think 'command line method' is the best way to solve that kinds of problems. –  Kamil Hismatullin Feb 22 '13 at 21:33

As of ffmpeg 2.6, we can do even better:


ffmpeg -v warning -i input.flv -vf "$filters,palettegen" -y $palette
ffmpeg -v warning -i input.flv -i $palette -lavfi "$filters [x]; [x][1:v] paletteuse" -y output.gif


share|improve this answer

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

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