#!/usr/bin/env cached-nix-shell #! nix-shell -i bash -p ffmpeg gifsicle # Uses ffmpeg to convert a video file to a gif file. Optimizes the final result # with gifsicle. # # Requires: ffmpeg gifsicle # # Example: # mov2gif some-vid.mp4 output.gif # mov2gif -f 10 -s 00:00:10 -t 00:00:05 some-vid.mp4 output.gif set -e PALETTE="/tmp/palette.png" usage() { cat <&2 echo "$OPTARG requires an argument" usage exit 1 ;; *) >&2 echo "Not a valid arg: $opt" usage exit 1 ;; esac done shift $((OPTIND-1)) # if (($# == 0)); then >&2 echo "No movie file specified" exit elif [[ ! -f $1 ]]; then >&2 echo "$1 does not exist" exit fi src="$1" dest="${2:-${src%.*}.gif}" flags="fps=${fps}$scale" # 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" gifsicle -O3 "$dest" -o "$dest"