Skip to content

Instantly share code, notes, and snippets.

@Xiphe
Last active July 6, 2023 07:17
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Xiphe/23444fbc76dadd8c20018777061f2c06 to your computer and use it in GitHub Desktop.
Save Xiphe/23444fbc76dadd8c20018777061f2c06 to your computer and use it in GitHub Desktop.
Scripts for automating my video-cutting stuff
#!/bin/zsh
zmodload zsh/datetime
# INPUTS
INPUT_FILE=$1
START_TIME=$2
if [ -n "$3" ]; then
CUT_END=$3
else
CUT_END="00:00:00"
fi
# OPTIONS
MAIN_FADE_OUT_AUDIO_DURATION=10
MAIN_BLACK_LENGTH=7
MAIN_FADE_OUT_DURATION=8
LOGO_FADE_OUT_START=10
LOGO_FADE_OUT_DURATION=1
# TIME FUNCTIONS
function time_to_seconds {
local TIME=$1
local IFS=":"
read -r hour min sec <<< "$TIME"
echo $(($hour*3600 + $min*60 + $sec))
}
function seconds_to_time {
local SECONDS=$1
printf "%02d:%02d:%02d\n" $((SECONDS/3600)) $((SECONDS%3600/60)) $((SECONDS%60))
}
# SHIFTING STUFF AROUND
EXT=${INPUT_FILE##*.}
BASE_NAME=${INPUT_FILE%.*}
TMP_START="$(mktemp -t tempfile).$EXT"
TMP_START_OVERLAYED="$(mktemp -t tempfile).$EXT"
TMP_REST="$(mktemp -t tempfile).$EXT"
TMP_CONCAT_FILE="$(mktemp -t tempfile).txt"
OUTPUT="${BASE_NAME}.cttc.${EXT}"
START_TIME_SECONDS=$(time_to_seconds $START_TIME)
# get the length of the video
ORIGINAL_LENGTH_SECONDS=$(ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 $INPUT_FILE)
echo "ORIGINAL_LENGTH: $(seconds_to_time $ORIGINAL_LENGTH_SECONDS)"
CUT_END_SECONDS=$(time_to_seconds $CUT_END)
TMP_LENGTH=$(( $ORIGINAL_LENGTH_SECONDS - $START_TIME_SECONDS - $CUT_END_SECONDS ))
LENGTH=$(seconds_to_time $TMP_LENGTH)
LENGTH_SECONDS=$(time_to_seconds $LENGTH)
echo "CUTTED_LENGTH: $LENGTH"
LOGO_FADE_OUT_TOTAL_DURATION=$(($LOGO_FADE_OUT_START + $LOGO_FADE_OUT_DURATION))
START_TIME_AFTER_FADE=$(($START_TIME_SECONDS + $LOGO_FADE_OUT_TOTAL_DURATION))
MAIN_FADE_OUT_START_ABSOLUTE=$(($LENGTH_SECONDS - $MAIN_FADE_OUT_DURATION - $MAIN_BLACK_LENGTH))
MAIN_FADE_OUT_AUDIO_START_ABSOLUTE=$(($LENGTH_SECONDS - $MAIN_FADE_OUT_AUDIO_DURATION ))
LOGO_FADE_OUT_TOTAL_DURATION_HMS=$(seconds_to_time $LOGO_FADE_OUT_TOTAL_DURATION)
START_TIME_AFTER_FADE_HMS=$(seconds_to_time $START_TIME_AFTER_FADE)
echo "MAIN_FADE_OUT_START: $(seconds_to_time $MAIN_FADE_OUT_START_ABSOLUTE)"
echo "MAIN_FADE_OUT_AUDIO_START: $(seconds_to_time $MAIN_FADE_OUT_AUDIO_START_ABSOLUTE)"
# Get the video and audio codec
VENCODE=$(ffprobe -v error -select_streams v:0 -show_entries stream=codec_name -of default=noprint_wrappers=1:nokey=1 $INPUT_FILE)
AENCODE=$(ffprobe -v error -select_streams a:0 -show_entries stream=codec_name -of default=noprint_wrappers=1:nokey=1 $INPUT_FILE)
# Cut, add logo, fade out logo, fade out video, fade out audio
ffmpeg \
-ss $START_TIME \
-t $LENGTH \
-i $INPUT_FILE \
-loop 1 \
-t $LOGO_FADE_OUT_TOTAL_DURATION \
-i cover_overlay.png \
-filter_complex "\
[0:v][1:v]scale2ref[main][overlay];\
[overlay]fade=out:st=${LOGO_FADE_OUT_START}:d=${LOGO_FADE_OUT_DURATION}:alpha=1[faded];\
[main]fade=out:st=${MAIN_FADE_OUT_START_ABSOLUTE}:d=${MAIN_FADE_OUT_DURATION}[mainfaded];\
[mainfaded][faded]overlay=enable='between(t,0,${LOGO_FADE_OUT_TOTAL_DURATION})'[outv];\
[0:a]afade=t=out:st=${MAIN_FADE_OUT_AUDIO_START_ABSOLUTE}:d=${MAIN_FADE_OUT_AUDIO_DURATION}[outa]\
"\
-map "[outv]" \
-map "[outa]" \
-c:v $VENCODE \
-crf 23 \
-c:a $AENCODE \
$OUTPUT
#!/bin/zsh
##
# usage ./cut_overlay_fadeout.zsh [inputFile] [start-time (HH:MM:SS)] [shorten-by (HH:MM:SS)]
#
# this approach fully re-encodes the video
##
zmodload zsh/datetime
# INPUTS
INPUT_FILE=$1
START_TIME=$2
if [ -n "$3" ]; then
CUT_END=$3
else
CUT_END="00:00:00"
fi
# OPTIONS
MAIN_FADE_OUT_AUDIO_DURATION=10
MAIN_BLACK_LENGTH=7
MAIN_FADE_OUT_DURATION=8
LOGO_FADE_OUT_START=10
LOGO_FADE_OUT_DURATION=1
# SHIFTING STUFF AROUND
EXT=${INPUT_FILE##*.}
BASE_NAME=${INPUT_FILE%.*}
TMP_START="$(mktemp -t tempfile).$EXT"
TMP_START_OVERLAYED="$(mktemp -t tempfile).$EXT"
TMP_REST="$(mktemp -t tempfile).$EXT"
TMP_CONCAT_FILE="$(mktemp -t tempfile).txt"
OUTPUT="${BASE_NAME}.cttc.${EXT}"
# get the length of the video
ORIGINAL_LENGTH_SECONDS=$(ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 $INPUT_FILE)
CUT_END_SECONDS=$(( $(strftime -r '%H:%M:%S' $CUT_END) - $(strftime -r '%H:%M:%S' 0:0:0) ))
ORIGINAL_LENGTH_END_CUTTED_SECONDS=$(( $ORIGINAL_LENGTH_SECONDS - $CUT_END_SECONDS ))
LENGTH=$(printf "%02d:%02d:%02d" $(($ORIGINAL_LENGTH_END_CUTTED_SECONDS/3600)) $(($ORIGINAL_LENGTH_END_CUTTED_SECONDS%3600/60)) $(($ORIGINAL_LENGTH_END_CUTTED_SECONDS%60)))
LENGTH_SECONDS=$(( $(strftime -r '%H:%M:%S' $LENGTH) - $(strftime -r '%H:%M:%S' 0:0:0) ))
echo $LENGTH_SECONDS
echo $LENGTH
LOGO_FADE_OUT_TOTAL_DURATION=$(($LOGO_FADE_OUT_START + $LOGO_FADE_OUT_DURATION))
START_TIME_SECONDS=$(( $(strftime -r '%H:%M:%S' $START_TIME) - $(strftime -r '%H:%M:%S' 0:0:0) ))
START_TIME_AFTER_FADE=$(($START_TIME_SECONDS + $LOGO_FADE_OUT_TOTAL_DURATION))
MAIN_FADE_OUT_START_ABSOLUTE=$(($LENGTH_SECONDS - $MAIN_FADE_OUT_DURATION - $MAIN_BLACK_LENGTH))
MAIN_FADE_OUT_AUDIO_START_ABSOLUTE=$(($LENGTH_SECONDS - $MAIN_FADE_OUT_AUDIO_DURATION ))
LOGO_FADE_OUT_TOTAL_DURATION_HMS=$(printf "%02d:%02d:%02d" $(($LOGO_FADE_OUT_TOTAL_DURATION/3600)) $(($LOGO_FADE_OUT_TOTAL_DURATION%3600/60)) $(($LOGO_FADE_OUT_TOTAL_DURATION%60)))
START_TIME_AFTER_FADE_HMS=$(printf "%02d:%02d:%02d" $(($START_TIME_AFTER_FADE/3600)) $(($START_TIME_AFTER_FADE%3600/60)) $(($START_TIME_AFTER_FADE%60)))
# Get the video and audio codec
VENCODE=$(ffprobe -v error -select_streams v:0 -show_entries stream=codec_name -of default=noprint_wrappers=1:nokey=1 $INPUT_FILE)
AENCODE=$(ffprobe -v error -select_streams a:0 -show_entries stream=codec_name -of default=noprint_wrappers=1:nokey=1 $INPUT_FILE)
# Add the overlay to the beginning of the video
ffmpeg \
-ss $START_TIME \
-t $LENGTH \
-i $INPUT_FILE \
-loop 1 \
-t $LOGO_FADE_OUT_TOTAL_DURATION \
-i cover_overlay.png \
-filter_complex "\
[0:v][1:v]scale2ref[main][overlay];\
[overlay]fade=out:st=${LOGO_FADE_OUT_START}:d=${LOGO_FADE_OUT_DURATION}:alpha=1[faded];\
[main]fade=out:st=${MAIN_FADE_OUT_START_ABSOLUTE}:d=${MAIN_FADE_OUT_DURATION}[mainfaded];\
[mainfaded][faded]overlay[outv];\
[0:a]afade=t=out:st=${MAIN_FADE_OUT_AUDIO_START_ABSOLUTE}:d=${MAIN_FADE_OUT_AUDIO_DURATION}[outa]\
"\
-map "[outv]" \
-map "[outa]" \
-c:v $VENCODE \
-crf 23 \
-c:a $AENCODE \
$OUTPUT
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment