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-recordmydesktopto record the video. This is a quite user friendly desktop application.
- Convert the video to JPEG files. You’ll need
mplayerto convert the video to JPEG image files.
- Convert the JPEG files into an animated GIF. You’ll need
imagemagickto 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
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
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.