summary refs log tree commit diff
path: root/bin/2av1
diff options
context:
space:
mode:
Diffstat (limited to 'bin/2av1')
-rwxr-xr-xbin/2av184
1 files changed, 84 insertions, 0 deletions
diff --git a/bin/2av1 b/bin/2av1
new file mode 100755
index 0000000..19ace0b
--- /dev/null
+++ b/bin/2av1
@@ -0,0 +1,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