Was macht demo-video?
Ein Produkt-Demo, eine Store-Vorschau oder eine Feature-Schleife, die aus einer echten Bildschirmaufnahme des Benutzers erstellt wird. Die Oberfläche wird niemals neu generiert: Die Aufnahme wird geschnitten, beschleunigt, gezoomt, gerahmt, untertitelt und vertont. Apple gibt die gleiche Regel für Vorschauen vor (2.3.4: Video-Bildschirmaufnahmen der App selbst, Erzählung und Overlays erlaubt). Ein cut.json enthält die Aufnahmen, die geordneten Szenen und die Varianten; democut.py wandelt sie mit lokalem ffmpeg in Dateien um, und erneutes Schneiden ist kostenlos.
Schritt 0 — Vorbereitung
Einmal pro Sitzung:
python3 "${CLAUDE_SKILL_DIR}/scripts/democut.py" tools
kind: "ffmpeg_missing"→ Kein lokales Schneiden möglich. Sag dies und biete den kostenpflichtigen Utility-Weg inreferences/routing-utility.mdan oder fordere den Benutzer auf, ffmpeg zu installieren. Improvisiere niemals mit anderen Tools.- Behalte
can.burn_captions(libass),can.duck(sidechaincompress),can.webm. Fehlende ändern, was du versprichst, niemals, was du behauptest. - Nur wenn etwas generiert wird (Erzählung, Musik, Sound, Synchronisation, eine Grafik):
command -v genmedia python3 "${CLAUDE_SKILL_DIR}/scripts/gm.py" preflightblockersnicht leer, CLI fehlt oder älter als 0.7.0 →/genmedia-skills:setup. Schlüssel fehlt → der Benutzer führtgenmedia setupaus oder exportiertFAL_KEYselbst; warte. Lies, drucke, fordere oder tippe niemals einen Schlüssel. Behalteconfig.announce_above_usdundconfig.confirm_above_usd(Standard 0.50 und 2). - Setze zuerst fort:
.genmedia/projects/<slug>/demo-video/cut.jsonexistiert → fahre damit fort, starte niemals einen zweiten Schnitt für dasselbe Produkt.
UX-Regeln
- Antworte in der Sprache des Benutzers. Erzählung,
say-Zeilen und Text auf dem Bildschirm bleiben in der Sprache, in der sie ausgeliefert werden; Modell-Prompts sind auf Englisch. Pfade, IDs und Feldnamen bleiben wie sie sind. - Kein JSON, Filtergraphen, Anforderungs-IDs oder Tool-Erzählung im Chat. Höchstens eine Statuszeile pro langem Schritt.
- Fragebudget: 2, eine nach der anderen, mit beschrifteten Optionen, nur wenn die Antwort fehlt:
- Q1 die Aufnahme, wenn keine Datei angegeben wurde: Frage nach Pfaden und übergib die kurze Aufnahmeliste aus
references/recording-tips.md. Es gibt keinen Standard für Filmmaterial. - Q2 wohin es geht, wenn die Anfrage es nicht sagt: A Website-Demo (16:9) · B App Store Vorschau · C App Store Header- oder Suchergebnis-Video · D Google Play Promo · E Product Hunt Launch-Video · F eine stumme Schleife oder GIF. Mehrere können ausgewählt werden; ein Schnitt dient allen. Alles andere ist ein Standard, den du in der Lieferung angibst: 60 s für eine Demo, 20 s für eine Store-Vorschau, 12 s für ein App-Store-Header- oder Suchvideo, 6 s für eine Schleife; Erzählung an für eine Demo, aus für eine Schleife oder ein Header- oder Suchvideo; Musik aus, wenn nicht verlangt; Untertitel als separate Datei; Schnitte, keine Überblendungen; kein Geräterahmen, es sei denn, ein Store- oder Social-Media-Ziel wünscht einen.
- Q1 die Aufnahme, wenn keine Datei angegeben wurde: Frage nach Pfaden und übergib die kurze Aufnahmeliste aus
- Die Schnittkarte ist ein harter Stopp. Zeige die Szenenliste (Zeiten, was passiert, was gesagt wird, Längen) und warte auf ein Ja, bevor etwas generiert oder gerendert wird. Stille ist keine Zustimmung, und ein Ja zu einer älteren Version ist kein Ja zu dieser.
- Erzählung vor Bild. Generiere die Stimme pro Szene, lass
timesie messen und schneide das Bild darauf zu. Timing einer Szene niemals durch Raten, wie lange ein Satz dauert (references/narration-and-audio.md). - Schau vor der Lieferung. Lies das Standbild und ein Kontaktblatt der fertigen Datei, und lies das erste Bild eines GIFs. Eine Demo, die validiert, aber den falschen Bildschirm zeigt, ist immer noch falsch.
- Fakten und Privatsphäre kommen vom Benutzer. Bewertungen, Zählungen, Auszeichnungen, Kundennamen und Logos erscheinen nur, wenn der Benutzer sie geliefert hat. Wenn ein Bild echte Daten zeigt, ist die Lösung eine neue Aufnahme, keine Unschärfe; sag das deutlich.
- Kosten: Der Schnitt, die Rahmen, die Schleifen und jede Überprüfung sind USD 0. Vor jeder Generierung schätze und wende das Tor aus der Vorbereitung an: unter
announce_above_usd→ ausführen und angeben; bisconfirm_above_usd→ eine Zeile, dann ausführen; darüber → explizites Ja. Zitiere niemals einen Preis aus dem Gedächtnis. - Begrenzt: höchstens 3 Reparaturversuche pro Schritt, jedes Mal ändert sich etwas; eine Content-Policy-Ablehnung wird niemals unverändert erneut gesendet; ein Auftrag mit einer Request-ID wird fortgesetzt, niemals erneut eingereicht.
Discovery-Schutzschild
scripts/video-surfaces.json ist ein datierter Cache (verified_on, gelesen von democut.py specs): ein null ist eine Zahl, die niemand von der offiziellen Seite gelesen hat, fülle sie niemals aus dem Gedächtnis, und wenn ein Store eine Datei ablehnt, gewinnt die offizielle Seite und die Zeile wird korrigiert.
Vor dem ersten bezahlten Aufruf eines Endpunkts in einer Sitzung:
genmedia models --endpoint_id <endpoint_id> --json
python3 "${CLAUDE_SKILL_DIR}/scripts/gm.py" schema <endpoint_id>
status muss active sein; Felder, Enums und Grenzen kommen aus dem Schema. Nicht aktiv → die nächste Stufe dieser Aufgabe in references/routing-audio.md. Führe niemals genmedia run mit einem Prompt anstelle einer Endpunkt-ID aus. Neue Versionen liegen unter Hersteller-Namespaces, nicht nur fal-ai/.
Routing
| Bedarf | Wie | Warum |
|---|---|---|
| Trimmen, Beschleunigen, Zoomen, Rahmen, Zusammenfügen, Overlay, Mischen, Lautstärke, GIF, Überprüfungen | democut.py (lokales ffmpeg) | exakt, kostenlos, wiederholbar; die Pixel des Produkts durchlaufen nie ein Modell |
| Eine Aufnahme oder ein Ergebnis ansehen, ohne sie anzusehen | democut.py analyze, sheet, grab; frames.py sheet | Detektoren und Kontaktblätter statt Vermutungen |
| Erzählung | fal-ai/elevenlabs/tts/eleven-v3; Türkisch: fal-ai/gemini-3.1-flash-tts | Standard TTS; der türkische Pfad ist schema-verifiziert |
| Musikbett, UI-Sounds | elevenlabs/music/v2.5 (exakte Länge), fal-ai/elevenlabs/sound-effects/v2 | Längensteuerung; günstig pro Sekunde |
| Wortgenaue Untertitel-Zeitsteuerung | fal-ai/elevenlabs/speech-to-text/scribe-v2 → audiokit.py captions | Wort-Zeitstempel |
| Eine andere Sprache für eine fertige Datei | fal-ai/elevenlabs/dubbing | ein Aufruf pro Sprache |
| Geräterahmen, Endkarte, exakter Text auf dem Bild | /genmedia-skills:launch-graphics (layers, zusammengesetzte PNGs) | Text wird dort zusammengesetzt, wo er exakt ist, niemals generiert |
| Hintergrundplatte hinter einem gerahmten Gerät | bytedance/seedream/v5/pro/text-to-image | eine Platte pro Video, keine Beschriftung |
| Kein lokales ffmpeg | fal-ai/ffmpeg-api/* in references/routing-utility.md | Cent pro Aufruf, ein Fallback und nicht der Standard |
Tie-Breaker und Fallen:
- Die Oberfläche wird niemals generiert, neu gestaltet, neu gerahmt oder "verbessert".
video-reframe,video-editund Upscaler übermalen UI-Text: sie sind für generiertes Filmmaterial, nicht für eine Aufnahme. - Zoom in Bruchteilen des Quellbilds, lese von
grab --gridodersheet --gridab;holdfür Details,pusheinmal, um das Auge zu führen,pulleinmal, um Kontext zu enthüllen (references/editing.md). - Eine Store-Vorschau ist nicht die Demo mit einem kürzeren Ende: Es ist ihre eigene Variante mit ihrem eigenen Szenen-Subset.
- Play und Product Hunt nehmen eine YouTube-URL, keine Datei: Liefere die Datei und sage, wer sie hochlädt.
- Ein App-Store-Header- oder Suchergebnis-Video (iOS 27 Creative Asset) ist seine eigene stumme, sich wiederholende Variante:
appstore-header-video(3840x1646) oderappstore-search-video(3:2), 30 oder 60 fps, 5-30 s, eine Idee, Szenen von 2 s oder mehr, enden dort, wo es begann. Apple listet kein universelles Video auf; die Standbilder sindlaunch-graphics-Arbeit (references/surfaces.mdAbschnitt 1a). - Eine Telefonaufnahme benötigt einen Telefonrahmen;
timeverweigert eine 30%ige Seitenverhältnisabweichung. - Einbrennen nur, wenn
can.burn_captions; sonst eine separate Datei oder der kostenpflichtige Untertitel-Weg, klar ausgesprochen. - Der Benutzer hat ein Modell genannt → verwende es nach der Live-Überprüfung.
Arbeitsablauf
- Aufnahme. Ziel, Ziele, Aufnahmen, Marke. Lies jede Datei, die der Benutzer genannt hat. Dann, pro Aufnahme:
Die Antwort enthält Größe, fps, Dauer, Audio, etwaige eingebrannte Letterboxen und die Ziele, die zum Seitenverhältnis passen. Eine Aufnahme, die kleiner als das Ziel ist oder die echte Daten zeigt, bekommt jetzt eine Bitte um Wiederholung, nicht nach dem Schnitt (python3 "${CLAUDE_SKILL_DIR}/scripts/democut.py" init --slug <slug> --name "<Product>" --target web-16x9 python3 "${CLAUDE_SKILL_DIR}/scripts/democut.py" source add --slug <slug> --id app --file ./recordings/demo.mov --os desktopreferences/recording-tips.md). - Schau es dir an.
Lies das Blatt.python3 "${CLAUDE_SKILL_DIR}/scripts/democut.py" analyze --slug <slug> --source app python3 "${CLAUDE_SKILL_DIR}/scripts/democut.py" sheet --slug <slug> --source app --count 12 --cols 4 --griddead_spansundkeep_spanssind Kandidaten, niemals ein Schnitt: Ein stiller Bildschirm ist manchmal der Punkt.grab --at <s> --gridfür jedes Bild, in das du zoomen wirst. - Schnittkarte. Szenen in Reihenfolge: id, Quelle in/out, Geschwindigkeit, Zoom, was der Betrachter sieht, was die Stimme sagt, Länge; dann die Varianten, was generiert wird, was vom Benutzer benötigt wird, und die Annahmen. Zeige es, stoppe, warte auf ein Ja (
references/editing.md). - Erzählung, gemessen (nur wenn die Demo vertont ist). Preis und führe einen Batch pro
references/narration-and-audio.mdaus, eine Datei pro Szene, dann lass die Zahlen das Bild bestimmen:python3 "${CLAUDE_SKILL_DIR}/scripts/gm.py" price fal-ai/elevenlabs/tts/eleven-v3,elevenlabs/music/v2.5 --explain python3 "${CLAUDE_SKILL_DIR}/scripts/gm.py" batch --plan .genmedia/projects/<slug>/demo-video/voice-plan.json - Schreibe den Schnitt. Bearbeite
.genmedia/projects/<slug>/demo-video/cut.jsonmit dem Write- oder Edit-Tool:scenes,audio,variants. Jedes Feld:references/cut-json.md. Geräterahmen kommen vonlaunch-graphics layers(references/frames-and-loops.md). - Tor.
Behebe jeden Fehler vor dem Rendern:python3 "${CLAUDE_SKILL_DIR}/scripts/democut.py" time --slug <slug>scene_shorter_than_voice(verlängere den Bereich, verlangsame ihn oder schneide Wörter — beschleunige niemals die Stimme),duration_out_of_rangebei einem Store-Ziel,wrong_size,fps_not_allowed,transition_too_long,frame_aspect_mismatch,overlay_invisible. Handle die Warnungen (quick_cut,fast_motion,narration_mutedbei einem Creative-Asset-Video) oder erkläre die, die du behältst. - Erstelle.
600000 ms Bash-Timeout. Szenen werden nach Inhalt gecacht: Eine Revision rendert nur das neu, was sich geändert hat (python3 "${CLAUDE_SKILL_DIR}/scripts/democut.py" build --slug <slug>--scene <id>,--force). Dann Untertitel und Schleifen:python3 "${CLAUDE_SKILL_DIR}/scripts/democut.py" captions --slug <slug> --variant <id> --formats srt,vtt python3 "${CLAUDE_SKILL_DIR}/scripts/democut.py" gif --slug <slug> --variant loop-16x9 --budget-mb 3 --seconds 6 - Schau dir das Ergebnis an. Lies das Standbild, dann ein Kontaktblatt der fertigen Datei, dann das erste Bild des GIFs:
Überprüfe die ersten 3 Sekunden, die gezoomten Bilder (lesbar?), das letzte Bild (stabil?), jedes Bild auf private Daten und lies die Cue-Datei Buchstabe für Buchstabe.python3 "${CLAUDE_SKILL_DIR}/scripts/frames.py" sheet genmedia-output/<slug>/demo-video/<variant>/<slug>.mp4 --count 9 --cols 3 - Validiere und liefere.
Exakte Größe, fps, Dauer innerhalb des Plattformfensters, Codec und Profil, Byte-Grenze, Audio-Konfiguration, gemessene Lautstärke und True Peak, und bei einem Schleifenziel die Naht (python3 "${CLAUDE_SKILL_DIR}/scripts/democut.py" validate --slug <slug>loop_seam). Dann die Liefernachricht. Revisionen: Bearbeite den Schnitt, erstelle neu, validiere erneut.
Lieferung
<Product> Demo: genmedia-output/<slug>/demo-video/
Master 16:9: web-16x9/<slug>.mp4 (1920x1080, <n> s) · Poster web-16x9/<slug>-poster.png
App Store Vorschau: appstore-iphone/<slug>.mp4 (886x1920, <n> s, H.264 High, AAC 256k) <nur wenn erstellt>
App Store Header / Suchvideo: appstore-header-video/<slug>.mov (3840x1646, <n> s, <fps> fps, stumme Schleife) · Standbild zur Auswahl in App Store Connect: <t> s <nur wenn erstellt>
Play Promo / Product Hunt: das gleiche Master – beide Plattformen nehmen eine YouTube-URL, also lade es hoch und füge den Link ein <nur wenn erstellt>
Schleifen: loop-16x9/<slug>-loop.mp4 · <slug>-loop.gif (<n> MB, <w>px@<fps>) · erstes Bild <slug>-loop-first.png <nur wenn erstellt>
Untertitel: <variant>/<slug>.srt, .vtt (<Sprache>) <nur wenn erstellt> · manifest.json
Deine Aufnahme, unverändert: geschnitten, <beschleunigt, wo gewartet wurde>, gezoomt auf <was>, <in einem gezeichneten Gerät gerahmt>. Nichts in der Oberfläche wurde neu generiert.
F:"für dich: <Länge, Szenenanzahl, Erzählung ein/aus, Musik, Untertitel, Rahmen, Passform – jeder Standard, den der Benutzer nicht gesetzt hat>
Store-Hinweise: <eine Zeile pro zutreffendem Punkt: App Store Vorschauen sind 15–30 s, bis zu 3 pro Gerät, nur Bildschirmaufnahmen (2.3.4) · Header- und Suchvideos werden stummgeschleift (Suche: niemals ungedämpft), erscheinen auf iOS 27 und iPadOS 27 oder später, und ihr Standbild wird nach Genehmigung fixiert · nur die ersten 30 s einer Play Promo laufen automatisch ab · Product Hunt Bilder, einschließlich GIF, bleiben unter 3 MB und das GIF animiert beim Hovern>
Generiert: <keins, USD 0 | Erzählung <n> Zeilen auf <Modell>, Musik, geschätzt USD <x>> · Dateien sind lokal; nichts wurde hochgeladen.
Nächstes: Nenne eine Szene und was zu ändern ist (in/out, Geschwindigkeit, Zoom, Wörter); erneutes Schneiden ist kostenlos.
Übersetze es; behalte Pfade, Größen und Text auf dem Bildschirm unverändert.
Fehler
| Signal | Tu |
|---|---|
kind: "ffmpeg_missing" | Kein lokales ffmpeg. Sage, dass der Schnitt hier nicht gemacht werden kann; biete den fal ffmpeg-api-Weg (references/routing-utility.md) an oder fordere den Benutzer auf, es zu installieren. |
source_changed | Die Aufnahme wurde verschoben oder geändert. source add --replace, dann überprüfe jedes in/out erneut: Die alten Zeiten bedeuten nichts mehr. |
check_failed von time | Jeder Eintrag nennt eine Szene und eine Zahl. Behebe den Schnitt; nichts wird gerendert, solange ein Fehler besteht. |
scene_shorter_than_voice | Verlängere den Bereich, senke speed oder schneide Wörter. Beschleunige niemals die Erzählung, um sie anzupassen. |
duration_out_of_range | Ein offizielles Fenster wurde verfehlt (App Store Vorschauen 15–30 s, Header- und Suchvideos 5–30 s). Entferne oder verkürze Szenen nur für diese Variante. |
wrong_size, fps_not_allowed, fps_too_high | Die Größe oder fps der Variante verletzt ihre Zeile. Entferne die Überschreibung oder wähle einen Wert, den die Zeile akzeptiert (specs). |
loop_seam von validate | Die Schleife springt beim Neustart. Beende mit dem Anfangszustand oder halte denselben Bereich, erstelle, validiere erneut. |
frame_aspect_mismatch | Das Seitenverhältnis passt nicht zum Ziel. Wähle ein anderes Target oder schneide die Quelle zu (references/editing.md). |
overlay_invisible | Ein Overlay hat die Größe Null oder liegt an einer Position, die eine Kante verdeckt. Behebe die Koordinaten in cut.json. |
| Kein Speicher mehr | Der ffmpeg-Prozess hatte nicht genug Speicher. Teile den Schnitt in 2 kürzere und füge sie zusammen, oder erhöhe den Speicher (--memory). |
| Stimmfehler | Ein Modell-Aufruf ist fehlgeschlagen oder hat leere Ergebnisse geliefert (dub, transcribe, tts). Überprüfe die Audio-Datei selbst, wenn möglich, und behebe das Problem. |
kind: "genmedia_timeout" | Ein externer Dienst hat nicht in 30 s geantwortet. Warte 30 s und wiederhole den letzten Schritt. |
content_policy | Der Anbieter hat den Prompt abgelehnt. Verkürze oder umschreibe den Prompt für diese Szene (references/narration-and-audio.md). Sende niemals denselben Prompt erneut. |
unknown_kind von democut.py | Ein unbekannter Fehler im Tool. Zeige die Ausgabe und schlage vor, dass der Benutzer --debug ausführt. |
Referenzen
- Schnelleinführung:
references/quickstart.md - Aufnahmetipps:
references/recording-tips.md - Schnitt-JSON-Spezifikation:
references/cut-json.md - Schnittregeln:
references/editing.md - Erzählung und Audio:
references/narration-and-audio.md - Rahmen und Schleifen:
references/frames-and-loops.md - Oberflächen (Store-Größen):
references/surfaces.md - Audio-Routing:
references/routing-audio.md - Utility-Routing (ffmpeg-api):
references/routing-utility.md