Sie sind auf Seite 1von 9

Ausarbeitung zum Workshop ber AVISynth von Markus Rudolph Freie Universitt 2008

Was ist AVISynth?


Der AVI Sythesizer (kurz AVISynth) ist ein skriptbasierter Frameserver unter der GNU Public License. Mit ihm ist es durch ein Skript mglich, eine oder mehrere Videodateien zu laden und zu manipulieren, um diese dann direkt an ein Videoprogramm zu schicken. Allgemein sind Frameserver Vermittler von Bildern und werden eingesetzt, um Videodatenstrme an ein Programm zu schicken ohne dabei temporre Dateien zu erstellen. Sie werden unter anderem genutzt, um ein Video, dessen Kodierung nicht untersttzt wird, zu dekodieren und die Bilder unkomprimiert direkt an ein Programm zu schicken. Allerdings ist ein Frameserver nicht eigenstndig, denn es bedarf immer ein Programm, was auf ihn zugreift, indem es eine Anfrage nach Videodaten stellt. Dies geschieht bei AVISynth u.a. beim ffnen eines AVISynth-Skriptes (*.avs). AVISynth verfgt ber keine Benutzeroberflche, es dient nur als Schnittstelle zwischen Pseudovideo und Videoprogramm. Unter Windows ist derzeit Version 2.57 verfgbar. Es gibt jedoch auch eine plattformbergreifende Version fr Windows und Linux, basierend auf dem Quelltext von Version 2.5. Diese ist jedoch noch in der Beta-Phase (3.0b). Im folgenden befasse ich mich nur mit der Windowsvariante (2.57).

Kleines Beispiel
1_aufbau.avs: Als Veranschaulichung sei links ein AVISynth-Skript gegeben. Das Bild rechts ist das von
AVISynth produzierte Ergebnis, das mithilfe von fast jeden Videoeditor/-player betrachtet werden kann.

Erluterung: Mit AVISource wird ein Video geladen, das in diesem Fall im selben Verzeichnis liegt wie die Skriptdatei. Anschlieend wird mit BilinearResize die Auflsung des Videos gendert. Zum Schluss setzt Subtitle einen Untertitel. Der Parameter align=2 gibt an, dass der Schriftzug an den unteren Rand des Videos gesetzt werden soll.

Die Funktionsweise
Einfach ausgedrckt wird dem System eine Videodatei vorgegaukelt. Dies geschieht ber die Video-for-Windows-API (VfW), einer Programmierschnittstelle unter Windows, die es erlaubt Ton- und Videodaten von AVI-Dateien zu ffnen und zu manipulieren. Whrend der Installation von AVISynth registriert es bei VfW als Filehandler fr *.avs-Dateien. Wenn dann ein Programm eine AVS-Datei ber die VfW-Schnittstelle ffnet, wird die Datei vorerst von AVISynth durchlaufen. Dabei wird das Skript geparst und erkannt, welche Videos und Plugins verwendet werden. Dann liegt das Pseudovideo so dem Videoprogramm vor. Wenn nun vom Programm aus ber die VfW-Schnittstelle ein Frame (Bild) gefordert wird, luft AVISynth die auch vorher erfasste Befehlsfolge ab, wobei Frames aus den geladenen Videos hinzugezogen werden und interne und externe Filter zum Einsatz kommen. Sobald die Befehle durchlaufen sind, wird der entstandene Frame unkomprimiert ber die VfW-Schnittstelle an das Programm geschickt. Je nachdem wie umfangreich das Skript ist, kann es auch entsprechend schnell wiedergegeben werden. Bei kleinen Anwendungen, wie Zuschneiden, Betiteln und Farbeinstellungen kann das Video flssig wiedergegeben werden. Ein rechenintensiveres Skript knnte Rauschentfernung und Bewegungskompensierung enthalten. (Anmerkung: Wenn ein Skript Fehler enthlt, teilt AVISynth dies dem Benutzer mit, indem die Fehlermeldung als Video ausgegeben wird.)

Die Sprache Allgemein:


Kommentare werden mit einer Raute eingeleitet: #Das ist ein Kommentar. das = ist_ein(Befehl) Befehle, die zu lang werden, sind unleserlich. Um sie mehrzeilig zu schreiben, muss man am Ende jeder Zeile (oder am Anfang der nchsten Zeile) ein Backslash ('\') geschrieben werden: ein = mehrzeiliger_Befehl(mit, \ einfach, \ zu, \ vielen, \ Parametern) Das hngt damit zusammen, dass es keine Endzeichen gibt, wie das Semikolon (';'), was in anderen Sprachen, wie C oder Java, das Ende eines Befehls signalisiert. Eine OffsideRegel (wie in Haskell; neuer Befehl beginnt in der selben Spalte wie der Vorherige) gibt es auch nicht.

Filter und Variablen


