Animiertes Video
Alles hier rendert in remotion/ ohne Credits. Zwei Ebenen – immer zuerst Ebene 1 versuchen:
- Vorgefertigte Szenen kombinieren zu einem Spec (Minuten, kein Code).
- Neuen Szenentyp hinzufügen, wenn eine Idee es wirklich erfordert (Code, getestet, dann für jeden Agenten wiederverwendbar).
Vor dem lokalen Rendern: Wenn remotion/node_modules fehlt, cd remotion && npm ci ausführen
(Das erste Rendern lädt auch Remotions Headless Chrome herunter, ~170 MB, einmalig).
Ebene 1 – Der Szenenbaukasten
Szene (shots[].type) | Am besten geeignet für | Wichtige Felder |
|---|---|---|
kinetic | Den Hook, eine Pointe | text, highlight, per_word (0.18) – Wörter erscheinen nacheinander |
title | Eine einzelne fette Zeile | text ≤ 6 Wörter, highlight |
number | Eine auffällige Zahl | value, prefix, suffix, decimals, caption, color – zählt hoch |
bars | Größenvergleiche | title, unit, items[{label,value,color}] |
compare | Sie vs. du, Mythos vs. Fakt, vorher/nachher | title, left{label,items,color}, right{…} |
list | "3 Dinge", tun/lassen | items, style tick/cross/number |
timeline | Der zeitliche Ablauf | items[{year,text}] |
chat | Eine in Textnachrichten erzählte Geschichte | title (Kontakt), messages[{from: me/them, text, at}] |
quote | Ein belegter Satz | text, by |
media | B-Roll, ein Foto, den KI-Clip | src, kenburns, headline, fit |
Jede Szene akzeptiert label (Kicker), stamp (Stempelnummer), bg (gedimmtes Foto/Video dahinter, mit credit) und transition (fade Standard, cut, slide, zoom, wipe). Overlays (headline, textover, lowerthird, stamp) liegen über jeder Szene. Vollständige Referenz: remotion/SPEC.md.
Ein durchgearbeitetes Beispiel für jeden neuen Szene: remotion/examples/animated.json.
Rezepte
- Faceless-Erklärvideo (20–40 s):
kineticHook →number→bars/compare→list→titleAuflösung, die den Hook aufgreift. Voice-Over alsaudio, Untertitel auswords, ein dezentermusic-Track bei 0.08–0.12. - Textnachrichten-Geschichte:
kineticHook ("Sie antwortete um 3 Uhr morgens") → einchatShot pro Austausch (atim Abstand von 0.8–1.4 s, auf die Erzählung abgestimmt) →titleTwist. Halte jede Blase ≤ 10 Wörter. - Animierte Einblendung in einem Sprechvideo: CLIP_1 …
numberodercomparefür 2–3 s zum passenden Takt (transition: "zoom") … zurück zu CLIP_1 mitstartauf die Stelle gesetzt, wo der Clip fortgesetzt werden soll. - Mythos vs. Fakt:
comparemitleft.color: "danger",right.color: "good", dann einstamp"FALSCH" auf dem nächstentitle.
Plane die Beats mit video-script (tools/beats.mjs passt die Szenen an die Stimme an), dann:
cd remotion
node render.mjs job/spec.json --validate
node render.mjs job/spec.json job/final.mp4 --preview job/check.jpg --at 0.1,<Mitte jeder Szene>,<Ende-1>
Sieh dir immer den Vorschaustreifen an bevor du auslieferst: Hook vollständig bei 0.1 s gezeichnet, nichts an den Rändern abgeschnitten, keine überlappenden Texte, die Akzentfarbe lesbar, der KI-generierte Tag und Wasserzeichen vorhanden.
Stilregeln
- Marke aus
settings.brand(Spectheme): eine Akzentfarbe, verwendet für das eine Element, das in jeder Szene zählt. - ≤ 7 Wörter pro Überschrift, ≤ 12 pro Textover, ≤ 4 Einträge pro Listen-/Vergleichsspalte (der Telefonbildschirm ist klein).
- Eine Szene bleibt mindestens 1,5 s pro Textzeile stehen.
- Zahlen müssen mit
citationsübereinstimmen; animiere niemals eine Zahl, die du nicht recherchiert hast. - Keine Markenlogos, keine Fotos echter Personen, keine Screenshots echter Chats.
Ebene 2 – Ein neuer Szenentyp
Nur wenn keine Kombination oben die Idee zeigen kann (z. B. eine Kartenroute, ein Fortschrittsring, eine Split-Screen-Reaktion).
src/types.ts:XShot = ShotBase & { type: "x"; … }hinzufügen und zumShot-Union-Typ hinzufügen.src/shots/Shots.tsx: Die Komponente neben den anderen schreiben – mitspring/interpolatevonuseCurrentFrame()animieren (niemals CSS-Animationen oderMath.random: Rendering muss deterministisch sein),t.font,t.accent,tone(t, color)verwenden, Größe für 1080×1920, dann eineif (s.type === "x") body = …- Zeile inShotVieweinfügen. Wenn die Szene bei 0 s (base === 0) erscheint, zeichne sie vollständig ohne Eingangsanimation.render.mjs:"x"zutypeshinzufügen und Validierung für seine Pflichtfelder (der Prüfagent verlässt sich auf diese Meldungen).SPEC.md+ Tabelle oben: Dokumentieren. Zuexamples/animated.jsonhinzufügen.- Testen:
npx tsc --noEmit -p .,node render.mjs examples/animated.json out/animated.mp4 --preview out/animated.jpg --at …und das Ergebnis betrachten.