nluug-video-intro-generator/generate.sh

121 lines
3.8 KiB
Bash
Executable file

#!/bin/bash
# Configuration
SOURCEDIR=$(pwd)
PROJECT=$1
BASETEMPLATE="nluug-title-template.svg"
SOURCEFILE="event.svg"
VIDEODIR="${SOURCEDIR}/output"
PROJDIR="/tmp/nluug-intro-${PROJECT}"
CONV="convert -background black -fill black -alpha off"
FRAMENUM=0
# Validate input
validate_input() {
if [ -z "${PROJECT}" ]; then
echo "Usage: $0 <project>"
exit 1
fi
if [ -z "$EVENTNAME" ]; then
echo "Specify EVENTNAME env-var"
exit 2
fi
if [ -z "$SPEAKERNAME" ]; then
echo "Specify SPEAKERNAME env-var"
exit 3
fi
if [ -z "$TITLE1" ] || [ -z "$TITLE2" ] || [ -z "$TITLE3" ]; then
echo "Specify TITLE1/TITLE2/TITLE3 env-vars"
exit 4
fi
}
# Setup project directory
setup_project_dir() {
mkdir -p "${PROJDIR}" || { echo "Failed to create project directory"; exit 1; }
cd "${PROJDIR}" || { echo "Failed to change to project directory"; exit 1; }
}
# Generate frames
generate_frames() {
echo "Generate fade-in-from-black sequence"
for i in $(seq 100 -3 0); do
echo "Generate frame ${FRAMENUM}"
${CONV} -colorize ${i}% frameclear.svg "frame-${FRAMENUM}.webp"
((FRAMENUM++))
done
echo "Add speakername sequence"
SLEN=${#SPEAKERNAME}
for i in $(seq 0 ${SLEN}); do
echo "Generate frame ${FRAMENUM}"
SN="${SPEAKERNAME:0:i}"
awk -v sn="$SN" '{gsub(/TITLE[123]/, ""); gsub(/SPEAKERSPEAKERSPEAKERSPEAKER/, sn); print}' ${SOURCEFILE} > "${PROJDIR}/frame-${FRAMENUM}.svg"
${CONV} "frame-${FRAMENUM}.svg" "frame-${FRAMENUM}.webp"
((FRAMENUM++))
done
echo "Add title sequence"
for i in $(seq 0 40); do
echo "Generate frame ${FRAMENUM}"
T1="${TITLE1:0:i}"
T2="${TITLE2:0:i}"
T3="${TITLE3:0:i}"
awk -v t1="$T1" -v t2="$T2" -v t3="$T3" -v sn="$SN" '{gsub(/TITLE1/, t1); gsub(/TITLE2/, t2); gsub(/TITLE3/, t3); gsub(/SPEAKERSPEAKERSPEAKERSPEAKER/, sn); print}' ${SOURCEFILE} > "${PROJDIR}/frame-${FRAMENUM}.svg"
${CONV} "frame-${FRAMENUM}.svg" "frame-${FRAMENUM}.webp"
((FRAMENUM++))
done
echo "Generate completed title"
awk -v t1="$TITLE1" -v t2="$TITLE2" -v t3="$TITLE3" -v sn="$SPEAKERNAME" '{gsub(/TITLE1/, t1); gsub(/TITLE2/, t2); gsub(/TITLE3/, t3); gsub(/SPEAKERSPEAKERSPEAKERSPEAKER/, sn); print}' ${SOURCEFILE} > "${PROJDIR}/frame-${FRAMENUM}.svg"
${CONV} "frame-${FRAMENUM}.svg" "frame-${FRAMENUM}.webp"
LASTFRAME=$FRAMENUM
((FRAMENUM++))
for i in $(seq 0 1 100); do
echo "Duplicating frame ${FRAMENUM}"
cp "frame-${LASTFRAME}.webp" "frame-${FRAMENUM}.webp"
((FRAMENUM++))
done
echo "Generate fade-out-sequence"
for i in $(seq 0 3 100); do
echo "Generate frame ${FRAMENUM}"
${CONV} -colorize ${i}% "frame-${LASTFRAME}.svg" "frame-${FRAMENUM}.webp"
((FRAMENUM++))
done
}
# Render video
render_video() {
echo "Rendering to video"
ffmpeg -f lavfi -i anullsrc=channel_layout=stereo:sample_rate=44100 -framerate 25 -i frame-%d.webp -c:a aac -c:v libx264 -shortest -profile:v baseline -pix_fmt yuv420p -colorspace:v 'bt709' -color_primaries:v 'bt709' -color_trc:v 'bt709' -color_range:v 'tv' -r 30 "${VIDEODIR}/${PROJECT}-x264.mkv"
}
# Cleanup temporary files
cleanup() {
echo "Cleaning up temporary files"
rm -rf "${PROJDIR}"
}
# Main execution
main() {
validate_input
setup_project_dir
# Customize template to this event from base template
awk -v eventname="$EVENTNAME" '{gsub(/EVENTNAMEEVENTNAME/, eventname); print}' "${SOURCEDIR}/${BASETEMPLATE}" > ${SOURCEFILE}
# Create initial image without title/speaker info
awk '{gsub(/SPEAKERSPEAKERSPEAKERSPEAKER/, ""); gsub(/TITLE[123]/, ""); print}' ${SOURCEFILE} > frameclear.svg
generate_frames
render_video
cleanup
}
main