43

I created OGV videos with the gtk-recordmydesktop screencasting program, trying to tackle this problem here with bruteforce over X. I can view the videos with VLC.

Now, the task is to find some ways to convert OGV videos into GIF animations so I can display them on SE. How can I do that?

4 Answers 4

41

take a look at this: https://askubuntu.com/questions/107726/how-to-create-animated-gif-images-of-a-screencast/107735#107735

..... After the Desktop Recorder has saved the recording into an OGV video, MPlayer will be used to capture JPEG screenshots, saving them into the 'output' directory.

On a terminal:

mplayer -ao null <video file name> -vo jpeg:outdir=output

Use ImageMagick to convert the screenshots into an animated gifs.

convert output/* output.gif

you can optimize the screenshots this way:

convert output.gif -fuzz 10% -layers Optimize optimised.gif
5
  • 1
    For a large number of images, I had to add -limit map 1 to convert (got a "Killed" otherwise).
    – Ax3l
    Sep 8, 2014 at 15:12
  • With a 30 second ogv video, the convert command took all my cpu and was going for over 10 minutes before i stopped it. adding -limit map 1 to the command did not fix it. Oct 21, 2015 at 21:19
  • 2
    Try this for converting ffmpeg -i output/00000%03d.jpg output.gif unix.stackexchange.com/questions/24014/…
    – Gelldur
    Jul 13, 2016 at 16:07
  • It bears mention that direct convert output/* -fuzz 10% -layers Optimize optimised.gif is possible as well, and noticeably faster than the two-command path. Also, mplayer readily creates png screenshots as well, which may be preferred for captures of websites or GUIs.
    – Raphael
    Oct 4, 2017 at 10:09
  • How do you keep the framerate the same with this approach?
    – James Ward
    Apr 29, 2020 at 18:39
23

Simple script with good quality

Script:

inputFile=$1

FPS=15
WIDTH=320

#Generate palette for better quality
ffmpeg -i $inputFile -vf fps=$FPS,scale=$WIDTH:-1:flags=lanczos,palettegen tmp_palette.png

#Generate gif using palette
ffmpeg -i $inputFile -i tmp_palette.png -loop 0 -filter_complex "fps=$FPS,scale=$WIDTH:-1:flags=lanczos[x];[x][1:v]paletteuse" output.gif

rm tmp_palette.png

Code from: https://superuser.com/a/556031/295664

Without palette: (231 KB)

enter image description here

With palette:(573 KB)

enter image description here

1
  • Yea very skeptical about the stated file sizes, just used your exact settings here and the file size went from 988.7k to 42.8M Jan 24, 2020 at 16:02
6

This one-liner is working for me:

ffmpeg -i video.ogv video.gif
2
  • 2
    Is this essentially different from the existing answers that use ffmpeg? How?
    – ilkkachu
    Dec 8, 2017 at 15:12
  • 1
    @ilkkachu I was looking for a very quick, simple and easy-to-remember solution. The other answers are much more complicated and not so easy to understand at first glance (probably resulting in higher quality results, though).
    – luator
    Dec 8, 2017 at 22:53
2
ifile=~/test.ogv

echo '# Determine input WxH and FPS' 
eval "$(ffmpeg -i "$ifile" 2>&1 |sed -nr 's/.*Stream.*Video.* ([0-9]+x[0-9]+),.*[^[0-9.]([0-9.]+).*tbr,.*/WxH=\1;FPS=\2/p')"

echo '# Output multiple images from the input video'
ffmpeg -i "$ifile" -r $FPS -s $WxH -f image2 -vframes 100 -y ~/test-%03d.jpg 2>/dev/null

echo '# use ImageMagic "convert" to generate the animated .gif' 
convert -delay 20 ~/test-[0-9][0-9][0-9].jpg  ~/test.gif 

echo '# remove temp image files'    
rm -f  ~/test-[0-9][0-9][0-9].jpg

echo 'Done!'
1
  • 1
    Suggest converting to PNG, not JPEG, larger but reduces re-compression artifacts.
    – ideasman42
    Mar 30, 2014 at 6:50

You must log in to answer this question.