Last week I wanted to do a small screen recording on my Ubuntu desktop and save it as an animated gif. I tried ScreenToGif but that didn’t work in Ubuntu, it threw an exception when I pressed the record button. I found a good solution in this askubuntu question and I’m building on top of it to make it as easy as right clicking on a video file.
Overview and software required
There are three basic steps in this process:
- Make a video recording of the screen. You’ll need
gtk-recordmydesktop
to record the video. This is a quite user friendly desktop application. - Convert the video to JPEG files. You’ll need
mplayer
to convert the video to JPEG image files. - Convert the JPEG files into an animated GIF. You’ll need
imagemagick
to convert the JPEG images into a single animated GIF.
To install these tools, run:
sudo apt-get install imagemagick mplayer gtk-recordmydesktop
Record the video
No command line kung-fu is required for this one, which is something I can’t say
for the next steps. Just start the RecordMyDesktop app (installed earlier with
gtk-recordmydesktop
) and record the video. It stores it in the ogv
format.
Convert to JPEGs
In this part, we use mplayer
to convert the video to JPEG images.
From a command line:
mplayer -ao null <video file name> -vo jpeg:outdir=output
This command will convert the video into a series of JPEG image files and it will store them in a folder called output.
Convert to animated GIF
Here we convert the JPEG images into a single animated GIF file. Run the following command:
convert output/* output.gif
Optimizing the GIF
If you run the above, you’ll notice that the file size of the GIF may be a bit too large to be put on a web page.
There’s two things you can do:
- Animation Optimization
- Resize the source JPEG images in advance
Animation Optimization
ImageMagick has some built-in capabilities that go a long way optimizing the final file size of the GIF file. To optimize an animated GIF, try out this command:
convert output.gif -fuzz 10% -layers Optimize optimised.gif
If you want to read more about it:
Resize the source JPEG images
You can scale down the JPEG images without sacrificing too much readability. To convert a single JPEG file, you can use ImageMagick again:
convert in.jpg -resize -resize 440x330 out.jpg
Since we have a bunch of files, some bash scripting will be needed:
#!/bin/bash
# input folder
IN="$1"
# output folder
OUTPUT="$IN-resized-440w"
mkdir $OUTPUT
for i in $(find $IN -type f); do
o=$OUTPUT/$(basename "$i")
convert $i -resize 440x330 $o
done
This script takes a JPEG folder as input and creates a new folder with all images resized.
Putting it all together
I like Nautilus scripts and I think it would be great to just be able to right click on a video, “Convert to Animated GIF”, done (well it takes a while to do all the processing, but still).
The following is a rather naive version of such a script:
#!/bin/bash
# input file
VIDEO="$@"
# output file
OUTPUT="$@.gif"
# temporary folder
TMP=/tmp/convert-video-to-gif/
# temporary folder for jpegs
TMP_JPEG=$TMP/output/
TMP_UNOPTIMIZED_GIF=$TMP/unoptimized.gif
# create folder
rm -rf $TMP
mkdir $TMP
mplayer -ao null "$VIDEO" -vo jpeg:outdir=$TMP_JPEG
convert $TMP_JPEG/* $TMP_UNOPTIMIZED_GIF
convert $TMP_UNOPTIMIZED_GIF -fuzz 10% -layers Optimize $OUTPUT
zenity --info --text="Finished converting $VIDEO, result is at $OUTPUT"
Note that it uses zenity to display an info message when it’s all done.
This script will take the video my-video.ogv
and convert it into an
animated GIF named my-video.ogv.gif
. But be aware:
- it has no sanity checks
- it won’t work with filenames that contain spaces
- it doesn’t do the JPEG resizing part
Next time I’ll need an animated GIF, I might get around to writing it a bit better.