Skip to content

Instantly share code, notes, and snippets.

@SlexAxton
Last active April 25, 2023 03:57
Show Gist options
  • Save SlexAxton/4989674 to your computer and use it in GitHub Desktop.
Save SlexAxton/4989674 to your computer and use it in GitHub Desktop.
My gif workflow
gifify() {
if [[ -n "$1" ]]; then
if [[ $2 == '--good' ]]; then
ffmpeg -i $1 -r 10 -vcodec png out-static-%05d.png
time convert -verbose +dither -layers Optimize -resize 600x600\> out-static*.png GIF:- | gifsicle --colors 128 --delay=5 --loop --optimize=3 --multifile - > $1.gif
rm out-static*.png
else
ffmpeg -i $1 -s 600x400 -pix_fmt rgb24 -r 10 -f gif - | gifsicle --optimize=3 --delay=3 > $1.gif
fi
else
echo "proper usage: gifify <input_movie.mov>. You DO need to include extension."
fi
}
brew install ffmpeg
brew tap phinze/homebrew-cask
brew install brew-cask
brew cask install x-quartz
open /usr/local/Cellar/x-quartz/2.7.4/XQuartz.pkg
# click through the stuff
brew install gifsicle
brew install imagemagick
# I had a weird problem with Convert/imagemagick where I had to do:
ln -s /usr/local/Cellar/libtool/2.4.2/lib/libltdl.7.dylib libltdl.7.dylib
# But hopefully you don't have to
# Take screencast using Quicktime. Export as high quality as possible.
gifify screencap.mov
gifify screencap.mov --good
@commadelimited
Copy link

Does it matter what you used to record the original video file? What did you use to record cli.mov?

@SlexAxton
Copy link
Author

I use QuickTime (free) or Screeny (pretty).

Just save in native quality for best results.

@paulirish
Copy link

feature request: palindromic looping (back n forth)!

also the --good setting is incredible. same quality as what i got with GifBrewery but 20% of the size. dayum.

@tednaleid
Copy link

Looks like the location of x-quartz has moved to /usr/local/Caskroom/x-quartz/2.7.4, so line 5 in install.sh should be:

open /usr/local/Caskroom/x-quartz/2.7.4/XQuartz.pkg

@ryanseddon
Copy link

I kept getting this error:

Incompatible library version: convert requires version 11.0.0 or later, but libltdl.7.dylib provides version 10.0.0

I fixed it with this command brew link libtool --force

@curtisblackwell
Copy link

does this require zsh?

edit: nope. just threw the .zshrc code into my .bashrc and it works fine.

@digia
Copy link

digia commented May 21, 2013

Brew Cask put the package for XQuartz into /opt/homebrew-cask/Caskroom/x-quartz/2.7.4

If that helps anyone.

@joemccann
Copy link

Quality is pretty amazing.

@robertd
Copy link

robertd commented Oct 1, 2013

Sweet

@connor
Copy link

connor commented Oct 1, 2013

😍

@damncabbage
Copy link

Regarding "screencap.mov.gif", try:

+ GIF="${1%.*}.gif"
  if [[ $2 == '--good' ]]; then
    ffmpeg -i $1 -r 10 -vcodec png out-static-%05d.png
-   time convert -verbose +dither -layers Optimize -resize 600x600\> out-static*.png  GIF:- | gifsicle --colors 128 --delay=5 --loop --optimize=3 --multifile - > $1.gif
+   time convert -verbose +dither -layers Optimize -resize 600x600\> out-static*.png  GIF:- | gifsicle --colors 128 --delay=5 --loop --optimize=3 --multifile - > $GIF
    rm out-static*.png
  else
-   ffmpeg -i $1 -s 600x400 -pix_fmt rgb24 -r 10 -f gif - | gifsicle --optimize=3 --delay=3 > $1.gif
+   ffmpeg -i $1 -s 600x400 -pix_fmt rgb24 -r 10 -f gif - | gifsicle --optimize=3 --delay=3 > $GIF
  fi

If you're wondering what the GIF line is about:

$ FOO="Yep.nope.mov"
$ echo "${FOO%.*}.gif"
Yep.nope.gif

@buritica
Copy link

buritica commented Dec 2, 2013

use brew cask install xquartz if you get Error: No available cask for x-quartz

@tonycoco
Copy link

Not sure if anyone cares about the output, but I like to make my bash functions quiet and less verbose... Here is my stab at it. The output of the command is much prettier. I also added the ability to scale it to a max width (via an argument to the gifify command)...

