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 law 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 DEPRECATED ***
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':
  Metadata:
    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
    Metadata:
      creation_time   : 1970-01-01 00:00:00
    Stream #0.1(und): Audio: aac, 44100 Hz, stereo, s16, 192 kb/s
    Metadata:
      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':
  Metadata:
    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
    Metadata:
      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%

Thanks.

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 41 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
1  
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
1  
@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
1  
@LordNeckbeard, you are awesome! much thanks for -vf scale=320:-1,format=rgb8,format=rgb24 –  Kamil Hismatullin Feb 22 '13 at 21:53
3  
@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
    
@LordNeckbeard - the convert option worked brilliantly - also using an ancient version of ffmpeg directly got a file size of 300Mb with rubbish output, whilst the high quality one from convert was 13Mb... –  Wilf Jul 5 at 23:00

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

There are many ways available for you to convert a video into a gif besides using ffmpeg. Websites like Imgflip or other professional video to GIF converters walk you through the easy steps. It's suggested to crop the video or trim the video size so that you can achieve the best effect.

share|improve this answer

Your Answer

 
discard

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.