叠帧 · 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
- 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.
- Vorhandene Ausgabe sichern. Falls
<ordner>/cover.mp4bereits existiert, wird es vor dem Rendern incover.prev-JJJJMMTT.mp4umbenannt. Niemals die frühere Ausgabe des Benutzers stillschweigend überschreiben. - 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.
- Ü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).
- 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 Bild | Befehl | 20 Bilder | 44 Bilder | 200 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 werdenlogo.jpg,discord.jpg,cover.jpgausgeschlossen. - Sortierung nach ganzzahligem Wert, nicht lexikografisch (
2.jpgvor10.jpg,99.jpgvor100.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 fillnur, 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,
--outohne--forcezu ü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 unterC:/oderD:/ffmpeg) vor jedem.cmd-Shim, weil der Shim über cmd.exe leitet und die Befehlszeile auf ~8k Zeichen begrenzt. Überschreiben mitFFMPEG=/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 mitCannot allocate memoryversagt;--chunkhier 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 erhieltPermission deniedundos.listdirwarfWinError 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.