I want make an animated .gif from an .mp4 video. I would prefer to do it from the command line, so please only list command line tools.

Two steps:

  • Extract Images from Video

    Create a directory called frames in the same directory with your .mp4 file. Use command:

    ffmpeg -i video.mp4  -r 5 'frames/frame-%03d.jpg'
    


    -r 5 stands for FPS value
        for better quality choose bigger number
        adjust the value with the -delay in 2nd step
        to keep the same animation speed
    
    %03d gives sequential filename number in decimal form
    

    source

  • Convert Images to gif

    cd frames
    convert -delay 20 -loop 0 *.jpg myimage.gif
    


    -delay 20 means the time between each frame is 0.2 seconds
       which match 5 fps above.
       When choosing this value
           1 = 100 fps
           2 = 50 fps
           4 = 25 fps
           5 = 20 fps
           10 = 10 fps
           20 = 5 fps
           25 = 4 fps
           50 = 2 fps
           100 = 1 fps
           in general 100/delay = fps
    
    -loop 0 means repeat forever
    

    Docs: convert gif options

You will end up with an rather big file, have a look at the image magick guide to optimize gif on options you can add to the second step command to obtain a smaller file.

  • 1
    great answer- some additional info: ffmpeg can be installed using directions here – chepyle Mar 29 '16 at 2:02
  • 2
    Keep in mind that the frames folder must exist for the first command to work. – totymedli Jun 7 '17 at 15:09
  • 2
    For those that want a quick way to optimize that generally works and are too lazy to read the link, just add -layers Optimize to the last convert command, before *.jpg. Check the output though, it might be affected. For me it reduced the gif size from 5 MB to 700 KB without any perceivable loss in quality :) – cpury Jul 10 '17 at 8:54
  • Thanks that was an interesting process, a 5.6MB mp4 ended up a 236MB gif, not sure I'll be putting that one up on my website ;) Possibly a gif needs to be limited to seconds rather than a minute. – cardamom Sep 12 '17 at 9:37
  • 1
    Instead of using the JPG file format, very lossy with the default settings, I'd recommend using PNG for the initial file export. ffmpeg -i video.mp4 -r 5 'frames/frame-%03d.png'. – Pierre F Jun 7 at 11:15

ffmpeg 3.4.4 can do it directly on Ubuntu 18.04

You likely want to use something like:

sudo apt-get install ffmpeg
wget -O opengl-rotating-triangle.mp4 https://github.com/cirosantilli/media/blob/master/opengl-rotating-triangle.mp4?raw=true
ulimit -Sv 1000000
ffmpeg \
  -i opengl-rotating-triangle.mp4 \
  -r 15 \
  -vf scale=512:-1 \
  -ss 00:00:03 -to 00:00:06 \
  opengl-rotating-triangle.gif

Test data generation procedure described on this post.

A more direct:

sudo apt-get install ffmpeg
ffmpeg -i in.mp4 out.gif

also works, but the output GIF would be way larger than the input video, because video formats compress intelligently across frames.

Argument breakdown:

Before pre 18.04: ffmpeg + convert one-liner without intermediate files

ffmpeg could not handle GIF previously. The best I had was something along:

sudo apt-get install ffmpeg imagemagick
ffmpeg -i input.mp4 -r 10 -f image2pipe -vcodec ppm - | \
  convert -delay 5 -loop 0 - output.gif

Explanation of some of the arguments:

Even if you reduce the height and framerate, the output GIF may still be larger than the video, since "real" non-GIF video formats compress across frames, while GIF only compresses individual frames.

A direct:

convert input.mp4 rpi2-bare-metal-blink.gif

worked, but almost killed my computer because of memory overflow, and produced an ouptput 100x larger for my 2s 1Mb input file. Maybe one day ImageMagick will catch up.

See also: https://superuser.com/questions/556029/how-do-i-convert-a-video-to-gif-using-ffmpeg-with-reasonable-quality

Tested on Ubuntu 17.10.

  • 1
    Downvoters please explain ;-) – Ciro Santilli 新疆改造中心 六四事件 法轮功 Oct 21 '16 at 17:49
  • 1
    Your delay does not match your -r value (the resulting gif is 2x speed). Also you added a scale argument for no apparent reason (it makes the gif really small). – asmeurer Oct 21 '16 at 17:51
  • 2
    I agree. Small size gifs are better for web. Thanks for scale=320:-1 – zombic Oct 26 '16 at 8:26
  • 2
    For those who are wondering: removing -r 10 will bring the GIF back to normal speed. – Mitch Feb 13 '17 at 8:05
  • 2
    I got a gif 20% bigger than the mp4 :O – Adam Goldman May 11 '17 at 2:39

gifify is an all-in-one node-based utility that simplifies the conversion. It depends on nodejs, npm, ffmpeg, and imagemagick which are all available in the repos.

Once you have npm installed you can install gifify globally with:

    npm install -g gifify

A video can be converted to a .GIF with:

    gifify video.mp4 -o video.gif

You can also optionally set a start and end position in the video and add a text caption:

    gifify clip.mp4 -o clip.gif --from 01:48:23.200 --to 01:48:25.300 --text 'we are the knights who say nip!'

❗️ It can take several minutes for the conversion to complete even with smaller videos.

NOTE: ffmpeg and imagemagick might need to be compiled with some specific libraries (i.e. libass and fontconfig accordingly).

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.