Hoko. Es ist nicht schwer. Als Einstieg: Avisynth installieren, #11 folgen, mit den Zahlen in der letzen Zeile spielen und im Tab Zensor gucken was passiert.
Beiträge von Frank
-
-
... Kannst du das bitte mal so erklären als wenn ich nen 6jähriges kind wäre? vermutlich nicht möglich
Sicher ist das möglich. Da muss ich nur an meinen Nachbarn denken.In Videos verpixeln hatte ich angekündigt, dass ich eine GUI zum Verpixeln schreiben wollte. Falls es jemand gebrauchen kann, hier der erste Entwurf. Er ist natürlich noch nicht ausgereift, aber hoffentlich nicht zu grün. Die Größenänderung der Maske funktiniert noch nicht. Voraussetzungen sind ein installiertes Avisynth, ein Encoder, den man mit dem Avisynth-Script füttern kann und ein wenig Eigenarbeit.
Voraussetzung: Ein installiertes Avisynth.Ist Avisynth nicht installiert werdet Ihr kein Video zu sehen bekommen.
Habt Ihr Avisynth installiert, das machen, was in #11 steht.
Und was bedeuten dann Deine ganzen anderen Beiträge mit den Quellcodes?
Vielleicht wird es mit dem Bild klarer? -
* Programm starten
* Auf Button für ein neues Script (1) klicken.
* Auf den Button für das Video (5) klicken und ein Video auswählen. Im Moment werden nur AVIs geöffnet.
Dann könnt ihr auf dem Tab "Editor" das Originalvideo und auf dem Tab ""Zensor" das Script (Originalvideo plus schwarzes Rechteck) sehen.
-
Um auch die Größe ändern zu können, muss in dem Script die Function MyAnimate ersetzt werden:
Code
Alles anzeigenfunction 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") { function MyMasc(clip "clip", int "pos_x", int "pos_y", int "masc_w", int "masc_h") { masc_h = masc_h - masc_h%2 masc_w = masc_w - masc_w%2 masc = BlankClip(height = masc_h, width = masc_w, color=$000000) Overlay(clip, masc, pos_x, pos_y) } ApplyRange(Clip, start_frame, end_frame, "Animate", start_frame, end_frame, "MyMasc", start_x, start_y, start_w, start_h, end_x, end_y, end_w, end_h) }
Ich überlege, in der nächsten Version die Reihenfolge der Variablen zu ändern. Im Moment ist die Reihenfolge Frames, Position, Größe jeweils Start und End. Ich würde lieber erst alle Start- und dann alle Endvariablen haben. -
Wer das Thema Videos verpixeln bzw darin die Beiträge #45 ff nicht gelesen hat weiß nicht unbedingt etwas mit dieser Banane anzufangen.
Die Idee: Mit Hilfe des scriptbaisierten Frameservers Avisynth sollen aus datenschutzrechtlichen Gründen zum Beispiel Kennzeichen in Videos unkenntlich gemacht werden. Die grafische Benutzeroberfläche soll das Script anzeigen, einen Editor für die Erstellung einzelnen Befehle und eine Vorschau für das Script zur Verfügung stellen. Ist das Script fertig kann das Video damit encodet werden.
Die Banane: Sie stellt das Grundgerüst eines Avisynth-Scriptes zur Verfügung. In dieses Script kann ein Video im AVI-Format und Befehle eingefügt werden. Die Befehle lassen sich mit dem Editor erstellen und bewirken, dass sich ein schwarzes Rechteck in einer bestimmten Größe ab einem bestimmten Bild von einer bestimmten Position linear bis zu einem bestimmten Bild zu einer anderen bestimmten Position bewegt. Die Befehle müssen im Script vom Anwender noch nachbearbeitet werden.
-
Im Tab "Zensor" kann man sich das fertige Video ansehen.
Beim Abspielen der Videos kann das Bild flackern. Das liegt daran, dass die Bilder einzeln mit Avisynth geladen und auf ein Image kopiert werden. Deshalb kann die Abspielgeschwindigkeit auch etwas geringer als die tatsächliche Geschwindigkeit sein.
Wenn andere Videoformate unterstützt werden sollen, bitte ich um entsprechende Informationen und kurze Beispielvideos.
Da nicht alle Kameras eine Bildauflösung von 720 * 1280 haben, bitte ich auch um entsprechende Infos.
Und Hinweise, welche zum Reifen dieser Banane beitragen, sind ausdrücklich erwünscht.
-
Code
Alles anzeigen###=== 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, 2820, 65, 48, 670, 402, 57, 120, 57, 120)
Man kann das Beispiel und den Fake- bzw Dummy-Eintrag löschen. Auf jeden Fall sollten die erstellten Einträge nach dem Muster im Beispiel bearbeitet werden. Das müsste selbsterklärend sein. -
Im Tab Editor kann man die zu verpixelnden - im Moment nur auszuschwärzenden - Stellen ermittelt.
1 - Player
Der Player funtkioniert für "Editor" und "Zensor" wenn dort Video bzw Script geladen sind. Die Tastaturbedienung kann man sich ansehen wenn man das Button mit den sechs Tasten anklickt.
2 - Aktuelle Position/Gehe zu Bild
Es wird die aktuelle Bildnummer angezeigt. Man kann eine Nummer eingeben und mit Enter wird dieses dazugehörige Bild angezeigt.
3 - Trackbar
Damit kann man durch das Video navigieren.
4 - Maske
Zeigt die Größe und Position der Maske an, wenn das aktuelle das erste oder letzte Bild des Bereiches wäre. Um die Position und/oder die Größe zu ändern muss man einmal auf die Maske klicken.
5 - Bereich
Hier werden die Daten für den Scripteintrag gesammelt. Wenn man den Button unter Start klickt, werden die aktuelle Bildnummer, die linke ober Ecke sowie die Größe der Maske eingetragen. Dasselbe gilt für Ende. Der Klick auf den Button bei Befehl erstellt einen Scripteintrag.
Wenn das Panel im Weg ist, kann man es mit der Maus am Rand anfassen und verschieben.
-
Eigentlich sollte alles einigermaßen schlüssig sein. Das kann ich natürlich sagen. Geht alles nach "meiner Logik". Deshalb ein paar Hinweise.
1 - "Neues Script"
In das Editorfenster wird das Gerüst des AviScriptes geschrieben. Sollte bereits eines darin enthalten sein, kann dieses noch gespeichert werden.
Code
Alles anzeigen###=== 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)
Schlägt man die anderen Tabs auf, gibt es noch Fehlerhinweise.
2 - "Script öffnen"
Damit läßt sich ein bestehendes Script laden. Es wird das Video gesucht und geladen.
3 - "Script speichern"
Das Script speichern. Hat das Script bereits einen Namen erfolgt dies ohne Dialog.
4 - "Script speichern unter"
Das Script wird mit einem "Speichern unter"-Dialog gespeichert. Dabei sollte im Moment die Dateiendung ".AVS" mit angegeben werden.
5 - "Video laden"
Es wird die Zeile
gesucht und dort die mit dem Dialog ausgewählte Datei eingetragen.Im Moment werden nur AVIs geladen und die Größe 720 * 1280 verwendet weil dies das Material von meinner Kamera ist. Hat es keine Fehlermeldung gegeben, sollte das Originalvideo im Tab "Editor" und das Ergebnis mit dem Fakeeintrag im Tab "Zensor" zu sehen sein.
-
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:
Code
Alles anzeigen###=== 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)
Das Script enthält viele Kommentaren und ein paar Anweisungen. Alle Kommentare beginnen mit dem Zeichen '#'. Es besteht aus drei Teilen:
Code###=== 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.
Code
Alles anzeigen###=== 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) }
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.
Code###=== 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:
Code
Alles anzeigenMyAnimate(<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)
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.
-
Da frage ich mich warum man sich so über die "sozialistische" Berichterstattung echauffiert? Der Westen ist doch keinen Deut besser.
Es ist nichts von objektiver Berichterstattung, wozu die öffentlich-rehtlichen Sender verpflichtet sind, zu merken. Und dafür müssen wir auch noch Gebühren zahlen.
-
Passt mindestens in beide. Ich hatte aber gar nicht daran gedacht. Auf jeden Fall hat dieser Kayhan einen gehörigen Bock geschossen.
-
Kam genau das, was wir nicht gebrauchen können. Ob er irdengwann verstehen wird, was er für einen Bock geschossen hat?
-
nicmare hat schon drauf hingewiesen -> Ist der Bericht zu Dashcamnutzer gesucht für Interview.
-
Eben bei Panorama auf Tagesschau24.
* Ein Autofahrer, der das Verkehrsgeschehen filmt und die Fehler der anderen im Internet anprangert. Unverpixelt und damit eindeutig datenschutzrechtswidrig.
* Der Datenschutzbeauftragte des Landes Bayern, welcher einem Autofahrer die Verwendung einer Dashcam untersagt hat, weil dieser zahlreiche Anzeigen eingereicht hat. Die Untersagung wird derzeit gerichtlich geprüft. Ich denke, dass die Untersagung rechtens ist und hoffe, dass es eine vernünftige Begründung gibt.
Er meint auch, dass bereits die Aufnahme illegal sei, weil die Enwilligung der Aufgenommenen fehle. -
Am Wochenende habe ich wieder Zeit. Mal sehen wie es gedeiht.
-
Danke. Also doch nicht so einfach wie ich es mir gedacht habe. Dann sollte man auf den Raspberry setzen. Vielleicht gibt es dann doch mal ein Update mit höherer Leistung.
-
Versuch Dein Glück mal bei den portablen Navis, da wirste vermutlich eher fündig... allerdings sind dort die Tempolimits in der Regel bereits gespeichert und werden nicht in Echtzeit abgelesen, oder mittlerweile doch?
Die Tempolimits sind im Kartenmaterial enthalten. Da sollte man darauf achten, dass man Kartenupdates bekommt. Allerdings sind die enthaltenen Daten nicht immer aktuell. Beispielsweise gibt es bei uns eine Strecke mit mehreren 70er Abschnitten, welche beim Navi eine Strecke ist. Die Endezeichen fehlen. Ebenso auf BABs. Da sind auf der Karte Baustellen enthalten, welche nicht mehr existieren. Für die Warnungen kann man Toleranzgrenzen einstellen. Sprich man kann einstellen, dass erst gewarnt wird, wenn man meinetwegen 10 km/h zu schnell ist. Die Geschwindigkeit wird per GPS ermittelt. -
Aber Du hattest gerade Recht.
-
Das war noch mit der NavGear. Da lief sie noch fehlerfrei
Danke. Ich frage, weil ich vermutlich eine ähnliche Kamera im Einsatz habe (NavGear MDV-2280.GPS).Da ich nicht der Video-Verpixlungsexperte bin, kann ich das Video nicht so freigeben.
Damit erinnerst Du ich an mein jüngstes Programmierprojekt. Ab dem Beitrag habe ich geschrieben wie ich mein Video unkenntlich gemacht habe. Dazu will ich eine GUI schreiben, die das erleichtert. Bzw ich habe schon begonnen.