Last active
July 6, 2023 07:17
-
-
Save Xiphe/23444fbc76dadd8c20018777061f2c06 to your computer and use it in GitHub Desktop.
Scripts for automating my video-cutting stuff
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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 | |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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