helm/bin/mov2gif

73 lines
1.7 KiB
Plaintext
Raw Permalink Normal View History

#!/usr/bin/env cached-nix-shell
2019-08-06 10:56:54 -07:00
#! nix-shell -i bash -p ffmpeg gifsicle
2016-05-31 21:26:43 -07:00
2017-05-10 01:25:11 -07:00
# Uses ffmpeg to convert a video file to a gif file. Optimizes the final result
# with gifsicle.
#
2020-02-08 20:26:11 -08:00
# Requires: ffmpeg gifsicle
2017-05-10 01:25:11 -07:00
#
# Example:
# mov2gif some-vid.mp4 output.gif
# mov2gif -f 10 -s 00:00:10 -t 00:00:05 some-vid.mp4 output.gif
2017-05-10 01:25:11 -07:00
set -e
PALETTE="/tmp/palette.png"
usage() {
cat <<EOL
Usage: ${0##*/} [-fsSth] SOURCE_FILE [destfile]
2017-05-10 01:25:11 -07:00
-f [FPS] set frames per second
-s [hh:mm:ss] set starting time (like -ss in ffmpeg)
-S [W:H] set width/height (either can be -1 for auto)
2017-05-10 01:25:11 -07:00
-t [hh:mm:ss] set the duration to capture (like -t in ffmpeg)
-h this help
EOL
}
2016-05-31 21:26:43 -07:00
2017-05-10 01:25:11 -07:00
cleanup() { rm -f "$PALETTE"; }
trap cleanup EXIT
#
fps=30
while getopts hf:s:t:S: opt; do
case $opt in
f) fps="$OPTARG" ;;
s) start="-ss $OPTARG" ;;
S) scale=",scale=$OPTARG:flags=lanczos" ;;
t) duration="-t $OPTARG" ;;
h) usage
exit
;;
:) >&2 echo "$OPTARG requires an argument"
usage
exit 1
;;
*) >&2 echo "Not a valid arg: $opt"
usage
exit 1
;;
esac
done
2017-05-10 01:25:11 -07:00
shift $((OPTIND-1))
#
if (($# == 0)); then
>&2 echo "No movie file specified"
exit
2017-05-10 01:25:11 -07:00
elif [[ ! -f $1 ]]; then
>&2 echo "$1 does not exist"
exit
2017-05-10 01:25:11 -07:00
fi
2017-05-10 01:25:11 -07:00
src="$1"
dest="${2:-${src%.*}.gif}"
flags="fps=${fps}$scale"
2016-05-31 21:26:43 -07:00
2017-05-10 01:25:11 -07:00
# stats_mode=full favors motion, causing the resulting palette to better
# accomodate fades and transitions.
ffmpeg -v warning $start $duration -i "file:$src" -vf "$flags,palettegen=stats_mode=full" -y "$PALETTE"
ffmpeg -v warning $start $duration -i "file:$src" -i "$PALETTE" -lavfi "$flags [x]; [x][1:v] paletteuse" -y "$dest"
2016-05-31 21:26:43 -07:00
2019-08-06 10:56:54 -07:00
gifsicle -O3 "$dest" -o "$dest"