diff --git a/ffmpeg.sh b/ffmpeg.sh new file mode 100644 index 0000000..ca133bd --- /dev/null +++ b/ffmpeg.sh @@ -0,0 +1,112 @@ +#!/bin/bash +UPDATED="2024-01-09" + +header () { + clear + echo "FFMpeg Encoder (HEVC/AAC) [$UPDATED]" + echo "--------------------------------------------------" +} +header + +# Grab input parameters +FLDR=$1 # working folder +SRC=$2 # input file +DST=$3 # output file +LOGFILE=encode.log # log file + +# Check if specified folder is present +if [ ! -d "$FLDR" ]; then + echo "Path [$FLDR] don't exist" + exit 1 +fi +cd $FLDR/ + +# Check if source file is present +if [ ! -f "$SRC" ]; then + echo "File [$SRC] don't exist." + exit 1 +fi + +# Define audio/video codecs +CODEC_AUDIO="libfdk_aac" +CODEC_VIDEO="hevc_nvenc" + +# Define audio/video bitrates +BITRATE_AUDIO="448k" +BITRATE_VIDEO="2600k" + +# Define input/output files +INPUT="-i ${SRC}" +OUTPUT="${DST}.mp4" + +# Define ffmpeg encoding options +DEFAULTS="-y -hide_banner -loglevel error -stats" +HWACCELL="-hwaccel_device 0 -hwaccel cuda -hwaccel_output_format cuda" +SUBTITLES="-c:s copy" +AUDIO="-c:a ${CODEC_AUDIO} -b:a ${BITRATE_AUDIO}" +VIDEO="-c:v ${CODEC_VIDEO} -b:v ${BITRATE_VIDEO}" +RENDER_AUDIO="-tune hq -vbr 5" +RENDER_VIDEO="-preset p6" + +# Print pass informations +pass() { + PASS=$1 + header + echo ">>> Pass $PASS..." + echo "--------------------------------------------------" +} + +# Abort with message on failed ffmpeg encoding +isFailed() { + PASS=$1 + ret_code=$? + if [ $ret_code != 0 ]; then + if [ -z $2 ]; then + echo "[ Pass $PASS: Failed! ]" + else + echo "[ Something was wrong! ]" + fi + exit 1 + else + echo "[ Done! ]" + fi +} + +# Do encode processing (2 passes) +encode() { + pass 1 + #ffmpeg -y \ + # -hide_banner \ + # -loglevel error -stats \ + # -hwaccel_device 0 -hwaccel cuda -hwaccel_output_format cuda \ + # -i ${INPUT} \ + # -c:v hevc_nvenc -preset medium -b:v 2600k \ + # -c:a libfdk_aac -b:a 448k \ + # -pass 1 \ + # -an -f null /dev/null + ffmpeg ${DEFAULTS} ${HWACCELL} ${INPUT} ${SUBTITLES} ${AUDIO} ${VIDEO} -pass 1 -an -f null /dev/null + isFailed 1 + + pass 2 + #ffmpeg -y \ + # -hide_banner \ + # -loglevel error -stats \ + # -hwaccel_device 0 -hwaccel cuda -hwaccel_output_format cuda \ + # -i ${INPUT} \ + # -c:s copy \ + # -c:v hevc_nvenc -b:v 2600k \ + # -preset p6 \ + # -c:a libfdk_aac -b:a 448k \ + # -tune hq -vbr 5 \ + # -movflags +faststart -profile:v main10 \ + # -pass 2 \ + # ${OUTPUT}.mp4 + ffmpeg ${DEFAULTS} ${HWACCELL} ${INPUT} ${SUBTITLES} ${AUDIO} ${RENDER_AUDIO} ${VIDEO} ${RENDER_VIDEO} -pass 2 ${OUTPUT} + isFailed 2 +} + +# Process encoding and check result code level +encode > >(tee $LOGFILE) 2>&1 +isFailed 3 + +exit 0 diff --git a/run.sh b/run.sh new file mode 100644 index 0000000..39aa2f6 --- /dev/null +++ b/run.sh @@ -0,0 +1,7 @@ +#!/bin/bash +clear +echo "[RUN] FFMpeg Encoder [2024-01-09]" + +MOVIE=input.mp4 +bash ./ffmpeg.sh ../movies ${MOVIE} ${MOVIE}.encoded.mp4 +