Rewrite bin/mov2gif
This commit is contained in:
parent
c82d8f3434
commit
51f1670e8e
78
bin/mov2gif
78
bin/mov2gif
|
@ -1,7 +1,55 @@
|
||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
usage() { echo "Usage: $0 [-f <fps>] [-o <output-dest>] [-h]"; }
|
# Uses ffmpeg to convert a video file to a gif file. Optimizes the final result
|
||||||
|
# with gifsicle.
|
||||||
|
#
|
||||||
|
# Requires: ffmpeg
|
||||||
|
# Optional: gifsicle
|
||||||
|
#
|
||||||
|
# Example:
|
||||||
|
# vid2gif some-vid.mp4 output.gif
|
||||||
|
# vid2gif -f 10 -s 00:00:10 -t 00:00:05 some-vid.mp4 output.gif
|
||||||
|
|
||||||
|
set -e
|
||||||
|
PALETTE="/tmp/palette.png"
|
||||||
|
|
||||||
|
usage() {
|
||||||
|
cat <<EOL
|
||||||
|
Usage: $0 [-fsth] [videofile] [destfile]
|
||||||
|
|
||||||
|
-f [FPS] set frames per second
|
||||||
|
-s [hh:mm:ss] set starting time (like -ss in ffmpeg)
|
||||||
|
-t [hh:mm:ss] set the duration to capture (like -t in ffmpeg)
|
||||||
|
-h this help
|
||||||
|
EOL
|
||||||
|
}
|
||||||
|
|
||||||
|
cleanup() { rm -f "$PALETTE"; }
|
||||||
|
trap cleanup EXIT
|
||||||
|
|
||||||
|
#
|
||||||
|
fps=30
|
||||||
|
while getopts hf:s:t: opt; do
|
||||||
|
case $opt in
|
||||||
|
f) fps="$OPTARG" ;;
|
||||||
|
s) start="-ss $OPTARG" ;;
|
||||||
|
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
|
||||||
|
shift $((OPTIND-1))
|
||||||
|
|
||||||
|
#
|
||||||
if (($# == 0)); then
|
if (($# == 0)); then
|
||||||
>&2 echo "No movie file specified"
|
>&2 echo "No movie file specified"
|
||||||
exit
|
exit
|
||||||
|
@ -10,27 +58,15 @@ elif [[ ! -f $1 ]]; then
|
||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
|
|
||||||
fps=30
|
|
||||||
src="$1"
|
src="$1"
|
||||||
dest="${${src##*/}%.mov}.gif"
|
dest="${2:-${${src##*/}%.mov}.gif}"
|
||||||
while getopts hf:o: opt; do
|
|
||||||
case $opt in
|
|
||||||
-f) fps="$OPTARG" ;;
|
|
||||||
-o) dest="$OPTARG" ;;
|
|
||||||
-h) usage
|
|
||||||
exit
|
|
||||||
;;
|
|
||||||
:) >&2 echo "$OPTARG requires an argument"
|
|
||||||
usage
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
|
|
||||||
palette="$(mktemp)"
|
|
||||||
flags="fps=${fps}"
|
flags="fps=${fps}"
|
||||||
|
|
||||||
ffmpeg -v warning -i "$src" -vf "$flags,palettegen" -y "$palette"
|
# stats_mode=full favors motion, causing the resulting palette to better
|
||||||
ffmpeg -v warning -i "$src" -i "$palette" -lavfi "$flags [x]; [x][1:v] paletteuse" -y "$dest"
|
# accomodate fades and transitions.
|
||||||
|
ffmpeg -v warning $start $duration -i "$src" -vf "$flags,palettegen=stats_mode=full" -y "$PALETTE"
|
||||||
|
ffmpeg -v warning $start $duration -i "$src" -i "$PALETTE" -lavfi "$flags [x]; [x][1:v] paletteuse" -y "$dest"
|
||||||
|
|
||||||
[[ -f $palette ]] && rm -f "$palette"
|
if command -v gifsicle >/dev/null; then
|
||||||
|
gifsicle -O3 "$dest" -o "$dest"
|
||||||
|
fi
|
||||||
|
|
Loading…
Reference in a new issue