blob: 19ace0b6b2d3af5c45e77d688ba12ebe9010da18 (
plain) (
blame)
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
|
#!/bin/bash
set -eu
[ -n "${DEBUG:-}" ] && set -x
[ -z "${DEBUG:-}" ] && export SVT_LOG=1
BITRATE=${BITRATE:-128000}
EXT=${EXT:-webm}
case "${VCODEC:-av1}" in
vp9) vcodec_args=(-c:v libvpx-vp9 -crf "${CRF:-31}" -b:v 0) ;;
av1) vcodec_args=(-c:v libsvtav1 -crf "${CRF:-30}" -svtav1-params "tune=0:fast-decode=1") ;;
esac
for f in "$@"; do
f=$(readlink -e "$f")
op=${OUTDIR:-${f%/*}}
on=${f##*/}
on=${on%.*}.${EXT}
o="${op}/${on}"
[ "$f" = "$o" ] && o="${op}/${on%.*}.new.${EXT}"
hr
printf '🏷️ %s\n' "$on"
# duration
duration=$(ffprobe -v error -of csv=p=0 -show_entries format=duration -sexagesimal "$f")
# bitrate
br=$(ffprobe -v error -of default=noprint_wrappers=1:nokey=1 \
-select_streams a \
-show_entries stream=bit_rate \
"${f}")
[ -z "$br" ] && br=$BITRATE
[ $br = "N/A" ] && br=$((BITRATE + 1))
[ $br -gt $BITRATE ] && br="$BITRATE"
printf '🧾 duration=%s bitrate=%d\n' \
"$duration" \
"$br"
startt=$(date +%s)
# transcode
ffmpeg -hide_banner -loglevel warning -stats \
-i "$f" \
${OPTS:-} \
-c:a libopus \
-b:a "$br" \
${vcodec_args[@]} \
-map 0 \
-map_metadata 0 \
"${o}"
set +x
# # progress
# total_frames=$(ffprobe -v error -select_streams v:0 -show_entries stream=nb_frames -of csv=p=0 -i "${1:?}")
# while [ -e "/proc/$ffmpeg_pid" ]; do
# sleep 2
# [ -e "$vstats_file" ] || continue
# current_frames=$(tail -1 "$vstats_file" | grep -o 'frame=[ 0-9]*' | sed 's,frame=[ ]*,,')
# [ -z "$current_frames" ] && continue
# current_percent=$((100 * current_frames / total_frames))
# printf '==> %d/%d %d%% ]]\n\n' "$current_frames" "$total_frames" "$current_percent"
# done
# duration
endt=$(date +%s)
printf '🏁 took='
date -u -d@"$((endt - startt))" +%H:%M:%S
# results
du -h "$f" "$o"
in_size=$(stat -c '%s' "$f")
out_size=$(stat -c '%s' "$o")
awk -v fs="$in_size" -v os="$out_size" \
'BEGIN{p=((100/fs) * (fs-os)); printf("♻️ %.2f%% reduction\n", p);}'
if [ $in_size -gt $out_size ]; then
trash-put -v "${f}"
else
trash-put -v "${o}"
fi || true
done
|