youtube/remotion/README.md
Pascal Scholz 0b326e6e9c Folge 2 „Pino ist müde“ komplett in Remotion (ohne Ton, ohne Higgsfield)
Szenen aus der Figuren-Bibliothek: freigestellte Standbilder mit
Posenwechsel, freigestellte Clips (WebM mit Alpha in /shared), Orte als
vorberechnete Aquarell-SVGs, Untertitel statt Stimmen. Zeitplan aus den
Sprechzeilen, damit ElevenLabs-Aufnahmen später nur die Dauer setzen.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-29 02:09:06 +00:00

107 lines
5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Remotion – Szenen aus Figuren-Grafiken
Animiert die freigestellten Figuren (Pino, Noa, Lulu) per Code, ohne
Higgsfield-Clips. Erster Test: `LaterneTest` (14 s, Abendspaziergang mit
Noas Laterne, ohne Ton).
## Aufbau
| Pfad | Inhalt |
| --- | --- |
| `public/figuren/` | freigestellte PNGs der Figuren |
| `src/figuren.ts` | Bildmaße, Augenpositionen (fürs Blinzeln), Noas Hand |
| `src/teile/Figur.tsx` | Figur an den Füßen verankert: verschieben, drehen, stauchen, blinzeln |
| `src/teile/Laterne.tsx` | Laternenstab mit pendelnder Papierlaterne |
| `src/teile/Abendhuegel.tsx` | Hintergrund in Aquarell-Optik (SVG), Vordergrund, Papierstruktur |
| `src/szenen/LaterneTest.tsx` | die Testszene mit Zeitplan |
## Benutzen
```bash
npm install
npx remotion studio # Vorschau im Browser
npx remotion render src/index.ts LaterneTest /shared/youtube/tests/laterne-test.mp4
```
Fertige Videos gehören nach `/shared/youtube/`, nicht ins Git.
Im VPS-Container fehlen Chrome einige Systembibliotheken. Sie liegen ohne
Root-Rechte unter `~/.local/chrome-libs` (Debian-Pakete, nur entpackt) und
werden so eingebunden:
```bash
export LD_LIBRARY_PATH=$HOME/.local/chrome-libs/root/usr/lib/x86_64-linux-gnu
```
## Figuren freistellen
Mit `rembg` (Modell `isnet-general-use`), danach Maske härten, nur die größte
Fläche behalten, Rand um 2 px einziehen (sonst heller Saum vor dunklem
Hintergrund). Am besten funktionieren Einzelbilder vor hellem Papier.
## Körperteil-Masken (Rig)
`werkzeuge/rig.py` zerlegt jede Figur in Körperteile und erzeugt:
| Pfad | Inhalt |
| --- | --- |
| `public/figuren/<figur>/teile/<teil>.png` | harte Maske, genau an der Kontur |
| `public/figuren/<figur>/einfluss/<teil>.png` | weiche Maske für die Verformung: Teil + alles, was daran hängt, weicher Übergang am Gelenk, reicht über die Kontur hinaus |
| `public/figuren/<figur>/uebersicht.png` | alle Teile farbig, zum Prüfen |
| `src/rigs.ts` | Gelenkpunkte und Hierarchie (automatisch erzeugt) |
Teile: Lulu – kopf, hals, ohr_links/rechts, horn_links/rechts, rumpf,
bein_vorne_links/rechts, bein_hinten_links/rechts, schwanz, schal_schlinge,
schal_ende, schal_boden. Pino – koerper, kopf, ohr_links/rechts, bauch,
arm_links/rechts, fuss_links/rechts, muetze, bommel. Noa – kopf,
zopf_links/rechts, rumpf, arm_links/rechts, hand_links/rechts,
bein_links/rechts, stiefel_links/rechts.
Zuordnung: Accessoires über ihre Farbe, alles andere über Kernflächen pro
Teil, die bis zur Kontur wachsen – nur innerhalb der Figur, also nie über
Lücken (Schwanz ↔ Bein). Neue Figur oder neues Bild: Skelett und Flächen in
`rig.py` eintragen, dann
```bash
python3 werkzeuge/rig.py # braucht numpy, scipy, pillow
```
und `uebersicht.png` prüfen. In einer Szene: `gelenk('lulu', 'hals', grad)`
(siehe `src/szenen/VerformTest.tsx`).
## Folge 2 „Pino ist müde“ (`Folge02`)
Komplette Folge (ca. 5:20) nur mit Code, Figuren-Bibliothek und ohne Ton:
Untertitel ersetzen vorerst die Stimmen, Mitmach-Pausen zeigen ein „?“.
| Pfad | Inhalt |
| --- | --- |
| `src/folge02/Folge02.tsx` | Reihenfolge der Szenen |
| `src/folge02/szene2.tsx` … `szene7.tsx`, `lied.tsx`, `buch.tsx` | die Szenen; jede hat oben ihre Sprechzeilen (`plane([...])`) |
| `src/folge02/zeit.ts` | Zeitplan aus den Zeilen; Dauer wird aus der Textlänge geschätzt |
| `src/folge02/figur.tsx` | `Figur` (Standbilder mit Posenwechsel), `ClipFigur` (freigestellte Clips), `Kamera` |
| `src/folge02/orte.tsx` | Orte als SVG; vorberechnet nach `public/folge02/orte/` |
| `src/folge02/natur.tsx` | Blätter, Nest, Vögel, Schnee, Zzz, Funkeln, große Rufe |
| `src/folge02/posen.ts` | automatisch erzeugt von `werkzeuge/posen.py` |
| `public/folge02/figuren/` | freigestellte Standbilder (WebP, im Git) |
| `public/folge02/clips` | Link auf `/shared/youtube/folge02/clips_frei/` (WebM mit Alpha, nicht im Git) |
Orte neu vorberechnen (nach Änderungen in `orte.tsx`):
```bash
npx remotion still src/index.ts F2Ort-garten public/folge02/orte/garten.webp --image-format=webp
```
Rendern:
```bash
npx remotion render src/index.ts Folge02 /shared/youtube/folge02/folge02-vorschau.mp4 --gl=swangle
```
Auf einem anderen Rechner fehlen die Clips: den Ordner
`/shared/youtube/folge02/clips_frei/` nach `public/folge02/clips/` kopieren.
Fehlt ein Clip, zeigt `ClipFigur` ein Standbild der Figur.
**Ton nachrüsten (ElevenLabs):** Je Zeile die Audiodatei erzeugen, ihre
Länge als `dauer` in die Zeile eintragen und die Datei als `<Audio>` am
`start` der Zeile einbinden. Alle Bewegungen hängen an den Zeilen und
verschieben sich mit.
**Neue Standbilder/Clips:** Standbilder mit `rembg` freistellen, ohne
Zuschneiden (gleiche Leinwand), dann
`python3 werkzeuge/posen.py <ordner_freigestellt> /shared/youtube/folge02/clips_frei`.
## Bekannte Grenzen
- Die Figuren haben nur die Pose ihres Bildes. Neue Posen brauchen ein neues
Bild (z. B. aus Gemini).
- Die SVG-Filter im Hintergrund werden pro Frame neu berechnet und machen das
Rendern langsam. Für lange Folgen die Hintergrund-Ebenen einmal als PNG
vorberechnen.