Communitygithub.com

LiliLIN0324/imgseq-cover-video-skill

Erstellt ein MP4-Cover-/Teaser-Video aus einem Ordner mit nummerierten Standbildern (01.jpg, 02.jpg, ... bis 200 und mehr). Nützlich, wenn der Benutzer einen Ordner mit nummerierten Bildern in ein Video umwandeln, eine Bildershow oder Diashow erstellen, weiche Überblendungen zwischen Bildern einfügen oder ein „Cover“-Video aus JPGs exportieren möchte – nicht nummerierte Bilder wie logo.jpg, discord.jpg oder cover.mp4 werden ignoriert.

Was ist imgseq-cover-video-skill?

Diese Fähigkeit wandelt einen Ordner mit ausschließlich numerisch benannten Standbildern (z. B. 01.jpg, 200.jpg) in ein H.264-MP4-Cover- oder Teaser-Video um. Sie eignet sich besonders für Entwickler und KI-Agenten, die schnell eine Bildershow mit weichen Überblendungen (Crossfade) oder harten Schnitten erstellen möchten, ohne manuell komplexe ffmpeg-Befehle zusammenzustellen. Unterstützt werden die Plattformen Claude Code, Cursor und Codex – das Skill-Skript läuft auf Windows, macOS und Linux. Der Kern des Workflows: Das Skill durchsucht den Zielordner nach Dateien, deren Name nur aus Ziffern besteht (regex: `^\d+\.(jpe?g|png|webp)$`), sortiert sie numerisch und erzeugt mit dem eingebundenen Python-Skript (`imgseq2mp4.py`) ein Video mit einer Seitenlänge von 0,8 s pro Bild und einem 0,2 s langen Crossfade. Vor der Ausgabe wird eine vorhandene `cover.mp4` unter einem Zeitstempel gesichert. Nach der Erstellung führt das Skill automatisch eine Qualitätskontrolle durch: Es prüft Dauer, Bildanzahl und auf schwarze Frames, vergleicht das letzte Frame mit dem letzten Quellbild und validiert die Überblendung. Die Standardauflösung ist 1920×1080, die Bittiefe CRF 18, und das Video wird mit `+faststart` für schnelles Streaming optimiert. Das Skill beachtet wichtige Produktionsregeln: Es verwendet ausschließlich Crossfade-Überblendungen (keine Wipe- oder Schiebeblenden), behält die Originalfarben durch korrekte Konvertierung in den limited-range BT.709-Farbraum und überschreibt keine vorhandenen Dateien ohne Sicherung. Die Geschwindigkeit lässt sich über die Parameter `--seconds` und `--transition-seconds` anpassen. Bei vielen Bildern (z. B. 200) wird die Renderarbeit in Chunks von 6 Bildern aufgeteilt, um Speicherprobleme zu vermeiden. Eine maschinenspezifische Besonderheit: ffmpeg wird nicht über den PATH gefunden, sondern über einen bevorzugten Pfad unter `~/.dsh/tools/ffmpeg/**/ffmpeg.exe` oder `C:/.../ffmpeg`. Der Arbeitsordner wird zudem auf Schreibberechtigung geprüft, um Sandbox-Probleme unter Windows zu umgehen.

Funktioniert mit~Claude Code~Codex CLI~Cursor
npx skills add LiliLIN0324/imgseq-cover-video-skill

In Ihrer bevorzugten KI fragen

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

Dokumentation

叠帧 · Nummerierte Standbilder → Cover-Video

Übersicht

Durchsucht einen Ordner, behält nur Dateien, deren Stammname ausschließlich aus Ziffern besteht (01.jpg, 200.jpg), spielt sie in numerischer Reihenfolge ab und kodiert ein H.264-MP4. Zwischen den Bildern erfolgt entweder ein harter Schnitt (--transition none) oder ein Crossfade (--transition fade, Standard). Nicht nummerierte Bilder (logo, discord, …) und vorhandene Videos werden ignoriert.

Vorgehen

  1. Ordner zuerst inspizieren. Dateien auflisten und die Abmessungen eines Bildes mit ffprobe ermitteln. Notieren, wie viele nummerierte Standbilder vorhanden sind und ob die Seitenverhältnisse gemischt sind.
  2. Vorhandene Ausgabe sichern. Falls <ordner>/cover.mp4 bereits existiert, wird es vor dem Rendern in cover.prev-JJJJMMTT.mp4 umbenannt. Niemals die frühere Ausgabe des Benutzers stillschweigend überschreiben.
  3. Rendern mit dem gebündelten Skript:
python "<skill-verz>/scripts/imgseq2mp4.py" --dir "<ordner>" --out cover.mp4

Standardwerte: 0,8 s pro Bild mit 0,2 s fade-Crossfade, 30 fps, 1920×1080, Letterbox-Padding, CRF 18, kein Audio, +faststart.

  1. Überprüfen, nicht annehmen. Dauer/Bildanzahl ermitteln, keine schwarzen Frames bestätigen und das letzte Frame mit dem letzten Quellbild vergleichen:
