Make rendering failure-safe and project editing reproducible

This commit is contained in:
Mikei386
2026-09-13 09:20:37 +02:00
parent c530fe025a
commit 73961f6afe
13 changed files with 1019 additions and 212 deletions
+21 -8
View File
@@ -38,7 +38,7 @@ Das Skript baut im Release-Modus für die Architektur des ausführenden Macs und
3. Ausschnittlänge, Ziellänge und Übergang festlegen. Standard: 8 Sekunden Quelle, 1,5 Sekunden pro Ergebnisclip, 0,6 Sekunden Überblendung und 30 FPS. Die Übergangslänge muss kleiner als die Ziellänge sein; 0 bedeutet einen harten Schnitt.
4. Ausgabeformat, Encoder und optionale Stabilisierung/Gesichtsausrichtung wählen. Unterstützt sind 1920×1080, 1080×1920 oder die Abmessungen des ersten Videos. Für H.264 stehen CPU (`libx264`) und VideoToolbox zur Auswahl. Audio wird standardmäßig entfernt.
5. „Render starten“ wählen. Fortschritt und Log erscheinen in der App; „STOP“ bricht die Verarbeitung ab.
6. In der Clip-Nachbearbeitung Segmentstarts oder Varianten ändern und „Änderungen neu rendern“ wählen. „Projekt laden“ öffnet eine gespeicherte Projektdatei.
6. Mit „Ergebnis ansehen“ das fertige Video direkt in der App prüfen. In der Clip-Nachbearbeitung Segmentstarts oder Varianten ändern und „Änderungen neu rendern“ wählen. Diese Aktion erhält gewählte Ausschnitte. „Segmente neu planen“ berechnet alle Ausschnitte mit aktueller Länge, Mitte/Offset und automatischer Segmentwahl neu; manuelle Ausschnitte werden erst nach erfolgreichem Rendern ersetzt. Die globale Variantenwahl gilt für einen neuen Import; vorhandene Varianten werden pro Clip gewechselt. „Projekt laden“ stellt die gespeicherten Render-Einstellungen wieder her.
Die automatische Segmentwahl sucht nach geeigneten Gesicht-/Augenaufnahmen. Gesichtsausrichtung und Stabilisierung sind heuristisch und sollten anhand des Ergebnisses geprüft werden.
@@ -49,12 +49,14 @@ Neben `Ergebnis.mp4` können folgende Dateien entstehen:
| Datei | Zweck |
| --- | --- |
| `Ergebnis.growthlapse-project.json` | Quellen, Ausschnitte, Varianten und Cache-Verweise |
| `Ergebnis.growthlapse-cache/` | Zwischenclips für die Nachbearbeitung |
| `GrowthLapse-<UUID>.growthlapse-cache/` | Eigener Arbeitsbereich mit Zwischenclips und Eigentumsmarkierung |
| `Ergebnis.growthlapse-report.txt` | Render-Protokoll |
„Ergebnis bestätigen“ löscht den Projekt-Cache. Fehlende Zwischenclips werden beim erneuten Rendern neu erzeugt; die Quelldateien müssen weiterhin vorhanden sein. Ein neuer Render mit demselben Ausgabeziel setzt dessen Review-Cache zurück und kann die vorhandene Ausgabe überschreiben.
Im Menü „Projekt“ löscht „Render-Cache löschen“ ausschließlich einen von der neuen Version markierten Cache. Historische, unmarkierte Cache-Verzeichnisse bleiben erhalten und können nach Prüfung im Finder entfernt werden. Fehlende Zwischenclips werden beim erneuten Rendern neu erzeugt; Quellen müssen weiterhin vorhanden sein.
Projekte verwenden absolute Dateipfade und sind daher nicht ohne Anpassung zwischen Rechnern verschiebbar. Die globalen Einstellungen liegen unter `~/Library/Application Support/GrowthLapse/settings.json`. „Defaults“ setzt sie zurück. Projektdateien ersetzen keine vollständige Sicherung der globalen Render-Einstellungen.
Jeder Render schreibt in einen eigenen Arbeitsbereich und kopiert verwendbare Cache-Clips dorthin. Die vorhandene Ausgabe und ihr Cache bleiben während des Renders erhalten. Erst nach erfolgreichem Rendern werden Video und Projektdatei übernommen; bei einem Fehler während der Übernahme wird eine Wiederherstellung versucht. Das ist keine absturzsichere Transaktion über mehrere Dateien. Der alte, markierte Cache desselben Ausgabeziels wird erst nach Erfolg entfernt. „Speichern unter“ auf ein anderes Ausgabeziel erhält das ursprüngliche Projekt und dessen Cache.
Projekte enthalten Render-Einstellungen und absolute Dateipfade. Sie sind daher nicht ohne Anpassung zwischen Rechnern verschiebbar. Die lokalen Werkzeugpfade bleiben beim Laden unverändert. Ältere Projekte ohne gespeicherte Einstellungen zeigen einen Hinweis und verwenden die aktuellen Werte. Die globalen Einstellungen liegen unter `~/Library/Application Support/GrowthLapse/settings.json`; „Defaults“ setzt sie zurück.
## Entwicklung und Prüfung
@@ -64,7 +66,15 @@ Für die XCTest-Tests ist eine vollständige Xcode-Installation mit ausgewählte
swift test
```
Die Tests prüfen neutrale Startwerte, die JSON-Speicherung und die Kompatibilität älterer Einstellungen. Sie ersetzen keine Prüfung der Videoausgabe.
Die XCTest-Tests prüfen neutrale Startwerte, JSON-Speicherung und die Kompatibilität älterer Einstellungen.
Für Integrationstests genügt die Command-Line-Tools-Umgebung mit FFmpeg und FFprobe:
```sh
bash scripts/integration-tests.sh
```
Dieser Test baut einen eigenen Test-Einstieg mit den produktiven Render-Klassen, erzeugt synthetische Videos und prüft unter anderem Speichern/Laden, Cache, Tonspuren, Überblendungen, Endausgabe-Fehler, Wiederherstellung und Abbruch. Er verändert keine persönlichen Einstellungen. Testdateien werden automatisch entfernt; mit `GROWTHLAPSE_KEEP_TEST_OUTPUT=1` bleiben sie zur Kontrolle erhalten.
Für einen manuellen Funktionstest zwei kurze Videos in einen separaten Testordner legen und ein neues Ausgabeziel wählen. Zunächst ohne Stabilisierung und ohne Übergang rendern, danach mit Überblendung und den gewünschten Filtern. Ergebnis abspielen, einen Segmentstart ändern, erneut rendern, Projekt laden und Abbruch während eines weiteren Renders prüfen.
@@ -73,7 +83,8 @@ Für einen manuellen Funktionstest zwei kurze Videos in einen separaten Testordn
| `GrowthLapseApp.swift` | App-Einstieg und Fensterlebenszyklus |
| `ContentView.swift` | Einstellungen, Vorschau und Clip-Nachbearbeitung |
| `RenderSettings.swift` | Datenmodelle und persistierte Einstellungen |
| `FFmpegService.swift` | Werkzeugsuche und asynchrone Prozessausführung |
| `FFmpegService.swift` | Werkzeugsuche, Encoder-Prüfung und abbrechbare Prozessausführung |
| `RenderWorkspace.swift` | Isolierte Arbeitsverzeichnisse, sichere Cache-Löschung und Übernahme der Ausgabe |
| `VideoProcessor.swift` | Videoanalyse, Render-Pipeline, Cache und Gesichtserkennung |
Alle genannten Swift-Dateien liegen unter `Sources/GrowthLapse/`.
@@ -81,9 +92,11 @@ Alle genannten Swift-Dateien liegen unter `Sources/GrowthLapse/`.
## Bekannte Grenzen
- Foto-Morphing ist im Quellcode enthalten, aber derzeit deaktiviert.
- Verfügbare FFmpeg-Filter und Encoder hängen von der lokalen Installation ab. Wenn VidStab fehlt, wird Deshake versucht; ohne passenden Filter Stabilisierung deaktivieren oder einen geeigneten Build verwenden.
- Verfügbare FFmpeg-Filter und Encoder hängen von der lokalen Installation ab. Wenn VidStab fehlt, wird vorhandenes Deshake verwendet; ohne passenden Filter endet die Vorabprüfung mit einer klaren Fehlermeldung.
- Gesichtserkennung garantiert keine passende Ausrichtung für jede Aufnahme.
- Automatische Tests für die vollständige Render-Pipeline fehlen bislang.
- Synthetische Tests decken zentrale Renderpfade ab; eine Qualitätsprüfung mit realen Gesichts-, HDR- und langen Videos bleibt erforderlich.
- Im Repository ist bisher keine Lizenz festgelegt.
Weitere technische Befunde stehen in [docs/ANALYSE.md](docs/ANALYSE.md).
Die Änderungen der Zuverlässigkeitsüberarbeitung sind in [docs/VERBESSERUNGEN.md](docs/VERBESSERUNGEN.md) dokumentiert.