function gifify {
  if [ -z "$1" ]; then
    echo "$(tput setaf 1)No input file given. Example: gifify example.mov [max width (pixels)]$(tput sgr 0)"
    return 1
  fi

  output_file="${1%.*}.gif"

  echo "$(tput setaf 2)Creating $output_file...$(tput sgr 0)"

  if [ ! -z "$2" ]; then
    maxsize="-vf scale=$2:-1"
  else
    maxsize=""
  fi

  ffmpeg -loglevel panic -i $1 $maxsize -r 10 -vcodec png gifify-tmp-%05d.png
  convert +dither -layers Optimize gifify-tmp-*.png GIF:- | gifsicle --no-warnings --colors 256 --delay=10 --loop --optimize=3 --multifile - > $output_file
  rm gifify-tmp-*.png

  echo "$(tput setaf 2)Done.$(tput sgr 0)"
}

@saimonmoore
Copy link

Hmm....I'm getting the following:

convert: unable to load module `/usr/local/Cellar/imagemagick/6.8.9-1/lib/ImageMagick//modules-Q16/coders/png.la': file not found @ error/module.c/OpenModule/1282.
convert: no decode delegate for this image format `PNG' @ error/constitute.c/ReadImage/501.
convert: no images defined `GIF:-' @ error/convert.c/ConvertImageCommand/3187.

I checked and that file exists. I've reinstalled imagemagick and libpng umpteen times now. Not sure what else to try

@thatryan
Copy link

Few issues getting stuff installed, Xquartz seems to have changed names and versions, but now getting an error gifify:7: command not found: ffmpeg any thoughts? :(

@robcolburn
Copy link

@thatryan It sounds like ffmpeg didn't install right.

  • Try running the command ffmpeg, if that seems to fail, try installing again brew install ffmpeg.
  • If brew seems to be unhappy about that, try brew doctor

@paulirish
Copy link

afaik the install.sh can now just be

brew install ffmpeg gifsicle imagemagick

i don't believe xquartz is at all neccessary. (not sure why it was.)

@samarpanda
Copy link

Worked pretty good for me.

brew install ffmpeg gifsicle imagemagick

Thanks @paulirish & @SlexAxton

@nwinkler
Copy link

Wow, I like @tonycoco's solution. Well done!

@nwinkler
Copy link

I've added the gifify function to my bash-it fork: nwinkler/bash-it@e4bdad6

@vvo
Copy link

vvo commented Nov 24, 2014

There's now an installable binary for that, lots of options, optimized! https://github.com/vvo/gifify

@jeanmichelcote
Copy link

I get error on that command: brew install brew-cask

Error: Failed to download resource "brew-cask"
Failure while executing: git clone --depth 1 --branch v0.53.3 https://github.com/caskroom/homebrew-cask.git /Library/Caches/Homebrew/brew-cask--git

@thatryan
Copy link

Anyone come across this error?

Incompatible pixel format 'rgb24' for codec 'gif', auto-selecting format 'rgb8'

@CharlesSmart
Copy link

If this helps anyone, my XQuartz location ended up being:
open /opt/homebrew-cask/Caskroom/xquartz/2.7.7/XQuartz.pkg
I assume that's due to the update to 2.7.7?

@zentrope
Copy link

thatryan: Yes, I have that error (Yosemite). No idea what to do about it.

@nexdrew
Copy link

nexdrew commented Jun 18, 2015

For those looking to install @vvo's gifify with prerequisites:

# install pornel/giflossy (fork of gifsicle)
wget https://github.com/pornel/giflossy/releases/download/lossy%2F1.82.1/gifsicle-1.82.1-lossy.zip
unzip gifsicle-1.82.1-lossy.zip -d gifsicle-1.82.1-lossy
cp gifsicle-1.82.1-lossy/mac/gifsicle /usr/local/bin/
# install ffmpeg
brew install ffmpeg --with-fontconfig --with-libass
# install imagemagick
brew install imagemagick --with-fontconfig
# install gifify
npm install -g gifify

Thanks @vvo, @pornel, @paulirish, @SlexAxton, and internets.

@neuropass
Copy link

Please forgive my ignorance on the matter. I really want to use this as it seems the only method for high quality gifs.
I understand this is for MAC users only? I do have a mac pro. How can I use this script?
Thanks so much again!

@vvo
Copy link

vvo commented Feb 6, 2016

@nexdrew could you please add this to the gifify repo as a PR? very valuable

@mhulse
Copy link

mhulse commented Mar 27, 2016

@nexdrew could you please add this to the gifify repo as a PR? very valuable

@vvo and @nexdrew, here's a PR that does it in a curl one-liner: vvo/gifify#46. Feedback?

@mhulse
Copy link

mhulse commented Mar 27, 2016

For anyone else interested, installing gifify locally works pretty well too.

$ npm install --save-dev gifify

… in your package.json:

"scripts": {
  "gifify": "gifify"
}

And can be run from command line like so:

$ npm run gifify -- -o test.gif test.mp4

… or js script within package.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment