Neues Video: Vom Take zum Master
Vor dem Start: harness.config.json → configured: true (sonst Skill setup), bash video/scripts/doctor.sh ohne MISSING. Lies brand-kit.md, editing-taste.md, „Geschmacksprofil“ in exemplars.md, anti-patterns.md, delivery-specs.md. Video-Stil ausschließlich aus dem Benutzerprofil: gibt es Poster, Karten, Sticker, B-Roll, Sound, wie viel Grafik, welches Tempo. Was nicht im Profil steht – frage nach, entscheide nicht selbst. Ausgangspunkt des Codes ist das aktuelle video/src/.
Wenn video/public/footage.mp4 bereits vom letzten Video existiert und nicht in edits/ archiviert ist – archiviere es zuerst (Schritt 11), dann beginne neu.
1. Take-Besichtigung
ffprobe -v error -show_entries format=duration:stream=width,height,r_frame_rate:stream_side_data=rotation -of default=nw=1 takes/1.MOV
Orientierung anhand rotation, nicht width (iPhone schreibt Hochformat als 1920x1080 + Flag). Betrachte 3–4 Frames (ffmpeg -ss N -i … -frames:v 1 out/peek-N.jpg). Nicht stabilisieren, wenn vom Stativ gedreht – vidstab fügt Verwacklung hinzu. Nur wenn eindeutig aus der Hand: stabilisiere das QUELLMATERIAL (vidstabdetect=shakiness=6:accuracy=15 → vidstabtransform=smoothing=25:optzoom=1:interpol=bicubic, -c:a copy; benötigt ffmpeg mit libvidstab) und arbeite dann damit weiter.
2. Dopplungen und Fehlstarts – VOR dem Schnitt
cd video && python3 scripts/chunks.py ../takes/1.MOV
Eine durchgehende Transkription versteckt Wiederholungen, aber der Zuschauer bemerkt sie sofort. Finde: benachbarte Abschnitte mit demselben Satz (Dopplung – behalte den LETZTEN), Abschnitte mit 1–2 Wörtern, die der nächste Abschnitt neu beginnt (Fehlstart). Zeige dem Benutzer die Liste dessen, was du herausschneiden wirst, mit Zeitcodes – und hole ein „Ja“ ein. Grenzen innerhalb von Pausen.
3. Schnitt
cp public/captions.json out/captions.backup.json 2>/dev/null # cut.py überschreibt Transkript
DROP="12.40-15.80" python3 scripts/cut.py ../takes/1.MOV
Tempo stammt aus cut im Profil (anhand von Referenzen ermittelt). Das Skript gibt DURATION, Schnittbilder und eine Prüfung „Schnitt auf Sprache“ aus. Wenige Schnitte für das vom Benutzer gewünschte Tempo – übergib Argumente unterhalb des Profils, z. B. … 0.4 0.2 (Ziel ~0.35 / 0.2); viele – oberhalb. Gar keine Schnitte – lauter Raum: QUIET=-46. Schneller Sprecher/langsames Tempo – SPEED=1.1. Schnitt auf Sprache – verschiebe DROP oder Parameter, lasse es nicht so.
4. Mattieren – starte SOFORT (wenn style.poster.enabled)
TITLE_OUT = erster Schnitt aus der Ausgabe von cut.py (Poster verschwindet dort), normalerweise 4–7 s. Mattieren ist der längste Teil (~8 s/Frame auf CPU, 2 Worker ≈ 6 Frames/min), starte im Hintergrund und schreibe Code, während es läuft:
python3 scripts/matte.py <TITLE_OUT> 2 > out/matte.log 2>&1 # im Hintergrund (run_in_background)
Rendere keine Stills, während es läuft – sie bremsen es aus. Warte auf Ende durch ps -axo command | grep "[m]atte.py", nicht durch pgrep. Das Skript überspringt fertige Frames – nach Neustart starte einfach erneut.
5. Transkript
Öffne public/captions.json (w, s, e in Sekunden, em):
- korrigiere Hörfehler: Namen, Marken, Fachbegriffe, Anglizismen; Akronyme wie geschrieben (
AI,ROI); whisper liebt „Danke fürs Zuschauen“ / „Thank you.“ in der Stille des Endes – entferne es; em: 2(wennstyle.captions.highlight–sizeoderboth) und"accent": 1(wenncoloroderboth) – inhaltlich, in der im Profil beschriebenen Anzahl und auf den beschriebenen Wörtern (brand-kit.md§2, §4). Nicht beschrieben – frage, welche Wörter hervorgehoben werden sollen.
6. Beat-Plan
Selbst oder mit Unteragent script-beats (bei langem Video) schreibe video/SCRIPT.md:
- Poster – nur wenn
style.poster.enabled: Zeilen in den Worten und im Ton des Benutzers, Akzent und Kicker wie im Profil; - Karten – wenn
style.cardsnichtnone, mit Dichte ausediting-taste.md§3 (Zahl →count; Schritt →num+head; Aufzählung →head+linesoderrowmit Symbolen auf Wörtern);from= erstes Wort der Phrase + 4 Frames; - Sticker
FLOATS– nur wennstyle.stickers: Beschriftung mit einem Wort, kompaktes Piktogramm (ART_NAMES); - Karte
pain: true– nur wenn der Benutzer „so nicht“ wünscht.
Vor dem Code zeige dem Benutzer kurz den Beat-Plan (was wo erscheint) – sein Video, seine Entscheidungen.
7. Code
src/Composition.tsx:DURATION,TITLE_OUT,KICKER,TITLE,BEATS,FLOATS;Captions from= Beginn der zweiten Phrase, falls Poster vorhanden, sonst 0.src/ui/Footage.tsx: TabelleBEATSstreng nach den Schnitten aus cut.py, in voller Stärke (Nahaufnahme 1.16–1.21×, normal 1.06–1.09×) –style.motion.punchschwächt ab oder deaktiviert selbst. Wo Nahaufnahme platziert wird – nachediting-taste.md§4; nach Nahaufnahme wieder zurückzoomen, sonst „klebt“ die Nähe; falls Poster – beim ersten Schnitt.- Neue Komponente nur, wenn weder Karte noch Sticker noch
Photo/Clip/Tagdies ausdrücken können (dann –scene-builder). - B-Roll von Higgsfield – falls verbunden und Profil es wünscht (
brand-kit.md§5): zeige über<Clip>(vorher zuschneiden und stummschalten:ffmpeg -an -t <sek>), überprüfe Text/Gesichter/Hände auf den Generierungs-Frames vor dem Einfügen. Frage zuerst den Benutzer und nenne den Preis. - Sound – nur wenn
style.sfx: fehlende Rollen (card,count,end) – durch Unteragentaudio-agentanhand der Beschreibung aus dem Profil. npm run lint– sauber.
8. Abstimmungs-Frames (nach dem Mattieren)
Rendere je einen Still für jede Karte und jeden Sticker zum vollständig montierten Zeitpunkt, Poster in der Lebensmitte (letzte Zeile wird über den Haaren gelesen), einige Untertitel-Phrasen, LETZTEN Frame:
npx remotion still MyComp out/key/f<N>.png --frame=<N> --scale=0.5 --timeout=120000
Füge zu einem Blatt mit 4 pro Zeile und beschrifteten Nummern zusammen (PIL; Schriftart mit Kyrillisch, z. B. /System/Library/Fonts/Supplemental/Arial Bold.ttf), zeige dem Benutzer (SendUserFile). Master erst nach seinem „ok“. Blatt – Minuten, Master – 10–20 Minuten.
Prüfe selbst vor der Anzeige: Schlüsseltext außerhalb der unteren 15 % / oberen 8 %; nichts überlappt; Sticker überschneidet sich nicht mit Karte; letzter Frame weder leer noch abgeschnitten; alles wie im Benutzerprofil und nichts darüber hinaus.
9. Master
npm run master # im Hintergrund; warte auf Prozess, nicht auf Datei-Erscheinen
Das Skript prüft selbst die Ausschnitte, zählt Frames und erstellt out/preview.mp4. Prüfe die Lautstärke: ffmpeg -i out/final-master.mp4 -af ebur128 -f null - 2>&1 | grep -A3 Summary ≈ Ziel aus audio.lufs. Sende dem Benutzer die Vorschau.
Korrektur nach dem Master („schneide diesen Satz raus“) – schneide den Master selbst (ffmpeg trim+concat an der Stille), nicht den Take neu schneiden oder alles neu rendern; nenne vorher die ETA. Prüfe die Naht: schneide 6 s rundherum aus und führe whisper aus – es müssen genau die zwei gewünschten Phrasen übereinstimmen.
10. Thumbnail
Frage, welches Thumbnail benötigt wird, falls im Profil nicht angegeben: Frame mit Titel (Cover), Video-Poster (PosterCover) oder eigenes. Wähle Frame gemeinsam mit dem Benutzer: schlage 3–4 scharfe Frames mit offenen Augen vor (ffmpeg -ss <sek> -i takes/1.MOV -frames:v 1 -q:v 2 out/cover-N.jpg).
- Ausgewählter Frame →
public/cover-bg.jpg. rembg i -m birefnet-portrait public/cover-bg.jpg out/cover-matte.pngpython3 scripts/cover-sticker.py public/cover-bg.jpg out/cover-matte.png public/cover-cutout.png 20- In
Root.tsx→CoverdefaultProps.lines: Titel in den Worten des Benutzers,accent/em– wie er es wünscht. Größen passen sich automatisch an – ändere keine Schriftgrößen. npx remotion still Cover out/cover.png --timeout=120000– zeige.
Alternative: PosterCover – Video-Poster als Thumbnail (Frame + dessen Freistellung in poster-bg.jpg / poster-cutout.png).
11. Archiv
edits/<N>/ (im Stammverzeichnis, nicht in video/): Composition.tsx, Footage.tsx, captions.json, SCRIPT.md, cover.png, final-master.mp4, preview.mp4. Falls der Benutzer wünscht – weiter mit Skill publish.