#!/usr/bin/env bash # tools/demo-video/compose.sh: setzt die Aufnahme (raw.mp4) in ein modernes 1080p-Video: Farbverlauf-Hintergrund, abgerundetes Fenster mit Schatten, # selbst erzeugte Musik (make_music.js) mit Ein- und Ausblenden. Außerdem eine kurze GIF-Vorschau. # bash tools/demo-video/compose.sh set -euo pipefail RAW="${1:?raw.mp4 fehlt}" OUT="${2:?Zielordner fehlt}" HERE="$(cd "$(dirname "$0")" && pwd)" WORK="$OUT/.build"; rm -rf "$WORK"; mkdir -p "$WORK" DUR="$(ffprobe -v error -show_entries format=duration -of csv=p=0 "$RAW")" # Maske mit runden Ecken (Fenstergröße 1600x1000, Radius 26) ffmpeg -loglevel error -y -f lavfi -i "color=c=black:s=1600x1000" -frames:v 1 \ -vf "format=gray,geq=lum='if(lte(hypot(max(max(26-X,X-(W-1-26)),0),max(max(26-Y,Y-(H-1-26)),0)),26),255,0)'" "$WORK/mask.png" # Musik node "$HERE/make_music.js" "$WORK/music.wav" "$RAW.events.json" ffmpeg -loglevel error -y -i "$RAW" -loop 1 -framerate 30 -i "$WORK/mask.png" -i "$WORK/music.wav" \ -f lavfi -i "gradients=s=1920x1080:c0=0A5F95:c1=0E8C7C:x0=0:y0=0:x1=1920:y1=1080:d=$DUR:r=30" \ -filter_complex "[0:v]scale=1600:1000:flags=lanczos,format=yuva420p[rec];\ [1:v]format=gray,split[m1][m2];\ [rec][m1]alphamerge[win];\ [m2]pad=1760:1160:80:80:black,boxblur=38:3[mb];color=c=black:s=1760x1160,format=yuva420p[blka];[mb]format=gray[mbg];[blka][mbg]alphamerge,colorchannelmixer=aa=0.55[sh];\ [3:v]format=yuv420p[bg];\ [bg][sh]overlay=80:-18[t1];[t1][win]overlay=160:40,format=yuv420p[v]" \ -map "[v]" -map 2:a \ -c:v libx264 -crf 19 -preset medium -r 30 -c:a aac -b:a 160k -shortest -movflags +faststart "$OUT/deskhub-demo.mp4" # GIF-Vorschau: der Teil mit dem digitalen Assistenten (kleiner, für die README) ffmpeg -loglevel error -y -ss 4 -t 16 -i "$OUT/deskhub-demo.mp4" -an -vf "fps=8,scale=760:-1:flags=lanczos,split[a][b];[a]palettegen=max_colors=128[p];[b][p]paletteuse=dither=bayer:bayer_scale=4" "$OUT/deskhub-demo.gif" rm -rf "$WORK" ls -la "$OUT"/deskhub-demo.*