27 lines
1.3 KiB
Bash
27 lines
1.3 KiB
Bash
#!/usr/bin/env bash
|
|
# tools/demo-video/build_video.sh: baut aus den Bildern (Reihenfolge nach Dateiname) das Demo-Video und eine kurze GIF-Vorschau.
|
|
# bash tools/demo-video/build_video.sh <Bilderordner> <Zielordner>
|
|
# Benötigt ffmpeg.
|
|
set -euo pipefail
|
|
FRAMES="${1:?Bilderordner fehlt}"
|
|
OUT="${2:?Zielordner fehlt}"
|
|
SEC="${SECONDS_PER_SLIDE:-3.6}"
|
|
mkdir -p "$OUT"
|
|
TMP="$OUT/.build"; rm -rf "$TMP"; mkdir -p "$TMP"
|
|
LIST="$TMP/list.txt"
|
|
: > "$LIST"
|
|
i=0
|
|
for f in $(ls "$FRAMES"/*.png | sort); do
|
|
i=$((i + 1))
|
|
clip="$TMP/clip_$(printf '%02d' $i).mp4"
|
|
ffmpeg -loglevel error -y -loop 1 -t "$SEC" -i "$f" \
|
|
-vf "scale=1440:900,format=yuv420p,fade=t=in:st=0:d=0.45,fade=t=out:st=$(awk "BEGIN{print $SEC-0.45}"):d=0.45" \
|
|
-r 25 -c:v libx264 -crf 22 -preset medium -pix_fmt yuv420p "$clip"
|
|
echo "file 'clip_$(printf "%02d" $i).mp4'" >> "$LIST"
|
|
done
|
|
ffmpeg -loglevel error -y -f concat -safe 0 -i "$LIST" -c copy -movflags +faststart "$OUT/deskhub-demo.mp4"
|
|
# GIF-Vorschau (kleiner, für die README, weil nicht jede Seite Videos direkt anzeigt)
|
|
ffmpeg -loglevel error -y -i "$OUT/deskhub-demo.mp4" -vf "fps=4,scale=800:-1:flags=lanczos,split[a][b];[a]palettegen=max_colors=96[p];[b][p]paletteuse=dither=bayer:bayer_scale=4" "$OUT/deskhub-demo.gif"
|
|
rm -rf "$TMP"
|
|
ls -la "$OUT"/deskhub-demo.*
|