diff --git a/to_opus(1).sh b/to_opus(1).sh new file mode 100644 index 0000000..489746e --- /dev/null +++ b/to_opus(1).sh @@ -0,0 +1,75 @@ +#!/bin/bash + +# set shopt-options used by this shell-script +# Note, 0 (true) from shopt -q is "false" in a math context. +shopt -q globstar; globstar_set=$? +((globstar_set)) && shopt -s globstar +shopt -q extglob; extglob_set=$? +((extglob_set)) && shopt -s extglob + +# return default shopt-options +function finish { + ((globstar_set)) && shopt -u globstar + ((extglob_set)) && shopt -u extglob +} +trap finish EXIT + +print_usage() { + printf "Usage: ..." +} + +extension='' + +while getopts 'e:' flag; do + case "${flag}" in + e) extension+=("$OPTARG");; + *) print_usage + exit 1 ;; + esac +done + +# write array into string +extension="${extension[*]}" +# remove leading space +extension="${extension##+([[:space:]])}" +# change separator +echo "$extension" +extension=${extension// /|} + +for file in **/*.@($extension); do + + #set a channel-dependent bitrate for every audio stream + command=$( + ffprobe "$file" -v 0 -show_entries stream=channels,bit_rate -select_streams a -of compact=p=0:nk=1:s="\ " | + awk -v file="$file" -v file_output="${file%.*}.opus" ' + BEGIN{ + ORS=" "; + print "ffmpeg -i \""file"\" -map 0:a -c:a libopus" + } + { # https://wiki.xiph.org/Opus_Recommended_Settings + if($1==1) print $2>=64000 ? "-b:a:"NR-1" 64k" : "-b:a:"NR-1" "$2 + else if($1==2) print $2>=128000 ? "-b:a:"NR-1" 128k" : "-b:a:"NR-1" "$2 + else if($1<=6) print $2>=256000 ? "-b:a:"NR-1" 256k" : "-b:a:"NR-1" "$2 + else print $2>=450000 ? "-b:a:"NR-1" 450k" : "-b:a:"NR-1" "$2 + } + END{ + print "\""file_output"\" -v info -hide_banner" + }') + + + is_video=$(ffprobe -i Hair.m4v -v fatal -select_streams V -show_entries stream=codec_type) + if [[ -n "$is_video" ]]; then + echo "$file is a video file and will not be converted" + + #an Example for converting the audiostreams in a container while copying subtitles and videostreams. + #ffmpeg -i Hair.m4v -map 0:a -map 0:s -map 0:v -c:a libopus -c:v copy -c:s copy Hair.mkv -hide_banner -v info + + #for extracting the audiostreams of a video file just use "eval "$command"". + #it is recommended to check the result before deleting the original file. + else + eval "$command" #&& rm "$file" + fi + +done + +exit 0