-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathframedumper
executable file
·91 lines (82 loc) · 2.22 KB
/
framedumper
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#!/usr/bin/env bash
usage() {
cat - <<EOF
Usage: $NAME -i <INPUT FILE> -o <OUTPUT FILE>
-h|--help: show this help message
-i|--input: file name for input
-f|--frames: number of frames to fetch
-d|--debug: print all commands and wait for keypress to continue
EOF
}
while [ $# -gt 0 ]; do
OPT="$1"
case "${OPT}" in
-i|--input)
shift
INPUT="${1}"
shift;;
-f|--frames)
shift
FRAMES="${1}"
shift;;
-d|--debug)
DEBUG=1
shift;;
-h|--help)
usage
exit;;
*)
echo "$0: invalid option ${1}"
echo "$0 -h for usage options"
usage
exit 1;;
esac
done
# Check for tool dependencies
SELF_FULLPATH=`realpath $0`
SELF_DIR=`dirname $SELF_FULLPATH`
# Override default tool list, we only need these two
TOOLS=(ffmpeg ffprobe mediainfo)
# Does not depend on any other scripts
SCRIPTS=NONE
if [ ! -r $SELF_DIR/toolchecker ]; then
echo "toolchecker not found."
exit 1
else
. $SELF_DIR/toolchecker
fi
if [ -z "$INPUT" ]; then
echo "Must supply input (-i/--input) file"
usage
exit 1
fi
if [ ! -s "$INPUT" ]; then
echo "Error reading input file: $INPUT"
exit 1
fi
if [ ! -z "$FRAMES" ]; then
if [ ! $FRAMES -gt 0 ]; then
echo "Invalid sample count. Using defaults."
FRAMES=50
fi
else
FRAMES=50
fi
FRAMECOUNT=`$MEDIAINFO --Output="Video;%FrameCount%" "$INPUT"`
RAWFRAMERATE=`$MEDIAINFO --Output="Video;%FrameRate%" "$INPUT"`
FRAMERATE=`printf "%.${2:-0}f" $RAWFRAMERATE`
FRAMESKIP=$(( $FRAMECOUNT / $FRAMES ))
SPF=$(( $FRAMESKIP / $FRAMERATE ))
FRAMEDIR=`basename "$INPUT" .mkv`
if [ $DEBUG ]; then
echo "Framecount: $FRAMECOUNT"
echo "Framerate: $FRAMERATE"
echo "Frameskip: $FRAMESKIP"
echo "Seconds per frame: $SPF"
echo "Framedir: $FRAMEDIR"
exit
fi
mkdir "$FRAMEDIR"
#echo "$FFMPEG -i \"$INPUT\" -vf select=\"not(mod(n\,$FRAMESKIP))\",setpts=N/TB -r 1 -vframes $FRAMES ${FRAMEDIR}/inputframes%03d.png"
#$FFMPEG -i "$INPUT" -vf select="not(mod(n\,$FRAMESKIP))",setpts=N/TB -r 1 -vframes $FRAMES "${FRAMEDIR}/inputframes%03d.png"
$FFMPEG -i "$INPUT" -vf fps=1/$SPF "${FRAMEDIR}/frame%04d.png"