summary refs log tree commit diff
path: root/bin/2av1
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