Unter Variablen versteht man beliebige Wrter (auer Schlsselwrter), die einen Wert oder Referenz zugewiesen bekommen. Generell gilt: Steht eine Variable links von einer Zuweisung ('='), wird ihr was zugewiesen steht sie rechts oder allein, wird sie ausgewertet, also ihr Wert verwendet. In AVISynth gibt es sechs Typen, die eine Variable haben kann: Wahrheitswerte (bool) Bsp.: bool greater_zero = 1>0 Ganzzahlen (int) Bsp.: int loesung = 42 Fliekommazahlen (float) Bsp.: float pi = 3.141 Zeichenketten (string) Bsp.: string hi = "Hallo Welt" Videos (clip) sind die einzigen Objekte in AVISynth. Sie haben diverse Eigenschaften auf die man zugreifen kann: Bsp.: clip video = AVISource("datei.avi") einige Eigenschaften: int video.width / int video.height #Auflsung eines Videos int video.frameCount #Bildanzahl eines Videos bool IsRGB/IsRGB24/IsRGB32/IsYUY2/IsYV12 #Informationen ber den Farbraum weitere Eigenschaften sind der Dokumentation zu entnehmen Alle Eigenschaften sind auch als Funktionen ansprechbar: video.width entspricht width(video) Der Containertyp val kann nur in Benutzerfunktionen verwendet werden und steht stellvertretend fr einen der oberen fnf Typen. Der eigentliche Typ muss dann in der Funktion abgefragt werden. Es gibt auch Arrays, jedoch bentigen diese die Erweiterung AVSLib. Einen eigenen Typen fr Arrays gibt es nicht, es wird hierfr der Typ String verwendet. Es gibt auch keine Datenverbunde (records). Wichtig: Der Typ muss nie angegeben werden. Man kann einer Variable irgendwas, was den fnf Typen entspricht, beliebig oft und typwechselnd zuweisen. Das ist ntzlich, wenn man mal schnell ein Skript schreiben will. Jedoch sollte man den Typ angeben, wenn man das Skript einmal wiederverwenden oder weitergeben will, damit der Code verstndlicher ist (Es ist auch ein besserer Stil). Unter Filter versteht man Funktionen, die ein Video(=clip) zurckgeben. Es gibt drei Arten: Quellfilter laden Videodateien oder Bilder oder generieren Videomaterial (z.B. einfarbige Videos oder ein TV-Testbild) Bearbeitungsfilter bekommen als ersten Parameter einen Clip und verndern diesen entsprechend ihrer Funktion. Wenn kein Clip angegeben wird, wird die letzte Ausgabe verwendet. Diese wird in der versteckten Variable last abgelegt. Ausgabefilter bilden aus Clip eine oder mehrere Dateien (z.B. lassen sich Einzelbilder extrahieren.) AVISynth bringt schon einige interne Filter mit sich. Sie umfassen u.a. Aufgaben, wie Schneiden, Farbeinstellungen, Deinterlacing, Schrfen/Verwischen und Masken. Darberhinaus kann man externe Filter verwenden. Dazu ldt man sich den gewnschten Filter als Plugin (*.dll) runter und ldt diesen mit dem Befehl LoadPlugin (Filtersammlung

siehe Quellen). Danach kann man den/die geladenen Filter, entsprechend seiner Dokumentation, auf Clips anwenden. Eine ntzliche Gegebenheit in AVISynth ist die Verknpfung von Filtern mithilfe des Punktes '.'. Wie in der Mathematik ist die Ausgabe des linken Operanden die Eingabe des rechten Operanden: filter1(video).filter2(xy) entspricht filter2(filter1(video), xy) Als kleines Beispiel:

2_filter_vars.avs: AVISource ist ein Quellfilter generiert also einen Clip.


BilinearResize, GreyScale, StackHorizontal und Subtitle sind Bearbeitungsfilter sie verndern einen Clip. src fungiert als Ausgangs-/Quellvariable, die Variable, die das geladene Video enthlt. dst ist hier eine Ziel-/Zwischenvariable sie bekommt eine Manipulation des Quellvideos zugewiesen.

Hier die Ausgabe.


Der Filter StackHorizontal sorgt dafr, dass mehrere Clips aneinander gereiht werden. Er ist ein so genannter nichtlinearer Filter.

Funktionen und Bibliotheken


In AVISynth ist es mglich eigene Filter in Form von Funktionen zu erstellen. Eine Funktion kann so aussehen: function Name(Typ1 variable1, Typ2 variable2) { return tu_was(variable1, variable2).tu_noch_was() } Das Schlsselwort function leitet die Funktion ein, gefolgt von dem Namen der Funktion. In runden Klammern knnen dann Parameter/Variablen stehen, wobei die Typangabe wieder optional ist. Der Funktionskrper wird dann mit einer geschweiften Klammern eingeleitet. Dort knnen dann Befehle ausgefhrt werden, die die bergebenen Variablen mainpulieren. Die Ausgabe erfolgt mit dem Schlsselwort return. Sie kann einen der fnf erwhnten Typen haben (int, float, bool, string, clip). (Wenn eine Variable x von auen mitverwendet werden soll, muss sie in der Funktion noch mit global x deklariert werden.)

