From fb36a5f11b8b80ab8d047094008098be76058cb5 Mon Sep 17 00:00:00 2001 From: Hyperling Date: Sat, 28 Mar 2026 14:17:06 -0700 Subject: [PATCH] Bring some of the video processing functions to from Termux to Shared for desktop usage! --- rc_shared.sh | 238 +++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 230 insertions(+), 8 deletions(-) diff --git a/rc_shared.sh b/rc_shared.sh index ab303bb..cf1c893 100644 --- a/rc_shared.sh +++ b/rc_shared.sh @@ -3,10 +3,12 @@ ## Variables ## -# Environment Usability +# Environment Usability # + export PATH="$PATH:~/bin-shared:~/.bin-shared" -# PS1 Colors +# PS1 Colors # + export PURPLE="`tput setaf 55`" export ORANGE="`tput setaf 208`" export GREEN="`tput setaf 34`" @@ -23,7 +25,8 @@ export BOLD="`tput bold`" ## Aliases ## -# Quickies +# Quickies # + alias reload-bash="source ~/.bashrc" alias bash-reload="reload-bash" alias shell-reload="reload-bash" @@ -37,7 +40,7 @@ alias lh='ls -ash ' ## Functions ## -# Related specifically to this project. +# Related specifically to this project. # function update-shared { log "`date` - Reloading the '~/.rc_shared' file from env-shared.\n" @@ -61,7 +64,7 @@ alias shared-update="update-shared" alias reload-shared="update-shared" alias shared-reload="update-shared" -# Shortcuts +# Shortcuts # function send-master { send_master.sh; } function goodbye { update -y; bye; } @@ -71,7 +74,7 @@ function clone { } export -f clone -# Enhance Bin Scripts +# Enhance Bin Scripts # function send-masters { echo -e "`date` - Looping through MASTER directories.\n" @@ -85,9 +88,228 @@ function send-masters { } export -f send-masters -# Audio +# Audio # -# Video +# Video # + +# Optimize the bitrate and audio levels for an edited video. +function process-video-usage { + echo "USAGE: process-video oldFile newFile [videoBitrate] [audioBitrate] [sizeRating] [numPasses] [forceBitrate]" + echo -n "Purpose: Call ffmpeg with preferred video posting settings. " + echo -n "Bitrates default to 2000k and 192k, size is 720, passes is 1, and force is N." + echo "These work well on Odysee and are fairly small as backups." + echo "Examples:" + echo "- Create a small file for quick streaming." + echo " process-video youcut.mp4 20240210.mp4 1200k 128k 480" + echo "- Create a larger file for something like YouTube." + echo " process-video youcut.mp4 20240210_1080p.mp4 5000k 256k 1080" +} +function process-video { + # Parameters + file="$1" + newfile="$2" + video="$3" + audio="$4" + size="$5" + passes="$6" + force="$7" + + # Validations + if [[ -z $file || ! -e $file ]]; then + echo "ERROR: Original file '$file' does not exist." >&2 + process-video-usage + return 1 + fi + + if [[ -z $newfile ]]; then + echo "ERROR: New file's name must be provided." >&2 + process-video-usage + return 1 + elif [[ -e $newfile ]]; then + echo "ERROR: New file '$newfile' already exists." >&2 + du -h "$newfile" + process-video-usage + return 1 + fi + + echo "`date` - Converting '$file' to '$newfile'." + + if [[ -z $video ]]; then + video="2000k" + fi + if [[ $force == "Y" ]]; then + video="-b:v $video" + else + video="-b:v $video -minrate 0 -maxrate $video -bufsize $video" + fi + + if [[ -z $audio ]]; then + audio="192k" + fi + audio="-b:a $audio" + + if [[ -z $size ]]; then + size="720" + fi + size="-filter:v scale=-1:$size" + + if [[ -z $passes ]]; then + passes=1 + fi + pass="" + if [[ $passes != 1 ]]; then + passes=2 + pass="-pass 2" + fi + + ## Main ## + # More information on two-pass processing with ffmpeg + # https://cinelerra-gg.org/download/CinelerraGG_Manual/Two_pass_Encoding_with_FFmp.html + if [[ $passes == 2 ]]; then + set -x + ffmpeg -nostdin -hide_banner -loglevel quiet \ + -i "$file" $size $video $audio \ + -filter:a "dynaudnorm=f=33:g=65:p=0.66:m=33.3" \ + -vcodec libx264 -movflags +faststart \ + -pass 1 -f mp4 /dev/null -y + status=$? + set +x + echo "`date` - Done with the first pass." + if [[ $status != 0 ]]; then + echo "Received unsuccessful status, exiting." + return 1 + fi + fi + + set -x && + ffmpeg -nostdin -hide_banner -loglevel quiet \ + -i "$file" $size $video $audio \ + -filter:a "dynaudnorm=f=33:g=65:p=0.66:m=33.3" \ + -vcodec libx264 -movflags +faststart \ + $pass "$newfile" + status="$?" + set +x + echo "`date` - Done with the final pass." + + if [[ $passes == 2 && $status == 0 ]]; then + mv -v ffmpeg2pass*.log* ~/TRASH/ + fi + + sync + sleep 10 + sync + if [[ -s $newfile ]]; then + echo "`date` - Getting file sizes." + du -h "$file" + du -h "$newfile" + else + echo "ERROR: New file not created or has a 0 size." >&2 + fi + + echo -e "\n`date` - Finished with status '$status'." + return $status +} +alias pv="process-video" +alias qpv="pv ./raw/YouCut*.mp4 `basename $(pwd)`.mp4" + +# Allow converting video to audio and other smaller +# tasks than what process-video is intended to do. +function basic-process-usage { + echo "basic-process INPUT OUTPUT NORMALIZE [EXTRA]" + echo -n "Pass a file through ffmpeg with the option" + echo "to easily normalize the audio with a Y." + echo "Examples:" + echo "- Normalize audio on a video." + echo " basic-process video.mp4 normalized.mp4 Y" + echo "- Convert a video to audio at 192k." + echo " basic-process video.mp4 audio.mp3 N '-b:a 192k'" +} +function basic-process { + # Parameters + input="$1" + output="$2" + typeset -u normalize + normalize="$3" + extra="$4" + + echo "`date` - Starting basic-process" + + # Validations + if [[ -z $input || ! -e $input ]]; then + echo "ERROR: Input file '$input' does not exist." >&2 + basic-process-usage + return 1 + fi + + if [[ -z $output ]]; then + echo "ERROR: Output file's name must be provided." >&2 + basic-process-usage + return 1 + elif [[ -e $output ]]; then + echo "ERROR: Output file '$output' already exists." >&2 + du -h "$output" + basic-process-usage + return 1 + fi + + if [[ $normalize == "Y" ]]; then + echo "Normalize set to TRUE." + normal="-filter:a dynaudnorm=f=33:g=65:p=0.66:m=33.3" + else + echo "No audio normalization is being done." + fi + + # Main + echo "`date` - Converting '$input' to '$output'." + set -x + ffmpeg -nostdin -hide_banner -loglevel quiet \ + -i "$input" $extra $normal "$output" + status=$? + set +x + + if [[ $status != 0 ]]; then + echo "`date` - WARNING: ffmpeg exited with status '$status'." >&2 + fi + + # Finish + if [[ ! -s $output ]]; then + echo "`date` - ERROR: Output '$output' not created or has 0 size." >&2 + return 1 + fi + + sync + echo "`date` - '$output' has been created successfully." + sleep 3 + du -h "$input" + du -h "$output" + + echo "`date` - Finished basic-process" + return 0 +} +alias bp="basic-process" +alias bv="bp" + +# Function to automatically append the Y. +function fix-audio { basic-process "$1" "$2" Y; } +function eq { fix-audio "$1" "$2"; } + +# Function to easily turn a video to audio without typing the audio name. +function convert-to-audio { + video="$1" + audio="$2" + if [[ -z "$2" || "$2" == "Y" ]]; then + audio="${1//mp4/mp3}" + fi + volume="" + if [[ ( "$2" == "Y" && -z "$3" ) || "$3" == "Y" ]]; then + $volume="Y" + fi + basic-process "$video" "$audio" $volume +} +alias v2a="convert-to-audio" +alias vta="v2a" +alias pull-audio="v2a" +alias pa="v2a" ## Complete! ##