Programster's Blog

Tutorials focusing on Linux, programming, and open-source

FFmpeg - Create GIF Animated Images

Below is my really simple script for creating GIFs quickly and easily from longer video files. If you want to put in a lot of effort to get them nicer looking there is this post at engineering.giphy.com.

Steps

#!/bin/bash

# Specify the relative or rull path to the video you wish to convert to an animated webp.
INPUT_VIDEO="MyVideoFile.mkv"

# Specify the name for the generated animated image. This may also be a full filepath like
# /path/to/myfile.gif
OUTPUT_FILENAME=myGeneratedFile.gif

# Specify the name for a temporary file to put within /tmp. This must have the same file
# extension as the original video.
TEMP_FILENAME="temp.mkv"

# Specify the start time of the video that the clip should be taken e.g. 1 minute and 10 seconds in
START_TIME="00:08:35"

# Specify the length of time for the clip. E.g. 10 seconds
LENGTH_TIME="00:00:05"

# Set width of the output gif. The height will be derived from the w:h ratio.
WIDTH=500

# Set the number of times to loop.
# 0 = infinite
# 1+ = that many times.
# -1 = no loop
LOOP=0

# Extract the short video we wish to turn into a gif
ffmpeg \
  -i $INPUT_VIDEO \
  -ss $START_TIME \
  -t $LENGTH_TIME \
  -vcodec copy \
  -acodec copy \
  /tmp/$TEMP_FILENAME

# Set framerate of animated image.
FRAMERATE=20

ffmpeg \
  -i /tmp/$TEMP_FILENAME \
  -loop $LOOP \
  -vf "fps=$FRAMERATE, scale=$WIDTH:-1:flags=lanczos,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" \
  $OUTPUT_FILENAME

The flags part in the last ffmpeg command make a big difference to improving the quality of the gif through the creation and use of a custom palette to the clip. In the extraction ffmpeg command, if one puts the -ss before the -i parameter, it is much quicker, but the time will not be as accurate as Ffmpeg skips to the closest I frame in the video which may be seconds away from where you wish to start/end.

References

Last updated: 23rd July 2022
First published: 28th February 2021

This blog is created by Stuart Page

I'm a freelance web developer and technology consultant based in Surrey, UK, with over 10 years experience in web development, DevOps, Linux Administration, and IT solutions.

Need support with your infrastructure or web services?

Get in touch