Benutzerdefinierte Funktionen in AviSynth

  • Hallo,

    ich bin nun unter die analogen TV-Capturerer gegangen. Aufnahme mittels VirtualVCR klappt gut, nur bei AviSynth stehe ich ein wenig auf dem Schlauch.
    Wenn ich "normale" Plug-Ins/Filter verwende klappt das noch ganz gut.

    Code
    AviSource("F:\Captured\Videos\nacht.avi")Trim(1900,127398)RemoveGrain(mode=2)RemoveDirt()MSharpen(15,100,true,false,false)Tweak(hue=0.00,sat=1.1,bright=2.5,cont=1.0) LanczosResize(656,544,10,4,680,564)AddBorders(32,16,32,16)

    Nachteil bei diesem seeehr einfachen :redface: Script: Extreme Weichzeichnung, recht hoher Detailverlust.
    (Die Qualität des gecapturten Films war aber eh nicht so dolle)
    Da am Ende eine DVD herauskommen soll, habe ich auf das deinterlacen verzichtet. Das ist korrekt so, oder?

    Nun wollte ich ein wenig mit Didées Filtern experimentieren, vor allem mit MCNR_simple zwecks besserem entrauschen.
    Ich habe mittlerweile gelernt, dass es sich hierbei um eine benutzerdefinierte Funktion handelt. Denn nur so

    Code
    MCNR_simple1( frames=2, thY=8, thC=6, thY2=-1, thC2=-1, \            blocksize=16, chroME=false, repairME=true, removdirt=false, \            LPrad=0.0, LPlosens=1, LPhisens=5 )

    klappt das natürlich nicht.
    Die benötigten Plug-Ins liegen im AviSynth Plug-In-Ordner, doch irgendwie weiß ich nicht (trotz Anleitung) wie und wo ich diese mit

    Code
    function MCNR_simple

    beginnende Funktion in das Script einfügen soll.
    Wenn ich nämlich die Anleitung komplett übernehme

    erscheint diese Fehlermeldung:

    Zitat

    Script Error: expected a, or )
    (F:\Captured\Videos\nacht.avs, line, column 30)

    Irgendetwas mache ich da wohl völlig falsch, oder?
    Kann mir jemand bitte meine Unwissenheit durch ein einfaches Beispiel austreiben?

    Quapla'
    Gothmog

    Gegen jeden, der es unternimmt, diese Ordnung zu beseitigen, haben alle Deutschen das Recht zum Widerstand, wenn andere Abhilfe nicht möglich ist. (Art. 20(4) GG)[SIZE=-1]
    [/SIZE]

  • Ups, sorry! Muss heißen

    Zitat

    Script Error: expected a, or )
    (F:\Captured\Videos\nacht.avs, line 3, column 30)


    Als Beispiel für das Rauschen und dessen Entfernung habe ich mal zwei Bilder von demselben Frame angefügt. Bild 3: unbearbeitet, Bild 4: bearbeitet.

    Eine nächste Frage schließe ich gleich an.
    Größtenteils sieht der Film so aus, als ob er progressiv wäre (Bild mit Dame und Pferd); in zwei Szenen sieht er aber eher interlaced (?) aus (Bild mit Mann). Dies sind Szenen, die nicht synchronisiert sind und (wohl extra für Arte) eingefügt wurden. Muss ich da was beachten und wenn ja was?

    Sorry, dass die Bilder nur jpg sind, aber andere Formate (png oder bmp) mit einem 56k-Modem hochzuladen, wäre ziemlich langwierig.

  • Wenn du eine Funktion "deklarierst" (allgemein ihre benötigten Parameter beschreibst) und "implementierst" (den Inhalt mit den darin abgearbeiteten Funktionen beschreibst), dann darfst du den Parametern keinen Wert geben, sondern musst zunächst ihren Typ erklären.

    Willst du dagegen die Funktion tatsächlich ausführen, und diesmal die Parameter mit konkreten Werten belegen, darfst du nicht noch mal extra erklären, wie die Funktion arbeitet.
    __

    Die Deklaration der Funktion (wie in der Datei "MCNR_simple2.avs" zu lesen) lautet:

    PHP
    function MCNR_simple2( clip clp, int "frames", int "thY", int "thC", int "thY2", int "thC2", \                     int "blocksize", bool "chroME", bool "repairME", bool "removdirt", \                     float "LPrad", int "LPlosens", int "LPhisens")


    Darin wird erklärt, wie die zu übergebenden Parameter heißen, in welcher Reihenfolge man sie ohne Namen angeben muss, und welche davon Namen haben, und man nicht unbedingt anzugeben braucht.

    Was du da oben angegeben hast, ist schon der komplette Aufruf, jedoch irgendwie als Neu-Deklaration geschrieben - und dadurch völlig falsch. Lass das "function ..." und die gesamte Implementation weg. Statt dessen versuche folgendes:

    Skripte oder Plugins "in einem Verzeichnis haben", ist mir persönlich immer zu unsicher. Ich bevorzuge immer, Plugins explizit mit "LoadPlugin()" und Funktionsskripte explizit mit "Import()" zu laden -- das ist auch gleich eine Art "Dokumentation", welche Extras mein Skript benötigt, um zu funktionieren, die Leser meiner Skripte müssen dann nicht erst mühsam recherchieren, in welcher Bibliothek denn eine Funktion Namens ... bereitgestellt wird.

    Apropos "suchen" - "MCNR_simple2" fand ich über die "Dideé AviSynth Filter Collection" in diesem Artikel.

  • Das Script funktioniert nicht weil das "\" bei der Funktionsdefinition nicht am Zeilenanfang steht. Es soll ja den Zeilenbruch aufheben und muss daher entweder am Ende der ersten Zeile oder am Anfang der Fortsetzungszeile stehen. Du has noch ein Leerzeichen davor. Übrigens- ich plaziere Funktionen normalerweise am Ende des Scripts.

    Zum Script selbst- ich würde da kein Resize nehmen, nur mit crop (oder Letterbox) beschneiden. Wenn es sich um interlaced Material handelt, vermanscht Du die Halbbilder wenn die Zeilenzahl in Resize geändert wird. Dein Ausgangsbild erscheint mir schärfer als das bearbeitete.

    G

  • Zitat von MediumRare

    Das Script funktioniert nicht weil das "\" bei der Funktionsdefinition nicht am Zeilenanfang steht. Es soll ja den Zeilenbruch aufheben und muss daher entweder am Ende der ersten Zeile oder am Anfang der Fortsetzungszeile stehen. Du has noch ein Leerzeichen davor.


    Irrelevant.

    In den letzten Jahren hab ich ca. 99.9% aller "\" Zeilenumbrüche mit mindestens einem Blank Einrückung geschrieben. Das ist erlaubt, wird von AviSynths Parser richtig interpretiert, und hat noch immer funktioniert.

    [OT]
    Hab sogar in MOmonsters "Crestore" Script gesehen, dass er innerhalb eines YV12Lut String-Ausdruckes umbricht, mit vielen zusätzlichen Leerzeichen:

    Code
    global mask3 = mt_lutxy(diff_c23, diff_c34, yexpr="x 128 - abs "+limit+" <= y 128 - abs "+limit+" <= |\	 x y + 256 - abs "+limit+" 2 * <= | "+nomot+" 128 x - y 128 - * "+nomot+" + ?", uexpr="x", vexpr="x")


    :eek:

    Das ist insofern "mutig", als YV12Lut/xy absolut intolerant gegen überzählige Leerzeichen ist:

    Code
    last.yv12lut("0  x +"
                   ^^

    liefert einen schwarzen Clip.
    Aber sogar das scheint ja zu funktionieren ...
    [/OT]

    Na, jedenfalls: genau SO machen, wie es LigH oben beschrieben und erklärt hat. Dann geht das.

  • Zitat von MediumRare


    Zum Script selbst- ich würde da kein Resize nehmen, nur mit crop (oder Letterbox) beschneiden.


    Yep, und crop dann ganz vorne, damit erhöhst du die Filtergeschwindigkeit, da ja weniger Pixel da sind die bearbeitet werden müssen.

    Wenn du schon mit Didée´s Filtern arbeitest, dann würde ich anstatt MSharpen, LimitedSharpen nehmen.
    Hast du dir mal mein Test Script angeschaut?

  • Hallo, sollte es nicht auch, wenn es interlaced bleiben soll zuerst gebobbt und dann wieder reinterlaced werden zwecks Qualität?!?

  • Zitat von Didée

    Irrelevant.

    In den letzten Jahren hab ich ca. 99.9% aller "\" Zeilenumbrüche mit mindestens einem Blank Einrückung geschrieben. Das ist erlaubt, wird von AviSynths Parser richtig interpretiert, und hat noch immer funktioniert.


    Da lerne ich mal wieder was dazu. Ich habe bisher immer darauf geachtet... :rolleyes:

    G

  • Erst einmal danke an alle für die Tipps! :daumen:
    Ich habe ein wenig rumgespielt und mein Script sieht jetzt so aus:


    Die einzelnen Frames sehen in VirtualDubMod gut aus (jedenfalls besser als bei mir). :)

    EDIT: Eine Frage gelöscht, Lösung durch Suchfunktion gefunden.

    Dann noch einmal meine zweite Frage von oben (dritter Post in diesem Thread): Ist das auf dem ersten Bild in diesem Anhang noch interlaced oder schon was anderes?

    Nächste Frage (sorry): Auf dem Bild mit dem Boot sieht man die Kontur des Bootes doppelt (rechte Seite vor dem Wasser). Wie lautet der Fachbegriff für so etwas und wie kriege ich das weg?

  • Zitat von Gothmog

    Nächste Frage (sorry): Auf dem Bild mit dem Boot sieht man die Kontur des Bootes doppelt (rechte Seite vor dem Wasser). Wie lautet der Fachbegriff für so etwas und wie kriege ich das weg?

    man nennt dies Egde Enhancement, Halo, Überschärfung usw.
    hiermit geht's (fast) immer weg :)

    Code
    ### Vernünftiges Dehalo ala Didee 	###den   = dein_denoiser()dh    = Dehalo_Alpha(rx=3.0,ry=3.0)#.BlindDehalo3(PPmode=-3,PPlimit=4)	# <- evtl. bdh3 für starke helle halosedges = dh.removegrain(12,-1).prewitt(multiplier=2.5) \         .mt_expand().mt_inflate().mt_inflate().removegrain(12,-1).mt_expand()mt_merge(den,dh,edges)

    falls noch etwas EE übrig bleibt würd ich

    Code
    FastGaussBlur(2.0,2.0)


    http://forum.doom9.org/showpost.php?p=632648&postcount=12

    drüberjagen

    dass hinterher geschärft werden sollte versteht sich woll von selbst !

  • Zitat von razor_king

    Hallo,

    darf ich Dir mal hinter vorgehaltener Hand mitteilen, dass dieser Film um über 10 Minuten geschnitten war? Laufzeit uncut in PAL ist 96 Min. 24 Sek.!
    (Sorry das ich ihn erkannt habe... :ani_lol: )


    Weiß ich, weiß ich. Diese Version hat aber im Vergleich zur "normal" gekürzten Fassung einige Szenen mehr.
    Zum anderen ist die Qualität nicht so doll. Zum Testen bzw. Ausreizen meiner bzw. der Fähigkeiten von AviSynth daher hervorragend geeignet. :)

    @ Mr.Brown
    Aha Halo, dachte ich mir schon. Werde dein Script mal ausprobieren, danke.
    (Sofern ich es verstehe und zum laufen kriege).:)

    Quapla'
    Gothmog

    Gegen jeden, der es unternimmt, diese Ordnung zu beseitigen, haben alle Deutschen das Recht zum Widerstand, wenn andere Abhilfe nicht möglich ist. (Art. 20(4) GG)[SIZE=-1]
    [/SIZE]

  • @ Mr.Brown
    Sorry, aber dein Anti-Halo-Script ist mir irgendwie zu hoch.
    Die Abkürzungen und das "=" irritieren mich; ich habe keine Ahnung, wie ich das in mein Script einbinden solll. :redface:

    Hier noch mal mein Script:

    Ich habe noch telecide eingefügt, wegen der zwei extremen Interlaced-Szenen. Mal schauen, was passiert.

    Und mit den Werten von MCNR_simple2 und LimitedSharpen bin ich doch noch nicht ganz zufrieden. Teilweise sieht das sehr gut aus. Aber bei dunklen Szenen mit Nebel (und davon gibt es in dem Film einige) werden die eh schon schwach zu sehenden Details noch mehr plattgebügelt. Da muss ich noch etwas testen. Eine Art "Standard-Script" für analog gecapturtes TV gibt es nicht zufällig, oder? :)

    Theoretische Frage: Ist es möglich Filter wie z.B. MCNR_2 nur auf bestimmte Szenen des Films anzuwenden bzw. die Stärke dieses Filters während des Films zu variieren?

    Quapla'
    Gothmog

    Gegen jeden, der es unternimmt, diese Ordnung zu beseitigen, haben alle Deutschen das Recht zum Widerstand, wenn andere Abhilfe nicht möglich ist. (Art. 20(4) GG)[SIZE=-1]
    [/SIZE]

  • Zitat von Gothmog


    Theoretische Frage: Ist es möglich Filter wie z.B. MCNR_2 nur auf bestimmte Szenen des Films anzuwenden bzw. die Stärke dieses Filters während des Films zu variieren?


    http://forum.gleitz.info/showthread.php?t=26213

    Zitat von Gothmog

    @ Mr.Brown
    Sorry, aber dein Anti-Halo-Script ist mir irgendwie zu hoch.
    Die Abkürzungen und das "=" irritieren mich; ich habe keine Ahnung, wie ich das in mein Script einbinden solll. :redface:

    Hier noch mal mein Script:


    Versuchs mal mit dem Script

  • @ Eriman
    Danke für den Link und das Script. Ich habe die DeHalo-Werte ein wenig erhöht, aber ich sehe irgendwie immer noch keinen Unterschied ob ich DeHalo einsetze oder nicht.:hm:
    (Siehe Bilder im Anhang: Bild 1: ohne DeHalo und geschärft; Bild 2: mit DeHalo und geschärft)

    Dann fällt mir im Script Editor von VirtualDubMod noch auf, dass manche Werte (oder sind es Operatoren :grübeln:) bei den benutzerdefinierten Funktionen rot gefärbt sind.

    Code
    DeHalo_alpha(rx=2.5,[COLOR=Red]ry[/COLOR]=2.5,darkstr=1.0,[COLOR=Red]brightstr[/COLOR]=1.0)
    MCNR_simple2( frames=2, thY=8, thC=6, thY2=-1, thC2=-1,
     \            blocksize=16, chroME=false, [COLOR=Red]repairME[/COLOR]=true, [COLOR=Red]removdirt[/COLOR]=true,
     \            LPrad=1.1, LPlosens=1, LPhisens=5 )

    Hat das irgendetwas zu bedeuten?

  • Und genau da ist das Problem:
    Ein Sample (selbst wenn es nur zwei Sekunden dauert) mit einem 56k-Modem hochzuladen, dauert etwas lange.
    Trotzdem danke.

    Quapla'
    Gothmog

    Gegen jeden, der es unternimmt, diese Ordnung zu beseitigen, haben alle Deutschen das Recht zum Widerstand, wenn andere Abhilfe nicht möglich ist. (Art. 20(4) GG)[SIZE=-1]
    [/SIZE]

  • Mein gesamtes Script? Ich hoffe du meinst mein o.g. Script plus den benutzerdefinierten Funktionen, die ich verwendet habe. :)

    Quapla'
    Gothmog

    Gegen jeden, der es unternimmt, diese Ordnung zu beseitigen, haben alle Deutschen das Recht zum Widerstand, wenn andere Abhilfe nicht möglich ist. (Art. 20(4) GG)[SIZE=-1]
    [/SIZE]

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!