This repository has no description
1#!/bin/sh
2usage() {
3 printf '%b\n' "${0##*/} -i <input_file> [OPTIONS]" \
4 "\noptions:" \
5 "\t-S TIMESTAMP - timestamp to start the gif" \
6 "\t-d SECONDS - how long the gif should be" \
7 "\t-o FILE - output file (default: out.gif)" \
8 "\t-s SCALE - border size (default: 1)"
9}
10
11while [ "$*" ]
12do
13 case $1 in
14 - ) shift; continue ;;
15 -- ) shift; break ;;
16 -* ) flag=${1#-}; shift ;;
17 * ) shift; continue ;;
18 esac
19
20 while [ "$flag" ]
21 do
22 arg=${flag%"${flag#?}"}
23
24 case $arg in
25 S ) VID2GIF_START=$1; shift ;;
26 d ) VID2GIF_DURATION=$1; shift ;;
27 h ) usage; exit 0 ;;
28 i ) VID2GIF_INPUT_FILE=$1; shift ;;
29 o ) VID2GIF_OUTPUT_FILE=$1; shift ;;
30 s ) VID2GIF_SCALE=$1; shift ;;
31 * ) printf '%s\n' "${0##*/}: -$arg: invalid argument" 1>&2
32 usage 1>&2; exit 1 ;;
33 esac
34
35 flag=${flag#?}
36 done
37done
38
39[ -z "$VID2GIF_INPUT_FILE" ] && {
40 printf '%s\n' "${0##*/}: missing input video" 1>&2
41 usage 1>&2; exit 1
42}
43
44start=
45duration=
46[ -n "$VID2GIF_START" ] && start="-ss"
47[ -n "$VID2GIF_DURATION" ] && duration="-t"
48
49: "${VID2GIF_SCALE:=1}"
50: "${VID2GIF_OUTPUT_FILE:=out.gif}"
51
52filters="scale=iw*${VID2GIF_SCALE}:-1:flags=lanczos"
53palette_file=$(mktemp --tmpdir XXX.png)
54
55ffmpeg -hide_banner -loglevel warning \
56 "$start" "$VID2GIF_START" \
57 "$duration" "$VID2GIF_DURATION" \
58 -i "$VID2GIF_INPUT_FILE" -vf "$filters,palettegen" -update true \
59 -y "$palette_file"
60ffmpeg -hide_banner -loglevel warning \
61 "$start" "$VID2GIF_START" \
62 "$duration" "$VID2GIF_DURATION" \
63 -i "$VID2GIF_INPUT_FILE" -i "$palette_file" -filter_complex "$filters,paletteuse" \
64 "$VID2GIF_OUTPUT_FILE"
65
66rm "$palette_file"