Im Projekt Still-Moving geht es darum, aus einem Video ein Bild mit Langzeitbelichtungseffekt zu erstellen.
Dazu wird das Video mit in Einzelbilder zerlegt und diese Einzelbilder zu einem Bild mit Langzeitbelichtungseffekt zusammengefügt.
Dafür stehen mehrere Optionen zur Verfügung:
Bun als Runtime mit Elysia als Framework für das Backend sowie Vue.js für das Frontend.
In /adr sind grundlegende Architektur-Entscheidungen dokumentiert.
Hier ist auch eine CONTRIBUTING Datei zu finden, in der Richtlinien für die Mitarbeit am Projekt festgehalten sind.
Die Website dieses Repos bietet eine (langsame) Version des Projekts an. Die Zugangsdaten sind:
webtech
2024
Ich empfehle jedoch die lokale Ausführung, da der Server sehr schnell in die Knie geht und nicht für eine Compute intensive Anwendung wie diese ausgelegt ist.
Das Projekt kann ganz einfach mit Docker compose gestartet werden.
Mit docker compose up
wird das Projekt gebaut und gestartet. Der Server ist dann unter http://localhost:3000 erreichbar.
Die erstellten Projekte werden in einem Volume gespeichert, sodass sie auch nach einem Neustart des Containers noch verfügbar sind.
Um das Projekt nativ auszuführen, muss Bun installiert sein.
bun install
Hinweis: Mit Bun 1.1.27 (der aktuellen Version at the time of writing) kann es zu einem Installationsfehler kommen. In der vorheringen Version 1.1.26 funktioniert die Installation jedoch einwandfrei. Wie spezifische Versionen installiert werden können wird hier beschrieben.
bun start
Baut das Frontend und startet den Server welcher dann unter http://localhost:3000 verfügbar ist.
Für Hot-Reloads und Entwicklung kann das Projekt mit folgenden Befehlen gestartet werden:
bun serve
welches folgendes ausführen wird um in den beiden Workspaces frontend
und backend
jeweils das dev
Skript zu starten:
bun run --filter "*" dev
Hierbei wird das Vue Frontend im Watch-Modus gebaut und das Backend mit Hot-Reloading gestartet damit Änderungen direkt sichtbar sind.
Auch hier ist der Server unter http://localhost:3000 erreichbar.
Hinweis: Das Prozessmanagement von Bun auf Windows ist noch nicht besonders optimiert für solche lang lebenden hot-reload Prozesse, wenn die
--filter
workspace option genutzt wird. Es kann also gerade beim Frontend zu memory leaks und orphaned Prozessen kommen, die auch dann nicht gestoppt werden, wenn der Hauptprozess beendet wurde.Check your taskmanager if your laptop takes of like a jet engine, you're wellcome :D
Die Module können auch einzeln ohne Bun's workspace management gestartet werden.
Das hilft ein wenig gegen die Memory Leaks und Orphaned Prozesse, die durch das hot-reload und watch Modus entstehen.
Hot reloads und Entwicklung:
bun frontend:serve
Hot reloads und Entwicklung:
bun backend:serve
Nur ausführen:
bun backend:start
Wichtig: Damit das Frontend funktioniert, muss zuerst mit
bun frontend:build
das Frontend gebaut werden!
Dieses Bild zeigt die Struktur des Projekts und wie die Module miteinander interagieren. Grundsätzlich sind hier die wichtigsten Ordner abgebildet. Der jeweilige Inhalt wird formlos skizziert, um einen Überblick über die Struktur zu geben.
"Still-Moving" besteht aus zwei Hauptteilen bzw. Softwaremodulen:
Die roten Elemente stellen die wichtigsten npm-Dependencies dar, die in den jeweiligen Modulen genutzt werden.
Zudem liegt im Root des Projekts ein Ordner namens projects, in dem die erstellten Projekte gespeichert werden. Die Projekte werden in Unterordner abgelegt, dessen Struktur wird im Diagramm dargestellt. Die Unterordner enthalten folgende Dateien:
thumbnail.webp
des Projekts (der erste Frame des Videos) und das fertige Bild mit Langzeitbelichtungseffekt, als auch Dateien aus Zwischenschritten, wenn die "Focus Frames" Funktionalität genutzt wird.Zum Zerlegen des Videos in Einzelbilder wird das CLI Tool ffmpeg genutzt.
Die Einzelbilder werden dann mit sharp, einer Image Library, bearbeitet und zu einem Bild mit Langzeitbelichtungseffekt zusammengefügt. Die von sharp bereitgestellten Blend Modes reichen jedoch leider nicht aus, um den gewünschten Effekt zu erzielen (werden aber dennoch als Option zur Verfügung gestellt), daher wurde ein eigener "mean" Blend Mode implementiert. Dieser berechnet den Mittelwert der Pixelwerte der Einzelbilder und fügt sie so zusammen. Er respektiert dabei auch die Transparenz der Pixel für einen "weighted mean" sodass die "Focus Frames" mit variierender Stärke über das finale Bild gelegt werden können.
Zum Modul Web Technologien gibt es ein begleitendes Projekt.
Inhaltlich ist geht es dort um eine Client-Server Anwendung, mit deren Hilfe Bilder mit Langzeitbelichtung sehr einfach nachgestellt werden können.
Warum ist das cool? Bilder mit Langzeitbelichtung sind gar nicht so einfach zu erstellen, vor allem, wenn man möglichst viel Kontrolle über das Endergebnis haben möchte. In unserem Ansatz bildet ein Film den Ausgangspunkt. Diesen zerlegen wir in Einzelbilder und montieren die Einzelbilder mit verschiedenen Blendmodes zu einem Bild mit Langzeitbelichtungseffekt zusammen.