- Offizieller Beitrag
Anhang entfernt. Neue Version 0.2
In Videos verpixeln hatte ich angekündigt, dass ich eine GUI zum Verpixeln schreiben wollte. Falls es jemand gebrauchen kann, hier der erste Entwurf.
Die Idee
Aus datenschutzrechtlichen Gründen sollen Kennzeichen und/oder Gesichter in Videos vor einer Veröffentlichung unkenntlich gemacht werden. Dazu werden mit Avisynth verschiedene Masken auf das Bild gelegt und die entsprechenden Bildteile verdeckt.
Hintergrund
Avisynth ist ein scriptbasierter Frameserver. Ein Frameserver lädt Dateien, welche Video-, Audio- und/oder Bilddaten enthalten und gibt sie an andere Programme zur Weiterverarbeitung weiter. Das Script ist ein einfacher Text, welcher in einer ebenso einfachen Textdatei mit der Dateiendung .avs gespeichert ist. Mit Hilfe dieses Scriptes ist es möglich, Bild- und Tondaten mit Hilfe von Filtern in vielfältiger Art und Weise zu bearbeiten. In der Regel wird Avisynth zur Verbesserung von Video- und Bildmaterial verwendet.
Vorbereitung
Um Zensor verwenden zu können, muss Avisynth installiert sein. Zensor selbst ist eine portable Anwendung. Das bedeutet, es muss nicht installiert sondern nur entpackt werden, wobei das Programm Schreibrechte für sein Verzeichnis benötigt. In dieses wird eine INI-Datei und das temporäre Avisynth-Script gespeichert.
Was kann Zensor?
Zensor stellt im Tab "Avisynth-Script" ein Grundgerüst für das Avisynth-Script zur Verfügung. In dieses fügt es ein vom Anwender ausgewähltes AVI-Video ein. Auf dem Tab "Editor" wird das Originalvideo mit Hilfe von Avisynth angezeigt und der Anwender kann eine größenveränderliche Maske auf dem Bild positionieren. Das heißt, der Anwender sucht das erste und letzte Bild für die Maskierung aus. Dabei kann die Maske nur linear bewegt und noch nicht in der Größe geändert werden. Die Daten werden zunächst in eine Maske und später in das Script eingetragen. Das Script muss derzeit noch nachbearbeitet werden. Im Tab "Zensor" lässt sich die Wirkung des Scriptes kontrolliert werden.
Nachbearbeitung
Das Grundgerüst des Avisynth-Scriptes sieht so aus:
###=== Das zu verpixelnde Video. ======================
MyVideo = AviSource("Über den Button links oben laden.")
###=== Einfügen der Maske. ============================
### Die Variablen:
### - clip Das Video auf das die Funktion angewandt werden soll.
### - start_frame, end_frame Das erste und das letzte Bild. Sie dürfen nicht identisch sein.
### - start_x, start_y Die obere linke Ecke der Maske im ersten Bild.
### - end_x, end_y Die obere linke Ecke der Maske im letzten Bild.
### - start_h, start_w Die Höhe und Breite der Maske im ersten Bild.
### - start_h, start_w Die Höhe und Breite der Maske im letzten Bild.
function MyAnimate(clip "clip", int "start_frame", int "end_frame", int "start_x", int "start_y", int "end_x", int "end_y", int "start_h", int "start_w", int "end_h", int "end_w")
{
masc = BlankClip(height = start_h, width = start_w, color=$000000)
return ApplyRange(Clip, start_frame, end_frame, "Animate", start_frame, end_frame, "Overlay", masc, start_x, start_y, masc, end_x, end_y)
}
###=== Platz für Einzelbefehle. =======================
### Beispiel:
### a = MyAnimate(MyVideo, 0, 13, 50, 350, 0, 380, 40, 120, 40, 120) # Funktion wird auf MyVideo von Bild 0 bis 13 angewandt. Maske wandert von 50, 350 nach 0, 380.
### b = MyAnimate(a, 12, 31, 265, 330, 100, 400, 40, 120, 40, 120) # Funktion wird auf a angewandt. Die Maskengröße beträgt unverändert 40 * 120.
### MyAnimate(b, 240, 276, 1055, 427, 1060, 450, 40, 120, 40, 120) # Funktion wird auf b angewandt. Es gibt keine linke Seite, so dass das Ergebnis angezeigt wird.
###=== Fake ===========================================
MyAnimate(MyVideo, 0, 50, 100, 100, 400, 200, 40, 120, 400, 600)
MyAnimate(<Letzter Clip>, 0, 1073, 407, 110, 896, 386, 57, 120, 57, 120)
Alles anzeigen
Das Script enthält viele Kommentaren und ein paar Anweisungen. Alle Kommentare beginnen mit dem Zeichen '#'. Es besteht aus drei Teilen:
###=== Das zu verpixelnde Video. ======================
MyVideo = AviSource("Über den Button links oben laden.")
Hier wird der Variablen MyVideo das Video zugewiesen. Wie dem Text zu entnehmen ist, soll dazu der Button links über dem Script verwendet werden. Das ausgewählte AVI wird in das Script eingetragen.
Es wäre auch die Einbindung von Quicktime (.mov) und MPEG (.mpg) möglich.
###=== Einfügen der Maske. ============================
### Die Variablen:
### - clip Das Video auf das die Funktion angewandt werden soll.
### - start_frame, end_frame Das erste und das letzte Bild. Sie dürfen nicht identisch sein.
### - start_x, start_y Die obere linke Ecke der Maske im ersten Bild.
### - end_x, end_y Die obere linke Ecke der Maske im letzten Bild.
### - start_h, start_w Die Höhe und Breite der Maske im ersten Bild.
### - start_h, start_w Die Höhe und Breite der Maske im letzten Bild.
function MyAnimate(clip "clip", int "start_frame", int "end_frame", int "start_x", int "start_y", int "end_x", int "end_y", int "start_h", int "start_w", int "end_h", int "end_w")
{
masc = BlankClip(height = start_h, width = start_w, color=$000000)
return ApplyRange(Clip, start_frame, end_frame, "Animate", start_frame, end_frame, "Overlay", masc, start_x, start_y, masc, end_x, end_y)
}
Alles anzeigen
Dies ist die Funktion, mit welchem ein schwarzer rechteckiger Fleck an einer bestimmten Stelle im Video gezeichnet wird. Darin muss nichts verändert werden. Die Kommentare erläutern, welche Variablen der Funktion übergeben werden müssen.
###=== Platz für Einzelbefehle. =======================
### Beispiel:
### a = MyAnimate(MyVideo, 0, 13, 50, 350, 0, 380, 40, 120, 40, 120) # Funktion wird auf MyVideo von Bild 0 bis 13 angewandt. Maske wandert von 50, 350 nach 0, 380.
### b = MyAnimate(a, 12, 31, 265, 330, 100, 400, 40, 120, 40, 120) # Funktion wird auf a angewandt. Die Maskengröße beträgt unverändert 40 * 120.
### MyAnimate(b, 240, 276, 1055, 427, 1060, 450, 40, 120, 40, 120) # Funktion wird auf b angewandt. Es gibt keine linke Seite, so dass das Ergebnis angezeigt wird.
###=== Fake ===========================================
MyAnimate(MyVideo, 0, 50, 100, 100, 400, 200, 40, 120, 400, 600)
Der Teil enthält als Kommentar ein Beispiel dafür, wie die Liste der Funktionsaufrufe, welcher der Nutzer mit Hilfe des Editors erstellt, aussehen sollte. Ausserdem gibt es einen Fakeeintrag, mit welchem man sofort im Tab "Zensor" gucken kann, wie sich so ein Aufruf auswirkt.
Mit dem Editor wird zum Beispiel eine derartige Liste erstellt:
MyAnimate(<Letzter Clip>, 0, 13, 150, 350, -40, 380, 40, 120, 40, 120)
MyAnimate(<Letzter Clip>, 6, 11, 265, 330, 240, 330, 40, 120, 40, 120)
MyAnimate(<Letzter Clip>, 12, 36, 240, 330, -50, 385, 40, 120, 40, 120)
MyAnimate(<Letzter Clip>, 46, 56, 80, 360, -80, 390, 40, 120, 40, 120)
MyAnimate(<Letzter Clip>, 56, 76, 155, 350, -80, 410, 40, 120, 40, 120)
MyAnimate(<Letzter Clip>, 44, 60, 340, 300, 300, 325, 40, 120, 40, 120)
MyAnimate(<Letzter Clip>, 61, 80, 300, 325, 200, 340, 40, 120, 40, 120)
MyAnimate(<Letzter Clip>, 81, 102, 200, 340, -60, 400, 40, 120, 40, 120)
MyAnimate(<Letzter Clip>, 123, 135, 130, 370, -80, 430, 40, 120, 40, 120)
MyAnimate(<Letzter Clip>, 130, 151, 190, 360, -30, 405, 40, 120, 40, 120)
MyAnimate(<Letzter Clip>, 151, 161, 300, 340, 220, 350, 40, 120, 40, 120)
MyAnimate(<Letzter Clip>, 162, 179, 220, 350, -40, 435, 40, 120, 40, 120)
MyAnimate(<Letzter Clip>, 215, 217, 580, 480, 710, 440, 40, 120, 40, 120)
MyAnimate(<Letzter Clip>, 218, 221, 820, 420, 1150, 430, 40, 120, 40, 120)
MyAnimate(<Letzter Clip>, 221, 230, 1000, 400, 1055, 448, 40, 120, 40, 120)
MyAnimate(<Letzter Clip>, 231, 240, 1055, 448, 1055, 427, 40, 120, 40, 120)
MyAnimate(<Letzter Clip>, 240, 276, 1055, 427, 1060, 450, 40, 120, 40, 120)
Alles anzeigen
Jede einzelne Zeile würde in diesem Zustand eine Fehlermeldung ergeben. Deshalb ist noch Nacharbeit notwendig. Diese soll Version 0.2 entfallen.
Die Nacharbeit besteht darin, jeweils einen letzten Clip und einen neuen Clip einzutragen. Beim ersten Eintrag soll das Originalvideo bearbeitet werden. Deshalb wird "MyVideo" eingetragen. Für den resultierenden neuen Clip wird eine linke Seite "a = " eingefügt.
Beim nächsen Eintrag soll dem Clip eine weitere Maske hinzugefügt werden:
Dies zieht sich bis zum vorletzten Eintrag. Nur beim letzten Eintrag wird keine linke Seite benötigt.