Desweiteren kann man mithilfe des Befehls import andere Skripte einbinden. Es ist auch mglich mit AVISource andere Skripte zu laden, jedoch beschrnkt sich dies nur auf die Ausgabe. Mit import werden zustzlich alle Funktionen und Variablen importiert. Das hat den Vorteil, dass man sich Bibliotheken erstellen kann, die fr bestimmte (komplexe) Aufgaben konzipert sind (zum Beispiel Deinterlacing, Rauschentfernung, Farbeinstellungen). Die Bibliotheken kann man dann in ein beliebiges Skript laden und dessen Funktionen verwenden. Als kleines Beispiel: 3_funcs_libs_LIB.avs : Dieses Skript fungiert als Bibliothek. Es enthlt nur eine Funktion namens
AddSignature, die in einen bergebenen Clip eine statische Signatur einfgt und diesen Dann wieder ausgibt.

3_funcs_libs_MAIN.avs : Hier wird die Bibliothek importiert. Anschlieend wird ein Video geladen und
dessen Auflsung reduziert. Zum Schluss kommt die importierte Funktion AddSignature zum Einsatz. Das Bild rechts ist die Ausgabe des Skripts.

Kurz erwhnt
Folgende Sprachelemente werden nur angeschnitten, da man auch gut ohne sie auskommt. Blockanweisungen Sie werden wie folgt umgesetzt: video = Eval("""
result = video.Subtitle("Test") return result """)

Fallunterscheidungen Fr diesen Zweck gibt es den trinren '? :'-Operator. Er wird wie folgt verwendet:

zahl = (cond==true) ? 1 : 2 In Pascal wrde der Befehl wie folgt aussehen:


if(cond=True)then zahl:=1 else zahl:=2;

