Created
June 19, 2022 20:26
-
-
Save woky/292fa58a9961cc297180dfcef2dca941 to your computer and use it in GitHub Desktop.
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/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