You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

69 lines
1.9 KiB
Bash

### ffmpeg-x265-main10
# Transcode the videos in a given directory with x265's main10 profile, then put them in a
# subdirectory for easy replacement after manually checking results.
RESULTS_DIRECTORY_NAME="_x265_main10"
# TODO: This variable isn't referenced because I didn't figure out how to put it in the glob it
# needs to be in. Fix that.
VIDEO_EXTENSIONS="mkv,mp4,avi"
_ffmpeg_x265_main10_ffmpeg () {
original_file="$1"
results_directory="$2"
partial_file="${results_directory}/$(basename "${original_file}").part"
complete_file="${results_directory}/$(basename "${original_file}")"
mkdir -p "$results_directory"
if [ -e "$complete_file" ]; then
echo "${complete_file} already exists, skipping."
else
ffmpeg -n -i "$original_file" \
-map 0:v:0 -c:v libx265 -preset medium -profile:v main10 \
-map 0:a -c:a copy \
-map '0:s?' -c:s copy \
-f matroska \
"$partial_file" \
|| rm "$partial_file"
if [ -e "$partial_file" ]; then
mv "$partial_file" "$complete_file"
fi
fi
if [ -e "$destination" ]; then
rmdir --ignore-fail-on-non-empty "$destination"
fi
}
arg_file="$1"
if [ -z "$arg_file" ]; then
arg_file=.
fi
if [ -f "$arg_file" ]; then
destination="${arg_file:h}/${RESULTS_DIRECTORY_NAME}"
_ffmpeg_x265_main10_ffmpeg "$arg_file" "$destination"
elif [ -d "$arg_file" ]; then
destination="${arg_file}/${RESULTS_DIRECTORY_NAME}"
# List all the video files in an array for future expansions like:
# - A prompt before you commit to hours of transcoding.
# - Removing items that are already completed.
# - Interactively discarding list items
# - etc.
# TODO: Use $VIDEO_EXTENSIONS here instead of hard-coding extension names.
files=($arg_file/*.{mkv,mp4,avi}(N))
for fname in $files; do
_ffmpeg_x265_main10_ffmpeg "$fname" "$destination"
done
else
echo "ffmpeg_x265_main10: Error:${arg_file} is not a file or directory."
fi
# vim:syntax=sh filetype=sh