Communitygithub.com

skailabinfo/claude-video-harness

Montage eines neuen Videos aus einer Rohaufnahme – Dopplungen und Fehlstarts finden, Pausen schneiden, Transkript korrigieren, Person für Poster freistellen, Beat-Liste mit Karten und Stickern, Abstimmungs-Frames, Master, Thumbnail, Archivierung. Starte mit „montiere takes/1.MOV“, „neues Video“, „hier ist die Aufnahme“.

Was ist claude-video-harness?

Dieses Skill-Paket ermöglicht die vollständige Postproduktion eines Videos aus einer einzelnen Rohaufnahme (Take). Es führt den Benutzer Schritt für Schritt von der Analyse des Rohmaterials über das Entfernen von Dopplungen und Fehlstarts, das präzise Schneiden von Pausen, das Bearbeiten des Transkripts (inklusive Hervorhebungen), das Erstellen eines detaillierten Beat-Plans mit Karten, Stickern und Postern bis hin zur finalen Master-Erstellung und Archivierung. Der Skill unterstützt sowohl lokale Ausführung (ffmpeg, Python-Skripte, ffprobe) als auch die Integration von Cloud-Diensten wie Higgsfield für B-Roll. Er analysiert automatisch Kamerarotation, erkennt Fehlstarts durch Transkript-Vergleiche und schlägt optimale Schnitte vor. Der Benutzer behält stets die Kontrolle: Beat-Plan, Karteninhalte und Thumbnail werden vor der finalen Ausgabe zur Freigabe vorgelegt. Besonders nützlich ist die Fähigkeit, während des rechenintensiven Mattings (Freistellen der Person für Poster/Karten) im Hintergrund weiterzuarbeiten. Nach dem Master-Schnitt können letzte Änderungen direkt am Master durchgeführt werden, ohne die gesamte Timeline neu rendern zu müssen. Das Skill endet mit der strukturierten Archivierung aller Projektdateien für zukünftige Wiederverwendung.

Funktioniert mit✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/skailabinfo/claude-video-harness/tree/HEAD/.claude/skills/new-video

In Ihrer bevorzugten KI fragen

Öffnet einen neuen Chat, in dem dieser Agent-Skill bereits geladen ist.

Dokumentation

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 (wenn style.captions.highlight – size oder both) und "accent": 1 (wenn color oder both) – 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.cards nicht none, mit Dichte aus editing-taste.md §3 (Zahl → count; Schritt → num + head; Aufzählung → head + lines oder row mit Symbolen auf Wörtern); from = erstes Wort der Phrase + 4 Frames;
  • Sticker FLOATS – nur wenn style.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: Tabelle BEATS streng nach den Schnitten aus cut.py, in voller Stärke (Nahaufnahme 1.16–1.21×, normal 1.06–1.09×) – style.motion.punch schwächt ab oder deaktiviert selbst. Wo Nahaufnahme platziert wird – nach editing-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/Tag dies 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 Unteragent audio-agent anhand 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).

  1. Ausgewählter Frame → public/cover-bg.jpg.
  2. rembg i -m birefnet-portrait public/cover-bg.jpg out/cover-matte.png
  3. python3 scripts/cover-sticker.py public/cover-bg.jpg out/cover-matte.png public/cover-cutout.png 20
  4. In Root.tsx → Cover defaultProps.lines: Titel in den Worten des Benutzers, accent / em – wie er es wünscht. Größen passen sich automatisch an – ändere keine Schriftgrößen.
  5. 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.

Individual skills in this repo

This repo contains 2 individual skills — each has its own dedicated page.

Verwandte Skills