ffprobe -v error -show_entries format=duration -show_entries stream=nb_frames -of default=nw=1 cover.mp4
ffmpeg -i cover.mp4 -vf blackdetect=d=0.05:pix_th=0.10 -an -f null -
ffmpeg -y -sseof -0.05 -i cover.mp4 -frames:v 1 frame_last.png

Wenn Überblendungen aktiviert sind, zusätzlich ein Frame innerhalb des ersten Überblendungsfensters erfassen und prüfen, dass es eine Mischung ist (näher an Bild 2 als ein harter Schnitt wäre, aber dennoch messbar von beiden Quellen verschieden).

  1. Berichten: Bildanzahl, ignorierte Bilder, Gesamtdauer, Ausgabepfad und -größe.

Tempo

Gesamtlänge = n × sekunden − (n−1) × transition_sekunden. Die sichtbare Standzeit jedes Bildes ist sekunden − transition_sekunden; dieser Schritt, nicht --seconds, wird vom Betrachter wahrgenommen.

Schritt pro BildBefehl20 Bilder44 Bilder200 Bilder
0,35 s--seconds 0.5 --transition-seconds 0.15~8 s~18 s~75 s
0,45 s--seconds 0.65 --transition-seconds 0.2~9 s~22 s~95 s
0,60 s (Standard)--seconds 0.8 --transition-seconds 0.2~12 s~27 s~120 s
0,80 s--seconds 1.0 --transition-seconds 0.2~16 s~34 s~150 s

Harte Schnitte verwenden --transition none --seconds <schritt>.

Bei Wünschen nach schnellerem oder langsamerem Tempo immer nur eine Zeile weitergehen. --transition-seconds zwischen 0,15–0,2 belassen; längere Werte wirken eher wie eine Diashow statt einem Crossfade.

Regeln

  • Nur Crossfade. Keine Schiebe-, Wisch- oder anderen Push-Überblendungen – diese wurden als Richtung abgelehnt.
  • Auswahl mit Regex ^\d+\.(jpe?g|png|webp)$ – der Dateiname darf nur aus Ziffern bestehen. Dadurch werden logo.jpg, discord.jpg, cover.jpg ausgeschlossen.
  • Sortierung nach ganzzahligem Wert, nicht lexikografisch (2.jpg vor 10.jpg, 99.jpg vor 100.jpg). Lücken in der Nummerierung sind in Ordnung; fehlende Nummern sind keine Fehler.
  • --fit pad (Standard) verwenden, sodass das gesamte Bild sichtbar bleibt. --fit fill nur, wenn der Benutzer explizit randloses Zuschneiden wünscht.
  • Ausgabe ist stumm. Keine Musik hinzufügen, es sei denn, der Benutzer liefert eine Spur.
  • Farben unverändert lassen. JPEGs sind Vollbereich; wenn man sie als unmarkiertes Vollbereich-H.264 kodiert, dekodieren die meisten Player als eingeschränkten Bereich, und das Ergebnis wirkt heller und ausgewaschen (+10 Stufen). Das Skript konvertiert in den eingeschränkten Bereich bt709 und markiert ihn – diese Kette nicht „vereinfachen“.
  • Das Skript weigert sich, --out ohne --force zu überschreiben; löse dies durch Sichern, nicht durch blindes Erzwingen.

Maschinennotizen

  • ffmpeg ist nicht im PATH. Das Skript bevorzugt eine echte ffmpeg.exe (~/.dsh/tools/ffmpeg/**/ffmpeg.exe, dann Kopien unter C:/ oder D:/ffmpeg) vor jedem .cmd-Shim, weil der Shim über cmd.exe leitet und die Befehlszeile auf ~8k Zeichen begrenzt. Überschreiben mit FFMPEG=/pfad/zu/ffmpeg.
  • Dieser Build hat kein -filter_complex_script; das xfade-Diagramm inline über -filter_complex übergeben (das Skript tut dies bereits).
  • Überblendungen werden in Gruppen von --chunk (Standard 6) gerendert und dann zusammengeführt, sodass maximal 6 Decoder gleichzeitig offen sind. Ein einzelner 44-Eingangs-xfade-Durchlauf hat bei 16 GB RAM (~2,4 GB frei) den Arbeitsspeicher erschöpft und mit Cannot allocate memory versagt; --chunk hier nicht über ~8 erhöhen. Die Gruppierung rekursiert, sodass 200 Bilder in drei Stufen ohne OOM zusammengeführt werden.
  • Zwischenstufendateien werden mit CRF 14 / veryfast kodiert und verworfen; nur der letzte Durchlauf verwendet --crf / medium.
  • Zwischenbilder benötigen ein beschreibbares Verzeichnis. tempfile.mkdtemp()-Ergebnisse können in eingeschränkten Sandboxes unzugänglich sein (beobachtet unter Windows + DSH: ffmpeg erhielt Permission denied und os.listdir warf WinError 5). Das Skript erstellt daher ein einfaches Verzeichnis, prüft auf Schreibberechtigung und fällt zurück über $IMGSEQ_WORKDIR → System-Temp → <ausgabe-verz>/.imgseq-work.

Ressourcen

  • scripts/imgseq2mp4.py – Auswahl, numerische Sortierung, Rendern mit hartem Schnitt oder Crossfade, verifizierungsfreundliche Zusammenfassung.

Verwandte Skills