Was macht Handmade Stage Film?
Halloween-Nacht, nichts im Fernsehen: Ein Mädchen mit schwarzem Bob sitzt in einem bemalten Pappkarton-Sofa, pinkes Getränk in der Hand, und klickt auf die Pappkarton-Fernbedienung. Der Pappkarton-Fernseher schaltet sich ein, zeigt Rauschen, ein kleiner Geist tanzt auf dem Bildschirm, löst sich dann davon und schwebt davon. Er schwebt neben ihrem Becher („Wollte einen Schluck.“), landet auf dem karierten Tisch, wo eine riesige Gabel auf einen Teller mit bemalten Beeren sticht („Gardenia. Beeren. Joghurt.“), und einen Schluck später sitzt sie auf einem riesigen Hexenhut, während um sie herum Sterne aufleuchten („…volle Magie.“). Der Becher bekommt seine Nahaufnahme mit einem gekritzelten „Magic Pretty Water“ und einem Pfeil, und die letzte Karte zeigt das Wortmarke, den Becher, den Geist, „Halloween limited“ und den Verkaufsort. Jedes Bild stammt aus den eigenen sieben Kampagnenfotos der Marke.
Es wird aus vier Teilen erstellt:
scripts/generate.mjsverwandelt Standbilder in die Bestandteile: 9:16-Keyframes (Nano Banana 2 malt die zusätzliche Fläche, die originalen Pixel werden darübergelegt), Kling-Clips, ausgeschnittene Requisiten, neu aufgelegte Etiketten und das Wortmarke.scripts/reel.mjsschneidet die Clips zu einem einzigen Film auf der Taktung des Films zusammen.scripts/sfx.mjssynthetisiert den Ton: einen original Musikbox-Walzer und ein Geräusch für jedes Ereignis.scripts/render.mjsspielt alles als Bühnenshow ab: abgestufte Bewegung mit 12 Bildern pro Sekunde, Handkamera-Wackeln, bewegliches Korn, Puppen, zerrissene Papier-Bildunterschriften, Tags mit Pfeilen, einen Fernsehbildschirm, der sich einschaltet, und die letzte Karte. Es rendert lokal mit headless Chrome und FFmpeg.
Einrichtung (einmal pro Rechner)
Im Ordner dieser Skill ausführen:
npm install
Dies installiert puppeteer-core und ffmpeg-static. Google Chrome muss installiert sein, oder setzen Sie CHROME_PATH auf eine Chrome/Chromium-ausführbare Datei (npx @puppeteer/browsers install chrome-headless-shell@stable gibt eine aus).
Das Filmmaterial benötigt einen API-Key für Nano Banana 2 und Kling 2.5 Turbo; die Skripte rufen sie über ein Modell-API-Gateway auf, wo der Key erstellt wird (https://fal.ai/dashboard/keys). Der Benutzer setzt ihn in seinem eigenen Terminal als FAL_KEY (z. B. in seinem Shell-Profil). Bitten Sie ihn niemals, den Key in den Chat einzufügen, und drucken Sie ihn niemals aus.
Kosten
Modellnutzung, abgerechnet über Ihren eigenen API-Key: 0,08 $ für jedes auf 9:16 erweiterte Standbild (und jedes edit), 0,35 $ für jeden 5-Sekunden-Clip und ein Bruchteil eines Cents für jeden Ausschnitt (Oktober 2026 Preise). Ein Film mit sieben Standbildern und fünf Clips kostet etwa 2,30 $. Der Film, die Puppen, die Bildunterschriften, der Ton und die finale MP4 werden lokal auf Ihrem Rechner kostenlos erstellt. Teilen Sie dem Benutzer die Kosten vor der Generierung mit.
Was es zum Funktionieren bringt
- Ihre eigenen Fotos, unberührt, wo es zählt. Die Erweiterung und jeder Clip beginnen mit den echten Standbildern der Marke;
extendlegt die originalen Pixel wieder über die KI-Version, undrelabellegt ein scharfes Etikett über jedes Bild, in dem der Clip es unscharf gemacht hat. - Eine Geschichte, keine Diashow. Planen Sie eine kleine Handlung über die Aufnahmen hinweg, mit einer Sache, die zwischen ihnen reist (hier ein Geisterpuppe, die aus einem Fernseher entkommt). Bildunterschriften sind kurze Handlungsstränge, keine Slogans.
- Absichtlich unbeholfen. Alles bewegt sich in Schritten von 1/12 s mit einem winzigen Wackeln, Puppen wackeln auf ihren Schlüsseln, Bildunterschriften erscheinen in drei Schritten und Pfeile zeichnen sich in drei Strichen. Glätten Sie es nicht.
- Halb Produkt, halb Marke. Das Produkt ist in den meisten Aufnahmen zu sehen und bekommt eine Nahaufnahme mit einem Tag; die letzte Karte zeigt das Wortmarke, das Produkt, den Namen und wo man es kauft.
Arbeitsablauf
- Sammeln Sie 4–8 Standbilder aus einem Shooting (3:4, 4:5 oder 9:16), den Produktnamen, eine Zeile (Geschmacksrichtungen, Materialien), einen Hinweis („Halloween limited“) und den CTA. Fragen Sie, ob die Standbilder ein aufgedrucktes Wortmarke oder ein Abzeichen unten tragen (es wird aus den Bildern entfernt und für die letzte Karte ausgeblendet).
- Drehbuch (vor der Generierung zeigen): die Reihenfolge der Aufnahmen, die Handlung, was sich in jedem Clip bewegt (ein oder zwei kleine Aktionen, das Produkt bleibt still), welche Requisiten als Puppen ausgeschnitten werden und was sie tun, die Bildunterschriften und die Tags, und die Kosten. Halten Sie es bei 15–20 s.
- Keyframes:
node scripts/generate.mjs extend --in still.jpg --out keys/<shot>.png --cover <rows>für jedes Standbild, das nicht 9:16 ist (--cover= die Höhe in Pixeln des aufgedruckten Wortmarke-Bandes unten am Original, falls vorhanden). Betrachten Sie jedes in voller Größe: Wenn das Modell ein gespiegeltes oder verdoppeltes Objekt in den neuen Bändern hinterlassen hat, bedecken Sie es mit einfacher Textur aus demselben Foto. - Test: ein Clip, die Aufnahme mit dem Aufhänger der Handlung:
node scripts/generate.mjs clip --start keys/<shot>.png --prompt "…" --out clips/<shot>.mp4. Der Prompt benennt nur, was sich bewegt („sie drückt mit dem Daumen eine Taste auf der Fernbedienung; der Becher bleibt aufrecht und still“); ein fester Suffix hält die Kamera fixiert und das Set, Gesicht und Produkt unverändert. Zeigen Sie ihn, dann machen Sie die restlichen. - Clips für die anderen bewegten Aufnahmen. Betrachten Sie jeden Clip Bild für Bild: notieren Sie, wo die Aktion endet (um den Ton und die Puppen darauf zu setzen) und wo kleine Texte auf dem Produkt unscharf werden. Beheben Sie Etiketten mit
relabel --clip … --key keys/<shot>.png --box x,y,w,h(das Etikettenfeld im Keyframe), oder verwenden Sie nur die Bilder vor der Bewegung des Produkts. Ein Clip wird nicht für jede Aufnahme benötigt: eine Nahaufnahme mit langsamem Zoom (still,box,boxTo) ist für das Produkt oft besser. - Requisiten:
cutout --in keys/<shot>.png --box x,y,w,h --out props/<name>.pngfür jede Puppe (eine Figur, Sterne, eine Blume, eine Beere, das Produkt in einer Hand);editfür einen Teller, von dem etwas entfernt wurde (ein Fernsehbildschirm ohne seinen Geist). Das Wortmarke:wordmark --in still.jpg --box x,y,w,h --out props/wordmark.png. Der Hintergrund der letzten Karte ist ein Ausschnitt einer bemalten Wand aus einem der Keyframes. - Erstellen Sie
effect.jsonausexamples/example.json(siehe Aufnahmen und die letzte Karte), dannnode scripts/reel.mjs effect.json --out reel.mp4und setzen Sie"reel": "reel.mp4". - Ton:
node scripts/sfx.mjs effect.json --out stage.m4a, dann"music": "stage.m4a". Führen Sie es nach jeder Änderung des Timings erneut aus.--no-bed --music track.mp3tauscht den Walzer gegen einen Titel aus, den der Benutzer lizenzieren darf. - Validieren:
node scripts/validate.mjs effect.json— beheben Sie jeden Fehler und lesen Sie die Warnungen dem Benutzer vor. - Entwurf:
node scripts/render.mjs effect.json --quality draft --width 540 --out draft.mp4, und überprüfen Sie ein Bild aus jeder Aufnahme: keine Bildunterschrift, kein Tag oder keine Puppe auf einem Gesicht oder dem Produkt, alles außerhalb der rechten 14 %, wo die Buttons der Plattform sitzen. - Final:
node scripts/render.mjs effect.json --out film.mp4 --poster poster.png. Für Xiaohongshu eine 3:4-Version zuschneiden:ffmpeg -i film.mp4 -vf crop=720:960:0:160 -c:a copy film-3x4.mp4(bei der Standardbreite von 720; prüfen, ob nichts Wichtiges in den oberen oder unteren 160 px sitzt).
Aufnahmen
Alle Positionen sind in 1080 × 1920 Bildpixeln. Jede Aufnahme ist eine von:
- Eine Clip-Aufnahme:
clip(die Datei, aus der reel.mjs schneidet),fromundto(Sekunden im Clip),speed(0,5 = halbe Geschwindigkeit, was bei der 12-Schritt-Wiedergabe jedes Bild einer kurzen guten Sequenz verwendet),hold(Sekunden, die das erste Bild hält, bevor es sich bewegt). - Eine Standbild-Aufnahme:
still(ein Bild),len,boxundboxTo([x, y, Breite]9:16-Fenster in den Bildpixeln; die Ansicht bewegt sich von einem zum anderen).
Jede Aufnahme kann haben:
captions:{ "text", "at", "out", "x", "y", "rot", "size" }— zerrissene Papierschnipsel mit handgeschriebenen Wörtern;\nbricht eine Zeile um.tags:{ "text", "at", "x", "y", "to": [x, y], "ink": "dark" | "light", "rot", "size" }— handgeschriebene Wörter mit einem Pfeil, der sich zutozeichnet.puppets:{ "image", "path": [[t, x, y, Breite, Rotation], …], "sound", "exit", "flip", "wobble" }— ein Ausschnitt, der zwischen seinen Schlüsseln bewegt wird (t in Sekunden innerhalb der Aufnahme, x und y sein Mittelpunkt). Ein Schlüssel mit Breite 0 gefolgt von einem vollen Schlüssel einen Schritt später ist ein Pop. Es hält seinen letzten Schlüssel, es sei denn,"exit": true.soundwird bei seinem ersten Schlüssel abgespielt.screen:{ "rect": [x, y, w, h], "off", "static", "plate", "plateAt" }— ein Fernseh- oder Telefonbildschirm, der bisoffschwarz ist, bisstaticRauschen zeigt, undplate(derselbe Keyframe mit geleertem Bildschirm) abplateAtanzeigt, damit eine Puppe daraus klettern kann.sounds:[[t, "Kind"], …]—click,tvon,static,ghost,boing,tap,pop,whoosh,land,stab,sip,sparkle,chime,paper,scribble,cut. Schnitte, Bildunterschriften, Tags, Bildschirme und Puppen mit einemsounderhalten ihre automatisch.
Die letzte Karte
end: len, bg (eine bemalte Wand in 9:16), wordmark (wordmarkY, wordmarkWidth), name (nameY, nameSize), line (lineY), note auf einem Papierschnipsel (noteX, noteY), cta auf einer Pille (ctaY), und puppets wie bei einer Aufnahme (das Produkt in einer Hand, das von der Kante hereingleitet, die Figur, Sterne). Jedes hat eine …At-Zeit.
Felder
| Feld | Erforderlich | Anmerkungen |
|---|---|---|
reel | ja | Pfad zu einer Videodatei, relativ zur JSON-Datei — jeder Clip-Aufnahme in einen einzigen stillen 9:16-Film geschnitten von scripts/reel.mjs (reel.mp4) |
shots | ja | Liste von 2–10 Einträgen: clip, from, to, speed, hold, still, len — der Film in Reihenfolge: Clip-Aufnahmen (ein KI-Clip eines Ihrer Standbilder) und Standbild-Aufnahmen (ein Standbild mit einer langsamen Bewegung); siehe SKILL.md, Aufnahmen |
end.bg | nein | Pfad zu einem Bild, relativ zur JSON-Datei — der Hintergrund der letzten Karte: eine bemalte Wand oder ein Hintergrund aus Ihren Fotos, 9:16 |
end.wordmark | nein | Pfad zu einem Bild, relativ zur JSON-Datei — Ihr Wortmarke auf transparentem Hintergrund (scripts/generate.mjs wordmark) |
end.name | nein | Text, unter 4 Wörtern — der Produktname, handgeschrieben auf der letzten Karte |
end.line | nein | Text, unter 6 Wörtern — eine kurze Zeile unter dem Namen, z. B. die Geschmacksrichtungen |
end.note | nein | Text, unter 4 Wörtern — auf einem zerrissenen Papierschnipsel, z. B. „Halloween limited“ |
end.cta | nein | Text, unter 12 Wörtern |
music | nein | Pfad zu einer Audiodatei, relativ zur JSON-Datei — der Soundtrack von scripts/sfx.mjs (stage.m4a) |
palette | nein | Farben als #RRGGBB; Schlüssel: ink (Bildunterschriften und dunkle Tags), paper (die Papierschnipsel und helle Tags) und accent (die CTA-Pille) |
Tipps
- Schreiben Sie die Clip-Prompts eng: ein oder zwei kleine Aktionen, ein ausdrucksloses Gesicht, „der Becher bleibt aufrecht und still, Etikett zur Kamera“. Große Gesten verwischen Gesichter und Etiketten.
- Kling wählt sein eigenes Timing: beobachten Sie, wo die Aktion endet, und setzen Sie den Klick, den Schnitt und die Puppen auf dieses Bild, nicht auf eine runde Zahl.
- Geben Sie der Geschichte einen Reisenden: eine Puppe, die aus einem Foto ausgeschnitten ist und in den nächsten Aufnahmen wieder auftaucht, verbindet sieben Standbilder zu einem Film.
- Schneiden Sie Puppen aus den Fotos selbst aus, nicht aus neuer Kunst: dieselbe Farbe, dasselbe Papier und dasselbe Licht lassen sie dazugehören.
- Halten Sie Bildunterschriften auf drei oder vier Wörter; die Bilder erzählen den Großteil.
Ausgabe
H.264 MP4, 1080 × 1920, 30 fps (das Bild bewegt sich in 12 Schritten pro Sekunde), 15–20 Sekunden mit Ton, plus ein Standbild als Vorschaubild (PNG).