a-gif-frame-sequence-optimizer-optimized-for-screen-recordings
a-gif-frame-sequence-optimizer-optimized-for-screen-recordings copied to clipboard
A GIF frame sequence optimizer optimized for screen recordings
A GIF frame sequence optimizer optimized for screen recordings
This is the companion code for my article, A GIF optimization algorithm for screen recordings — from 5 MB to 986 KB.
The optimization process
Prerequisites: Node.js, Yarn, FFmpeg, Gifsicle
-
Put GIF file at
tmp/input.gif
. -
Convert GIF to PNG frames using FFmpeg:
mkdir -p tmp/unoptimized-frames tmp/optimized-frames ffmpeg -i tmp/input.gif -y tmp/unoptimized-frames/%04d.png
-
Analyze and reduce dithering:
yarn node main.js
-
Convert PNG frames back to GIF using FFmpeg:
# Adapted from https://superuser.com/questions/556029/how-do-i-convert-a-video-to-gif-using-ffmpeg-with-reasonable-quality ffmpeg -r 8 -i tmp/optimized-frames/%04d.png -vf "split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse=dither=none:diff_mode=rectangle" -y tmp/output.gif # To limit the amount of colors in the palette. ffmpeg -r 8 -i tmp/optimized-frames/%04d.png -vf "split[s0][s1];[s0]palettegen=max_colors=48[p];[s1][p]paletteuse=dither=none:diff_mode=rectangle" -y tmp/output.gif
- Change
-r 8
to desired frame rate.
- Change
-
Perform further lossy optimization using Gifsicle:
gifsicle --lossy=200 --optimize=3 tmp/output.gif -o tmp/output.optimized.gif