Teilbereiche filtern

  • Hi

    Ich habe mal ne Frage. Ich will aus einem Film nur Bereiche Filtern.

    Nun kann ich mit Trim zwar den Bereich markieren er gibt aber eben nur den Bereich aus.

    zb
    Trim(0,12958)

    Trim(12959,12986)

    Trim(12987,19000)

    Wenn ich zb nun nur den Filter auf 12959,12986) anwenden will wie gehe ich da vor?

    Muss man wirklich erst den Film in Blöcke zerscheiden um das hinzubekommen?
    Bei HD Material zb gar nicht so einfach.

  • Du möchtest den Filter nur "auf einen Bereich anwenden" (engl.: apply to a range):

    ApplyRange

    Achte gut auf die Syntax mit Anführungszeichen, falls das ein Filter ist, in dem Parameter mit Zeichenketten vorkommen. Üblicherweise verpackt man dann den Aufruf des Filters in dreifache Anführungszeichen.

  • Oder halt klassich:

    Code
    videoInput = gewünschter SourceFilter
    part1 = videoInput.Trim(0,12958)
    part1 = part1.FILTER
    part2 = videoInput.Trim(12959,12986)
    part2 = part2.FILTER
    part3 = videoInput.Trim(12987,19000)
    part3 = part3.FILTER
    videoOutput = part1 ++ part2 ++ part3
    return videoOutput
  • Erst mal Danke an beide.

    ApplyRange scheint zu gehen aber ich kann es nicht wirklich anwenden.

    Ich ernte Syntax Error im 10er Pack

    ApplyRange(12959,12986,"Blur", 1.0)
    geht.

    ApplyRange(12959,12986,"Import("D:\Avisynth\MDegrain\MDeGrain2.avsi"))

    geht nicht

    ApplyRange(12959,12986,"Import("D:\Avisynth\MDegrain\MDeGrain2.avsi")),0)

    geht nicht

    Dasslebe Problem habe ich mit

    ApplyRange(12959,12986,"Greyscale"),())


    ApplyRange(12959,12986,"Greyscale()")

    geht nicht

    Ich kann keine Filter anwenden.

    Das von Selur geht auch nicht. Ich bekomm das nicht hin.

    SetMTmode(5,6) SetMemoryMax(512)
    #FFVideoSource("%source_file%",threads=1, cachefile="%working_dir%%source_name%.ffindex")
    videoInput = FFVideoSource("%source_file%",threads=1, cachefile="%working_dir%%source_name%.ffindex")

    part1 = videoInput.Trim(0,12958)
    part1 = part1
    part2 = videoInput.Trim(12959,12986)
    part2 = part2.Import("D:\Avisynth\MDegrain\MDeGrain2.avsi")
    part3 = videoInput.Trim(12987,19000)
    part3 = part3
    videoOutput = part1 ++ part2 ++ part3
    return videoOutput

    Import wird moniert??
    Grayscale geht aber ich kann offenbar keine Imports verwenden.

    2 Mal editiert, zuletzt von trecordings (6. März 2014 um 18:10)

  • vermute Du wolltest so etwas:

    Code
    Import("D:\Avisynth\MDegrain\MDeGrain2.avsi")
    videoInput = FFVideoSource("%source_file%",threads=1, cachefile="%working_dir%%source_name%.ffindex")
    part1 = videoInput.Trim(0,12958)
    part2 = videoInput.Trim(12959,12986)
    part2 = part2.MSDegrain2();
    part3 = videoInput.Trim(12987,19000)
    videoOutput = part1 ++ part2 ++ part3
    return videoOutput
  • Das funktioniert alles nicht.

    Das ganze soll in Staxrip laufen.

    Code
    SetMTmode(5,6) SetMemoryMax(512) FFVideoSource("%source_file%",threads=1, cachefile="%working_dir%%source_name%.ffindex")AssumeFPS(%source_framerate_mediainfo%)Crop(0,0, -Width % 8,-Height % 8)ConvertToYV12()


    Wenn ich FFVideoSource in eine Variabel setze, bekommt ich No Such Video in Staxrip. Also mache ich das erst mal ohne Variabel

    Trim(0,12958) ++ Trim(12959,12986).Greyscale() ++ Trim(12987,49000)

    Das geht.

    Wie rufe ich da nun ein AVSI auf zb

    D:\Avisynth\Staub\Captain.avsi

    Code
    SetMemoryMax(512)LoadPlugin("D:\Avisynth\Staub\mt_masktools-26.dll")LoadPlugin("D:\Avisynth\Staub\mvtools2.dll")LoadPlugin("D:\Avisynth\Staub\nnedi3.dll")LoadPlugin("D:\Avisynth\Staub\RemoveGrain.dll")LoadPlugin("D:\Avisynth\Staub\Repair.dll")#SetMTMode(2)o=lastsup1 = o.blur( 0.25).msuper()sup2 = o.blur(-0.26).msuper(levels=1)bv1  = sup1.manalyse(isb=true, blksize=16,overlap=8,search=5,searchparam=4)fv1  = sup1.manalyse(isb=false,blksize=16,overlap=8,search=5,searchparam=4)interleave(o.mcompensate(sup2,fv1),o,o.mcompensate(sup2,bv1))clense(reduceflicker=false).selectevery(3,1)x1 = lastnnedi3(field=-2)merge(selecteven(),selectodd())d1 = mt_makediff(x1,last)d2 = mt_makediff(last,last.removegrain(11,0).removegrain(11,0))last.mt_adddiff(d2.repair(d1,12,0).mt_lutxy(d2,"x 128 - y 128 - * 0 < 128 x 128 - abs y 128 - abs < x y ? ?"),U=2,V=2)x3 = lastx3a = x3.removegrain(11,0)x3b = x3a.removegrain(11,0)x3.mt_makediff(mt_makediff(x3a,x3b),U=2,V=2)

    Trim(0,12958) ++ Trim(12959,12986).Import("D:\Avisynth\Staub\Captain.avsi") ++ Trim(12987,49000)

    Geht nicht Invalid Argument to Import.

    Trim(0,12958) ++ Trim(12959,12986) Import("D:\Avisynth\Staub\Captain.avsi") ++ Trim(12987,49000)

    Geht das AVSI wird angewendet aber der letze Trim(12987,49000) wird ignoriert?????

    Wie soll ich das AVSI Script da einbinden, wenn Import da nicht verwendet werden kann?

    Das ganze Captain Script in einer Line da reinzupacken wäre ja der reinste Horror.

    Habe die Dinger extra als AVSI wegen übersicht.

    Geht wunderbar.

    Keine Ahnung warum das Import nicht gehen soll, geht ja so auch?

    Mein Versuch das zur Function zu machen geht auch nicht.

    function Test()
    {

    Import("D:\Avisynth\Staub\Captain.avsi")

    }

    Bekomme ich einen Blur Error aus dem Captain.avsi Script?

    Edit:
    So, da ich mit Selurs Methode nicht weiterkomme, habe ich zumindest einen Teilerfolg bei ApplyRange

    ApplyRange(12959,12986,"Greyscale")

    ConvertToYV12()

    Wäre der Aufruf der geht.

    Nun muss ich nur noch schaun, ob ich den Import da reinbekomme.

    Scheint aber nicht zu gehen. Langsam gehen mir die Varianten und Ideen aus.

    ApplyRange(12959,12986,"Import("D:\Avisynth\Staub\Captain.avsi")")

    Will einfach nicht egal, welche Variante ich versuche.

    6 Mal editiert, zuletzt von trecordings (6. März 2014 um 18:48)

  • Import und LoadPlugin kann man nicht auf Bereiche beschränken oder nur innerhalb von Funktionen benutzen. Diese Funktionen stellen andere Funktionen zur Verfügung und müssen daher global gelten.

    Aber deren bereitgestellte Funktionen können dann auf Bereiche angewendet werden. Also das "bereichsweise Importieren", z.B.

    Code
    ApplyRange([I]start[/I], [I]end[/I], """Import("QTGMC.avsi")""")

    (ich habe ausdrücklich auf dreifache Anführungszeichen hingewiesen, wenn darin einfache Anführungszeichen verschachtelt werden müssen!) wäre inhaltlich Unfug. Aber

    Code
    Import("QTGMC.avsi")
    ApplyRange([I]start[/I], [I]end[/I], """QTGMC(preset="fast")""")

    wäre möglich und sinnvoll. Immer schön dran denken: Nur weil dir jemand vorgestellt wurde, hast du dich noch längst nicht mit ihm unterhalten.

  • Fangen wir mal mit dem letzen zuerst an.

    Zitat

    Immer schön dran denken: Nur weil dir jemand vorgestellt wurde, hast du dich noch längst nicht mit ihm unterhalten.

    Würdest Du so freundlich sein zu erklären, was Du damit meinst bzw was das werden soll?

    Ich überlege gerade ob das einen Hintergrund hat den ich nachvollziehen könnte, oder ob das ne Dumm anmache ohne Hintergrund ist.

    Nur so. Sollte das so sein mit der anmache, dann bist Du bei mir richtig. Ich kann auch anders. Auch wenn ich gerade nicht in der Stimmung bin.

    Also bleib beim to Toppic, wenn es nicht zu viele umstände macht.

    Zum Rest.
    Das war nun eine Erwiderung auf meine Fragen. Aber nicht jede Erwiderung ist auch eine Antwort auf Fragen.

    Das heißt, ich soll das ganze zur Funktion machen?

    Habe ich oben aber schon erwähnt das mir das nicht gelungen ist.

    function Test()
    {

    Import("D:\Avisynth\Staub\Captain.avsi")

    }

    Bekomme ich einen Blur Error aus dem Captain.avsi Script?
    Wenn ich das dann mit Test() aufrufe.

    Nun mag ich da was falsch machen ok. Bzw ganz sicher mache ich was falsch.
    Nur, wenn da keiner hilft, dann ist das logo keine Hilfe, die mich irgendwie weiterbringt. Zu sagen es muss eine Funktion sein. Und das man es schon versucht hat, außen vorlässt. So kommen wir nicht weiter.

    Ich bräuchte also hilfe wie ich Captain.avsi

    Code
    SetMemoryMax(512)LoadPlugin("D:\Avisynth\Staub\mt_masktools-26.dll")LoadPlugin("D:\Avisynth\Staub\mvtools2.dll")LoadPlugin("D:\Avisynth\Staub\nnedi3.dll")LoadPlugin("D:\Avisynth\Staub\RemoveGrain.dll")LoadPlugin("D:\Avisynth\Staub\Repair.dll")#SetMTMode(2)o=lastsup1 = o.blur( 0.25).msuper()sup2 = o.blur(-0.26).msuper(levels=1)bv1  = sup1.manalyse(isb=true, blksize=16,overlap=8,search=5,searchparam=4)fv1  = sup1.manalyse(isb=false,blksize=16,overlap=8,search=5,searchparam=4)interleave(o.mcompensate(sup2,fv1),o,o.mcompensate(sup2,bv1))clense(reduceflicker=false).selectevery(3,1)x1 = lastnnedi3(field=-2)merge(selecteven(),selectodd())d1 = mt_makediff(x1,last)d2 = mt_makediff(last,last.removegrain(11,0).removegrain(11,0))last.mt_adddiff(d2.repair(d1,12,0).mt_lutxy(d2,"x 128 - y 128 - * 0 < 128 x 128 - abs y 128 - abs < x y ? ?"),U=2,V=2)x3 = lastx3a = x3.removegrain(11,0)x3b = x3a.removegrain(11,0)x3.mt_makediff(mt_makediff(x3a,x3b),U=2,V=2)

    und

    Jeweils zu einer Funktion mache. Scripte sind hier aus dem Forum.

    Wüsste ich wie das geht, würde ich das ja schon getan haben. Wenn ich schon versucht habe eine Function zu machen.

    Und ApplyRange(0, 1000, """Import("D:\Avisynth\Staub\Captain.avsi")""")

    Geht so nicht. Dein Beispiel geht wohl von einer Funktion aus und das ist wie schon gesagt mir (noch?) nicht möglich.

    Sprich dein Beitrag war leider Zeitverschwendung. Sowohl meiner als auch deiner Zeit.

    Einmal editiert, zuletzt von trecordings (6. März 2014 um 20:31)

  • Gut, zum Gleichnis mit der Vorstellung:

    Code
    Import("QTGMC.avsi") # die Funktion QTGMC() wird bekanntgemacht; damit wird das Video aber noch längst nicht gefiltertApplyRange(start, end, """QTGMC(preset="fast")""") # jetzt wird auch wirklich das Video bearbeitet!

    Entsprechend hast du dann leider auch noch nicht ganz den Sinn von benutzerdefinierten Funktionen und der Anwendung von Import-Skripten verinnerlicht. Am Beispiel der QTGMC.avsi oder der FFMS2.avsi kann man das gut sehen: Eventuell werden Plugins geladen; und dann werden noch Funktionen deklariert. Aber es wird außerhalb der Funktionsbeschreibungen kein Clip sofort bearbeitet. Das passiert erst, wenn im Haupt-Skript, in welches die Datei importiert wurde, die darin deklarierte Funktion auch mal aufgerufen wird.

    Schreiben wir die Captain.avsi mal etwas um:

    Code
    SetMemoryMax(512)LoadPlugin("D:\Avisynth\Staub\mt_masktools-26.dll")LoadPlugin("D:\Avisynth\Staub\mvtools2.dll")LoadPlugin("D:\Avisynth\Staub\nnedi3.dll")LoadPlugin("D:\Avisynth\Staub\RemoveGrain.dll")LoadPlugin("D:\Avisynth\Staub\Repair.dll")function CaptainsOrder(clip o){  sup1 = o.blur( 0.25).msuper()  sup2 = o.blur(-0.26).msuper(levels=1)  bv1  = sup1.manalyse(isb=true, blksize=16,overlap=8,search=5,searchparam=4)  fv1  = sup1.manalyse(isb=false,blksize=16,overlap=8,search=5,searchparam=4)  interleave(o.mcompensate(sup2,fv1),o,o.mcompensate(sup2,bv1))  clense(reduceflicker=false).selectevery(3,1)  x1 = last  nnedi3(field=-2)  merge(selecteven(),selectodd())  d1 = mt_makediff(x1,last)  d2 = mt_makediff(last,last.removegrain(11,0).removegrain(11,0))  last.mt_adddiff(d2.repair(d1,12,0).mt_lutxy(d2,"x 128 - y 128 - * 0 < 128 x 128 - abs y 128 - abs < x y ? ?"),U=2,V=2)  x3 = last  x3a = x3.removegrain(11,0)  x3b = x3a.removegrain(11,0)  return x3.mt_makediff(mt_makediff(x3a,x3b),U=2,V=2)}

    Damit wird ein Video nicht mehr "dort gefiltert, wo das Skript importiert wird", sondern nur noch "dort gefiltert, wo die Funktion CaptainsOrder() angewendet wird". Und diese Anwendung der Funktion lässt sich dann auch auf nur einen Bereich begrenzen. Eine Importierung eines Skriptes lässt sich aber nicht beschränken.

  • Viel zu viele Anführungszeichen und Klammern. Zähl mal von vorn und hinten.

    Außerdem komm ich auch manchmal nicht so ganz mit, wie das bei ApplyRange genau ist. Klammern gehören da wohl nicht rein. Wenn man keine Parameter braucht, ist es noch einfach, aber wenn man benannte Parameter hat (wie bei QTGMC), muss ich noch mal nachlesen.

    Schau noch mal meinen später überarbeiteten Beitrag direkt darüber an.

    Code
    # ...
    ApplyRange(12959,12986,"CaptainsOrder")
  • Import("D:\Avisynth\Staub\Captain.avs")

    Code
    SetMemoryMax(512)LoadPlugin("D:\Avisynth\Staub\mt_masktools-26.dll")LoadPlugin("D:\Avisynth\Staub\mvtools2.dll")LoadPlugin("D:\Avisynth\Staub\nnedi3.dll")LoadPlugin("D:\Avisynth\Staub\RemoveGrain.dll")LoadPlugin("D:\Avisynth\Staub\Repair.dll")function CaptainsOrder(clip o){  sup1 = o.blur( 0.25).msuper()  sup2 = o.blur(-0.26).msuper(levels=1)  bv1  = sup1.manalyse(isb=true, blksize=16,overlap=8,search=5,searchparam=4)  fv1  = sup1.manalyse(isb=false,blksize=16,overlap=8,search=5,searchparam=4)  interleave(o.mcompensate(sup2,fv1),o,o.mcompensate(sup2,bv1))  clense(reduceflicker=false).selectevery(3,1)  x1 = last  nnedi3(field=-2)  merge(selecteven(),selectodd())  d1 = mt_makediff(x1,last)  d2 = mt_makediff(last,last.removegrain(11,0).removegrain(11,0))  last.mt_adddiff(d2.repair(d1,12,0).mt_lutxy(d2,"x 128 - y 128 - * 0 < 128 x 128 - abs y 128 - abs < x y ? ?"),U=2,V=2)  x3 = last  x3a = x3.removegrain(11,0)  x3b = x3a.removegrain(11,0)  return x3.mt_makediff(mt_makediff(x3a,x3b),U=2,V=2)}


    ApplyRange(12959,12986,"CaptainsOrder")

    Geht nun. Dickes DANKE :)


    Nun versuche ich mit an der Anpassung für die Denoiser. Also auch zur Funktion

    Import("D:\Avisynth\MDegrain\MDeGrain2.avs")

    MDeGraintwo()

    Ergibt ein Invalid MSuper line 8

    Leider verstehe ich die Scripte nicht ich wende Sie nur an :)

  • In der Deklaration der Funktion "MDeGraintwo" wird der Clip "o" als Parameter übergeben. Auf den müssen sich dann auch die Aufrufe innerhalb der Funktion beziehen, wo sie sich sonst auf die implizite Clip-Variable "last" verlassen...

    Die implizite Clip-Variable "last" als Ersatz für nicht explizit verwendete Clip-Variablen ist so ziemlich das wichtigste an der Ablaufsteuerung in AviSynth. So viel sollte man dann schon von AviSynth im Allgemeinen verstehen, wenn man selber Funktionen schreiben will... ;)

    Die einfachste, aber auch "dreckige" Lösung ist, den übergebenen Clip "o" wieder zum impliziten Clip "last" zu machen, indem nach der öffnenden geschweiften Klammer einfach "o" in einer Zeile steht (die Abkürzung für "last = o"):

    Code
    function MDeGraintwo(clip o)
    {
      o
      super = MSuper(pel=2, sharp=2)
      backward_vec2 = MAnalyse(super, isb = true, delta = 2, overlap=4)
      backward_vec1 = MAnalyse(super, isb = true, delta = 1, overlap=4)
      forward_vec1 = MAnalyse(super, isb = false, delta = 1, overlap=4)
      forward_vec2 = MAnalyse(super, isb = false, delta = 2, overlap=4)
      return MDeGrain2(super, backward_vec1,forward_vec1,backward_vec2,forward_vec2,thSAD=350)
    }

    Die andere Möglichkeit wäre, jede Funktion explizit mit dem Clip "o" aufzurufen, wo es notwendig ist. Das gilt sicherlich für "MSuper". Beim Rest müsste ich die Dokumentation der MVTools2 lesen...

  • Super Erklärt Danke

    LoadPlugin("D:\Avisynth\MDegrain\mvtools2.dll")
    LoadPlugin("D:\Avisynth\MDegrain\TDeint.dll")

    SetMTMode(2)

    function MDeGraintwo(clip last)
    {
    super = MSuper(pel=2, sharp=2)
    backward_vec2 = MAnalyse(super, isb = true, delta = 2, overlap=4)
    backward_vec1 = MAnalyse(super, isb = true, delta = 1, overlap=4)
    forward_vec1 = MAnalyse(super, isb = false, delta = 1, overlap=4)
    forward_vec2 = MAnalyse(super, isb = false, delta = 2, overlap=4)
    return MDeGrain2(super, backward_vec1,forward_vec1,backward_vec2,forward_vec2,thSAD=350)
    }

    Schon geht es.:D

  • Um Teilbereiche einfach und komfortabel zu filtern, empfehle ich wärmstens ClipClop. Habe es erst kürzlich entdeckt und will seitdem gar nicht mehr mit Trim oder dem holprigen ApplyRange arbeiten. :)
    Nach kurzer Einarbeitung spart man sich mit ClipClop ne Menge Arbeit.

  • Keine Ahnung was ist den nun richtig?

    Ohne eine Wissenschaft draus zu machen

    Zu ClipClop

    Uarg nicht nochmal alles von vorne.

    Bitte mal ein Beispiel geben mit den Angaben hier, Ich will noch noch 2 Tage da dransitzen das zum laufen zu bekommen.

  • Ja wie den nun, das ist wieder mal keine Antwort mit der man was anfangen kann.

    Kann doch nicht so schwer sein ne klare Antwort zu geben. Was da nun hin muss.

    Sorry aber ich sitze seit heute morgen 8 Uhr da dran und so langsam geht mir die Geduld aus.

    Hat da nun erst mal ein o rein und fertig. Bis jemand mal ne klare ansage macht.

  • Na doch. Wenn es mit "function MDeGraintwo(clip last)" funktioniert, ohne dass es Nebeneffekte oder Abstürze gibt, dann ist es "richtig". Ich hab da oben nur meine Bewunderung ausgedrückt, dass ich nicht auf eine so einfache Lösung kam. Als Diplom-Informatiker bin ich eben gewohnt, erst mal "trivial" zu denken...

    :cheers:

Jetzt mitmachen!

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