Skip to content

Instantly share code, notes, and snippets.

@woky
Created June 19, 2022 20:26
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 woky/292fa58a9961cc297180dfcef2dca941 to your computer and use it in GitHub Desktop.
Save woky/292fa58a9961cc297180dfcef2dca941 to your computer and use it in GitHub Desktop.
#!/bin/bash
# Doba trvání jednoho videa (slidu, v sekundách)
DURATION=20
# Rozlišení ([WIDTH]x[HEIGHT] px)
WIDTH=1920
HEIGHT=1200
# Konec konfigurace, začátek programu
set -eu -o pipefail
shopt -s nullglob nocasematch extglob
if (( $# != 1 )); then
echo "Použití: ./$0 <adresář>" >&2
exit 1
fi
source_dir=${1%%/}
output_dir=$source_dir-VIDEOS
create_slide_video()
{
local input_file=$1 output_file=$2
if [[ -e $output_file ]]; then
return
fi
local loop_args=( -stream_loop -1 )
if [[ $input_file == *.jp?(e)g ]]; then
loop_args=( -loop 1 )
fi
echo " Vytvářím video slide '$output_file' ze souboru '$input_file'"
ffmpeg -y -loglevel error \
${loop_args[@]} \
-i "$input_file" \
-t $DURATION \
-vf "scale=w=$WIDTH:h=$HEIGHT:force_original_aspect_ratio=1,pad=$WIDTH:$HEIGHT:(ow-iw)/2:(oh-ih)/2" \
-video_track_timescale 60000 \
-f mp4 \
"$output_file.tmp"
mv "$output_file.tmp" "$output_file"
}
create_presentation_video()
{
local images_dir=$1
local title slides_dir
local input_file slide_video full_video
local count=0
title=$(basename "$images_dir")
slides_dir="$output_dir/slides/$title"
output_file="$output_dir/$title.mp4"
if [[ -e $output_file ]]; then
return
fi
echo "Prezentace '$title'"
mkdir -p "$slides_dir"
for input_file in "$images_dir"/*; do
if [[ $input_file == *.pdf ]]; then
local temp_dir=$(mktemp -td pechakucha.XXXXXXXX)
echo " Rozděluji PDF '$input_file' na obrázky do adresáře '$temp_dir'"
gs -q -dSAFER -r600 -sDEVICE=pngalpha -o "$temp_dir/page-%03d.jpg" "$input_file"
for input_file in "$temp_dir"/*; do
: $((count++))
slide_video="$slides_dir/$(printf '%02d' $count).mp4"
create_slide_video "$input_file" "$slide_video"
done
rm -r -- "$temp_dir"
else
: $((count++))
slide_video="$slides_dir/$(printf '%02d' $count).mp4"
create_slide_video "$input_file" "$slide_video"
fi
done
if (( ! count )); then
echo ' Žádné vstupní obrázky?'
return
fi
echo " Vytvářím video prezentaci '$output_file' z video slidů"
find $slides_dir -name '*.mp4' | sort -n | sed "s/^/file file:/" |\
ffmpeg -y -loglevel error -f concat -safe 0 -protocol_whitelist file,pipe -i - -c copy -f mp4 "$output_file.tmp"
mv "$output_file.tmp" "$output_file"
}
if [[ ! -d $source_dir ]]; then
echo "Adresář neexistuje: $source_dir" >&2
exit 1
fi
mkdir -p "$output_dir/slides"
for images_dir in "$source_dir"/*; do
if [[ -d $images_dir ]]; then
create_presentation_video "$images_dir"
fi
done
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment