Kinetic Film zu DaVinci Resolve
Wandelt die spec.js eines kinetischen Films in eine Resolve-Zeitleiste um, in der jede Einstellung ein eigener Clip mit eigenem Fusion-Comp ist: echte Text+- und Text3D-Elemente, keyframed Kameras, das gleiche Beat-Timing. Ein Redakteur kann dann jede Einstellung auf der Fusion-Seite öffnen, ein Wort umschreiben, es trimmen oder die Musik austauschen.
Es handelt sich um einen Nachbau in den Resolve-Werkzeugen, nicht um einen Pixelabgleich. Gib an, was sich gegenüber dem Original geändert hat (setup gibt die Liste als notes zurück), und melde es dem Benutzer.
Bevor du beginnst
- Resolve Studio läuft mit einem geöffneten Projekt. Überprüfe mit
get_resolve_statusund rufeget_whats_neweinmal auf, da der Resolve-Server dies verlangt. - Der Filmordner enthält
spec.jsund die Engine-Dateien, undnpm install playwrightwurde darin ausgeführt. - Python mit Pillow ist außerhalb von Resolve installiert, um die Schriftbreiten zu messen. ffmpeg muss im PATH sein.
Frage den Benutzer
Entscheide dies vor dem Bauen, wenn möglich aus dem Gespräch:
- Welches Projekt. Die Zeitleiste wird zum geöffneten Projekt hinzugefügt. Teile dem Benutzer mit, um welches Projekt es sich handelt. Ein Projektwechsel könnte ungespeicherte Arbeit verlieren lassen, also bitte den Benutzer, zu wechseln, falls es das falsche ist.
- Zeitleistenname. Standard:
<Titel> (Fusion). Sieh dir die vorhandenen Zeitleisten an und wähle einen freien Namen. Verwende niemals eine Zeitleiste wieder, die du nicht in dieser Sitzung erstellt hast. - Schriftart. Text+ sieht nur installierte Schriftarten, und die im Film verwendete Archivo ist meist nicht dabei. Verwende die Markenschriftart, falls das Projekt eine zeigt. Rufe
fonts_available(resolve, 'Lato', 'Inter')auf, um zu prüfen; installiere keine Schriftarten ohne Nachfrage. Schwere Schriftschnitte lesen sich am besten: Black, Heavy, ExtraBold. - Audio. Entweder die Musikbearbeitung einer vorhandenen Zeitleiste (
audio_from_timeline), eine Datei (audio_from_file) oder keine. Wenn eine Zeitleiste diesen Film bereits mit Musik enthält, biete diese zuerst an, da die Bearbeitung des Benutzers erhalten bleibt.
Schritte
SKILL unten ist der Ordner dieses Skills und F der Filmordner. Jeder Resolve-Schritt erfolgt über run_script_unsafe, das auf 60 s pro Aufruf begrenzt ist, und beginnt mit:
SKILL = r'<dieser Skill-Ordner>'; F = r'<Filmordner>'
exec(open(SKILL + r'\scripts\resolve_build.py', encoding='utf-8').read())
1. Exportiere die Spec (in einer Shell):
node "<SKILL>/scripts/export_film.mjs" "<F>"
Schreibt <F>/resolve/film.json und das Logo als transparente PNGs und gibt die gefundenen Blöcke aus.
2. Erstelle die Zeitleiste:
result = setup(resolve, project, F, 'My Film (Fusion)', 'Lato', 'Black', 'Inter', 'Medium')
Die letzten beiden Schriftarten sind für kleine Zeilen und Mock-UI. Es erstellt die Zeitleiste, einen Kinetic Films / <Titel>-Behälter und einen schwarzen Platzhalter-Clip und gibt die Anzahl der Einstellungen sowie notes zurück. Zeitleistengröße und Bildrate stammen aus dem Projekt, sodass ein mit 60 fps erstellter Film auf eine 30-fps-Zeitleiste landen kann. Es ist nur für 1920x1080, 60 fps getestet – überprüfe andere Formate genau.
3. Messe die Schrift (in einer Shell mit Python, das Pillow hat):
python "<SKILL>/scripts/measure_fonts.py" "<F>" Lato Black
Ohne diesen Schritt werden Wortbreiten geschätzt und füllen das Bild möglicherweise nicht gut aus. Wenn kein Schriftartdatei gefunden wird, fahre fort und prüfe die Rahmung genau.
4. Baue. Wiederhole, bis done wahr ist; es setzt dort fort, wo es aufgehört hat:
result = build_batch(project, F, 40)
Füge dann das HUD (nur wenn der Film eines hat), das Audio und die Szenenmarkierungen hinzu:
result = dict(hud=add_hud(project, F), audio=audio_from_timeline(project, F, 'Music Edit'), markers=add_markers(project, F))
Das HUD ist ein einzelner Fusion-Clip auf Spur 2 über den gesamten Film. Ein Redakteur kann diesen Clip deaktivieren, um ihn zu entfernen.
5. Betrachte Einzelbilder. Ab Resolve 21.2 exportiert dies in wenigen Sekunden beschriftete Blätter der Mitte jeder Einstellung direkt aus der Zeitleiste, ohne Rendern und ohne Änderung der Render-Einstellungen. Sie landen in <F>/resolve/review/. Prüfe, dass nichts schwarz ist, Wörter im Bild bleiben, Kicker ihre Wörter freigeben und Bilder das Bild ausfüllen. Behebe Fehler vor dem Rendern. frame_grid(project, F, seconds=[4.2, 9.35]) liefert ausgewählte Momente in voller Größe, z. B. das Ende eines Whips.
result = frame_grid(project, F)
Die Einzelbilder entsprechen einem Render des gleichen Frames (getestet unter Version 21.2). Bei älteren Resolve-Versionen ohne ExportThumbnails gibt es einen Fehler – beurteile stattdessen anhand des Renders.
6. Rendere und messe die Bewegung.
result = start_render(project, F, 'my_film') # wählt einen GPU-H.264-Encoder, wenn vorhanden
# bei späteren Aufrufen: result = wait_render(project, result_job_id, 50)
Erwarte etwa 2 bis 4 Minuten für 30 s bei 1080p60 auf einer starken GPU. Entferne danach nur deinen eigenen Job mit remove_job. Die Warteschlange könnte die Jobs des Benutzers enthalten. start_render ändert die Render-Einstellungen des Projekts – teile dies mit.
Bewegung kann nur aus dem Video gemessen werden. Führe holds.py und dyn.py aus den Skripten von scenario-kinetic-film auf dem Render aus, falls sie installiert sind. Die Ziele: höchstens 40 % Standbilder, kein Halten länger als 0,6 s vor der Endkarte, und eine mediane Bewegung von 2,5 oder mehr. Melde die Zahlen, inklusive Abweichungen.
Um etwas zu ändern, behebe den Fehler und baue mit setup(..., replace=True) neu – nur bei einer Zeitleiste, die dieser Skill erstellt hat – und wiederhole dann die Schritte 4 bis 6. Für eine Korrektur weniger Einstellungen ersetzt rebuild_shots(project, F, [8.2, 13]) nur die Comps der Einstellungen zu diesen Zeitpunkten (in Sekunden) oder nach Einstellungsindex und behält alles andere bei. Falls sich die Wörter des Films geändert haben, führe Schritt 3 erneut aus.
7. Abschließen. Überlasse das Speichern dem Benutzer, es sei denn, er bittet darum: Speichern übernimmt auch alle anderen ungespeicherten Änderungen, die der Benutzer offen hat. Melde den Zeitleistennamen, die Notizen, die Renderzeit und die Prüfzahlen. Erwähne, dass der Platzhalter-Clip in seinem Behälter bleiben muss, da sonst die Einstellungen möglicherweise als offline angezeigt werden.
Was du nicht tun darfst – und warum
Jeder dieser Punkte kostet echte Zeit, um ihn zu finden. Die Details sind in references/fusion-traps.md; lies sie, bevor du fusion_lib.py änderst oder wenn etwas schiefgeht.
- Sperre keinen Comp während des Bauens. Der Clip wird dann schwarz dargestellt. Sperre nur um das Erstellen eines Loaders herum, wie
Shot.loaderes tut; andernfalls öffnet das Setzen des Loader-Clips einen modalen Dateiauswahldialog auf dem Bildschirm des Benutzers, der alle Skriptaufrufe stoppt. - Verwende nicht
ExportCurrentFrameAsStillzur Überprüfung. Es überholt Fusion und liefert schwarze oder veraltete Einzelbilder.frame_grid(mitTimeline.ExportFrameundExportThumbnails) ist zuverlässig, aber nur auf der aktuellen Zeitleiste: Eine nicht geöffnete Zeitleiste exportiert schwarze Einzelbilder, obwohl ein Erfolg gemeldet wird. - Staple keine Bewegungsunschärfe. Unschärfe durch die eigene Bewegung eines Wortes und durch die Kamera vervielfacht die Arbeit. Nur die Kamera wird unscharf, und nur während schneller Bewegungen.
- Gehe nicht davon aus, dass ein schnellerer Encoder ein langsames Rendern behebt. Die Fusion-Bildgenerierung ist meist der Engpass. Messe, bevor du Einstellungen änderst.
Referenz
- references/block-map.md: wie jeder der 14 Blöcke konvertiert wird und was approximiert wird. Lies dies, wenn ein Film Graph, Counters, Progress, Chain, Prompt, Notes oder Rewind verwendet oder der Benutzer fragt, wie nah eine Einstellung am Original sein wird.
- references/fusion-traps.md: API-Verhalten, das auf die harte Tour gefunden wurde, und wie man eine festgefahrene Resolve-Instanz wiederherstellt.