forked from patademahesh/dve
-
Notifications
You must be signed in to change notification settings - Fork 3
/
dve
executable file
·135 lines (118 loc) · 3.29 KB
/
dve
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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
#!/bin/bash -e
set -e
# defaults for all configuration values
ENC="ffmpeg"
CRF=24
OPTS="-map 0 -c:v av1 -pix_fmt yuv420p -cpu-used 4 -b:v 0 -crf 30 -c:a copy -strict -2 -threads 8 -tile-columns 2"
# This is to split out and copy attachment streams, like subtitles
# and fonts, so they only get copied once.
DATA_OPTS="-map 0 -c:s copy -c:t copy -c:d copy -vn -an"
SUFFIX="_new.mkv"
SERVERS=":"
LEN=300
OUTDIR=`mktemp -d -p /home/thomas/tmp`
echo "OutDir" ${OUTDIR}
VERBOSE="error"
# override defaults in a ~/.dverc file
if [ -f ~/.dverc ]; then
source ~/.dverc
fi
function on_finish() {
echo "Cleaning up temporary working files"
cd "$CWD"
rm -rf "${OUTDIR}"/
echo "Finished cleaning"
}
function usage() {
cat << EOF
usage: $0 [options] filename
This script breaks a video file up into chunks and encodes them in parallel via SSH on
multiple hosts.
OPTIONS:
-h this help message.
-l comma separated list of hosts to use to encode. (default=${SERVERS})
-t rough length of individual video chunks, in seconds. (default=${LEN})
-o encoding options. (default=${OPTS})
-s output file suffix. (default=${SUFFIX})
-q video encoding quality, shortcut to use default encoding options with
a different CRF. (default=${CRF})
-v verbose job output. (default=false)
EOF
}
# check all required helper utils
function checkpaths() {
for cmd in parallel ffmpeg; do
if ! CMD=`which $cmd`; then
echo "$cmd not found in local path."
exit 1
fi
done
}
while getopts “hl:t:o:s:q:v” OPTION; do
case $OPTION in
h)
usage
exit 1
;;
l)
SERVERS="$OPTARG"
;;
t)
LEN="$OPTARG"
;;
q)
CRF="$OPTARG"
OPTS="-map 0 -c:v libx265 -pix_fmt yuv420p10le -preset fast -x265-params crf=${CRF}:aq-mode=3 -c:a libvorbis -aq 5"
;;
o)
OPTS="$OPTARG"
;;
s)
SUFFIX="$OPTARG"
;;
v)
VERBOSE="info"
;;
?)
usage
exit
;;
esac
done
shift $((OPTIND-1))
if [ $# -lt 1 ]; then
usage
exit 1
fi
CWD=`pwd`
trap on_finish EXIT
checkpaths
if ! mkdir -p ${OUTDIR}; then
echo "Couldn't create temp chunk output dir ${OUTDIR}."
exit 1
fi
echo "Creating chunks to encode"
if [[ "$1" == *".AVI" || "$1" == *".avi" ]]; then
$ENC -fflags +genpts -i "$1" -map 0:a -map 0:v -codec copy -f segment -segment_time $LEN -segment_format matroska -v ${VERBOSE} "${OUTDIR}/chunk-%03d.orig"
else
$ENC -i "$1" -map 0:a? -map 0:v -codec copy -f segment -segment_time $LEN -segment_format matroska -v ${VERBOSE} "${OUTDIR}/chunk-%03d.orig"
fi
#echo "Copying file metadata"
#DATA_IN="-i data.enc -map 1"
#${ENC} -y -v ${VERBOSE} -i "$1" ${DATA_OPTS} -f matroska "${OUTDIR}/data.enc" ||
# DATA_IN=""
cd "$OUTDIR"
echo "Running parallel encoding jobs"
PAR_OPTS="--no-notice --gnu -j 12
--eta --retries 2 --nice 10"
PAR_OPTS="${PAR_OPTS} --return {.}.enc"
ENC_OPTS="-y -v ${VERBOSE} -i {} ${OPTS} -f matroska {.}.enc"
parallel ${PAR_OPTS} ${ENC} ${ENC_OPTS} ::: chunk-*.orig
echo "Combining chunks into final video file"
echo "ffconcat version 1.0" > concat.txt
for f in `ls chunk-*.enc | sort`; do
echo "file $f" >> concat.txt
done
BASE=`basename "$1"`
OUTFILE="${CWD}"/"${BASE%.*}${SUFFIX}"
${ENC} -y -v ${VERBOSE} -f concat -i concat.txt -map 0 -f matroska -c copy "${OUTFILE}"