Ein if-then-else-Konstrukt selbst gibt es leider nicht in AVISynth (erst ab Version 3.0). Auerdem kann nur eine Zuweisung pro True- oder Falsecase eingesetzt werden. Mithilfe von Blockanweisungen kann man dann dennoch Befehlsfolgen einsetzen. Fallunterscheidungen knnen genutzt werden um z.B. Farbrume (RGB, YUY2...) zu unterscheiden oder eine Funktion abhngig von der Breite eines Videos zu machen. Arrays Es gibt einige Funktionen in der Erweiterung AVSLib, die es erlauben Arrays erstellen und manipulieren knnen. Dazu zhlen: ArrayCreate(), ArrayOpFunc(), ArrayRange(), ArrayGet(), ArrayOpArrayFunc(), ArraySum() . Fehlerbehandlung
try { #mglicherweise fehlerproduzierener Code } except (fehlermeldung) { #Fehlercode }

Schleifen a = AviSource("c:\some.avi")

cnt = 12 b = a.Trim(0,-4) cond = false block = ForNext(0, 5, 1, """ b = b + a.Trim(${i}*cnt, -4) cond = b.Framecount() > 20 ? true : false ${break(cond)} """) void = Eval(block) return b

Es gibt auch andere Schleifen (while, do), jedoch sind diese nicht ausreichend dokumentiert um sie hier vorzustellen. Bis auf die Fehlerbehandlung ist, sind diese Sprachkonstrukte sehr umstndlich und gewhnungsbedrftig umgesetzt.

Editoren
Da AVISynth auf der VfW-Schnittstelle basiert, kann jedes Video(editier)programm, dass diese Schnittstelle auch verwendet AVISynth-Skripte als Videos ffnen. So kann man mit einem Textedito, wie Notepad, das Skript modifizieren und sich die Auswirkungen mit einen Videoplayer anschauen. Allerdings hat das den groen Nachteil, dass man stndig zwischen zwei Programmen wechseln muss, was vorallem bei der Fehlersuche sehr demotivierend und unhandlich ist. Ich empfehle daher VirtualdubMOD als Editor fr AVISynth-Skripte, da er Player,

Videoeditor und Skripteditor vereint. Es ist zwar immer noch nervig, zwischen zwei Fenstern zu wechseln, allerdings, kann man mittels Tastendruck, das Skript speichern und sofort das Video betrachten. Als Beispiel habe ch mit VirtualdubMOD die erste Beispieldatei geffnet (File->Open video file...):

Etwas was vielleicht bei der ersten Berhrung mit VDubMOD irritiert, sind die zwei Videoausgaben. Das ist einfach erklrt: Links ist die Eingabe (Originalvideo) und rechts die Ausgabe von VDubMOD. Das hngt damit zusammen, dass VDubMOD auch einige Funktionen zum Manipulieren von Videos mit sich bringt. Unten sind diverse Navigationsmittel, wie zum Beispiel Abspielen von In- und Output und Pausieren (Stop). Der Skripteditor lsst sich aufrufen unter Tools->Script editor... (siehe Bild). Der Editor vefgt ber eine Syntaxhighlighting, also einer Formatierung von Schlsselwrter und Regionen, was das Skript lesbarer macht. Ein weiterer Vorteil ist die Autokomplettierung von Schlsselwrtern, die man aufrufen kann indem man im Text Strg+Leertaste drckt. Allerdings werden nur die Namen der verfgbaren internen Filter angegeben. Eine Typsignatur ist leider nicht vorhanden. ber das File-Men lassen sich Skripte ffnen und speichern. Sogar eine Vorschau ist vorhanden (Tastenkrzel sind F5 und F7). Es gibt aber auch andere Editoren fr AVISynth, wie AVSEdit oder AVSEditor (mit GUI, nicht nur Texteditor). Es gibt auch ein Kommandozeilen-Tool namens AVS2AVI. Darberhinaus gibt es viele Community-Projekte die auf AVISynth basieren.

Vor- und Nachteile von AVISynth


Vorteile
Eine der schnen Eigenschaften ist, dass man einfach mehrere Videos verschiedenster Codierung laden und zusammenfgen kann. Andere Videoprogramme erstellen bei solchen Problemen temporre Videodateien mit vereinheitlichten Codec. Man spart somit zustzlich Speicherplatz auf der Festplatte, da das Zwischenspeichern entfllt. Wie bei VDubMod gezeigt, hat man auch die Mglichkeit das Ergebnis ohne Rendern zu betrachten. Wenn man sich auerdem auf eine Kombination von AVISynth und VirtualDub einlsst (oder ein anderer schlanker Videoeditor), spart man zustzlich Arbeitsspeicher, verglichen mit Adobe Premiere oder Sony Vegas. Ein weiterer, immer gepriesener Vorteil von AVISynth ist das nichtlineare Manipulieren von Videos. Die Entwickler verstehen darunter unter anderem das horizontale und vertikale Aneinanderfgen mehrerer Videos mit StackHorizontal und StackVertical, was z.B. Vorher-/Nachhervergleiche ermglicht und trotzdem einfach zu handhaben ist. Auerdem kann man Funktionsbibliotheken erstellen (siehe Abschnitt Funktionen und Bibliotheken), was es einfach macht, komplexere Bearbeitungen nur zu laden und anzuwenden. Und nicht zu vergessen: Es ist Opensource! Es ist also kostenlos und hat eine groe Fangemeinde, wie im Doom9-Forum (siehe Quellen). Auerdem gibt es viele Plugins (externe Filter), was die Funktionalitt um einiges erweitert.

Nachteile
Das grte Manko an AVISynth ist, dass es nur unter Videoprogrammen arbeitet, die die Video-for-Windows-Schnittstelle (VfW) zum ffnen vom Videodateien nutzen. So ist es zum Beispiel nicht mglich ein AVISynth-Skript mit dem schlanken und multikompatiblen VLC-Player abzuspielen. Desweiteren sticht einen die relativ schlechte Dokumentation der Filter ins Auge. Diese ist an einigen Stellen fehlerhaft oder auch unzureichend ausgearbeitet, wie es speziell bei externen Filtern der Fall ist. Aber wenn man sich auf die internen Filter beschrnkt, so ist die mitgelieferte Dokumentation ausreichend. Hinzu kommt die recht schwache Skriptsprache. Wer schon in anderen Programmiersprachen Erfahrung hat, vermisst bei AVISynth besser umgesetzte Sprachkonstukte, wie Fallunterscheidungen und Schleifen, sowie ein umfassenderes Typsystem, wie Arrays und Datenverbunde (records), was die Arbeit mit AVISynth noch einfacher gestalten knnte. Desweiteren scheint es so als ob die Entwicklung stagniert. So ist die Windows-Version seit Mitte 2007 von nderungen unberhrt (v2.57) und die plattformbergreifende Version seit Anfang 2007 noch in der Beta/Prealpha-Phase (v3.0a). Dies hat seine Grnde im Mangel an Entwicklern. Laut einem Beitrag im Doom9-Forum ist der Quellcode einfach zu unberschaubar geworden.

Quellen
http://de.wikipedia.org/wiki/Avisynth http://en.wikipedia.org/wiki/AviSynth http://avisynth.org/ http://sourceforge.net/projects/avisynth2/

Filtersammlung
http://avisynth.org/warpenterprises/

Forum
http://forum.doom9.org/forumdisplay.php?s=&forumid=67