Skip to content

Instantly share code, notes, and snippets.

@yhatt
Created December 23, 2017 07:17
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save yhatt/47fc9d3631f6d45979326a4d6eaf4ede to your computer and use it in GitHub Desktop.
Save yhatt/47fc9d3631f6d45979326a4d6eaf4ede to your computer and use it in GitHub Desktop.
mkgif
#!/bin/sh
usage() {
echo "Usage: ${0##*/} [-o output] [-r framerate] [-f ffmpeg-filter] [-s width:height] input" 1>&2
echo ""
echo "Examples:"
echo " ${0##*/} foo.mp4 : Output GIF to foo.gif"
echo " ${0##*/} -o bar.gif foo.mp4 : Output GIF to bar.gif"
echo " ${0##*/} -r 10 foo.mp4 : Set framerate as 10"
echo " ${0##*/} -s 320:-1 foo.mp4 : Resize width to 320px with fixed aspect-ratio"
echo " ${0##*/} -f trim=0:1 foo.mp4 : Trim frames from 0 sec to 1 sec"
exit 1
}
FRAMERATE=""
FILTER=""
SCALE="iw:ih"
while getopts o:r:f:s: OPT
do
case $OPT in
"o" ) OUTPUT=$OPTARG;;
"r" ) FRAMERATE=$OPTARG;;
"f" ) FILTER=$OPTARG;;
"s" ) SCALE=$OPTARG;;
"h" ) usage;;
esac
done
shift $((OPTIND - 1))
test "$FRAMERATE" != "" && _FILTER="fps=$FRAMERATE,$FILTER" && FILTER="${_FILTER%,}"
test "$SCALE" != "" && _FILTER="$FILTER,scale=$SCALE:flags=lanczos" && FILTER="${_FILTER#,}"
test "$OUTPUT" = "" && OUTPUT="${1%.*}.gif"
test "${OUTPUT%.*}" = "" && usage
TMPOUT="$(mktemp -u).gif"
TMPPALETTE="$(mktemp -u).png"
PALETTE_FILTER="${FILTER},palettegen"
test "$FILTER" = "" && LAVFI_INPUT="[0]" || LAVFI_INPUT="$FILTER [x]; [x]"
ffmpeg -i "$1" -vf "${PALETTE_FILTER#,}" $TMPPALETTE
ffmpeg -i "$1" -i $TMPPALETTE -lavfi "$LAVFI_INPUT[1:v] paletteuse" -y $TMPOUT
if which gifsicle > /dev/null; then
gifsicle -O2 $TMPOUT > $OUTPUT
rm $TMPOUT
else
mv "$TMPOUT" "$OUTPUT"
fi
rm $TMPPALETTE
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment