From b61b58ce2c1371d6f904f108fa7feed3abfbe5c7 Mon Sep 17 00:00:00 2001 From: Robert Günzler Date: Wed, 8 Apr 2026 13:18:14 +0900 Subject: * MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Automated-commit-by: dots Signed-off-by: Robert Günzler --- bin/2av1 | 84 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100755 bin/2av1 (limited to 'bin/2av1') 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 -- cgit 1.4.1