#!/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