Schleifen in AviSynth

  • Hallo
    wie ist die Verwendungsweise von Schleifen bzw. Blockanweisungen in AviSynth?
    Ich finde dazu bisher nur sehr unzureichende Dokumentation.
    Konkret steht bei mir folgendes an:

    Für i=0 bis i=81 in 9er Schritten, bitte neuer_clip= neuer_clip +Trim(quell_clip, i, i+27),

    also ein Quasiloop, ein Clip soll entstehen aus dem Aneinanderfügen von (ca.)Sekundenausschitten aus dem Quellclip, die jeweils immer etwas weiter vorn starten.

    Vielen Dank

  • :welcome:

    Soweit ich weiß, gibt es in AviSynth keine Schleifen und keine Rekursion. Außer durch ein Plugin, das so etwas nachahmt (z.B. GScript).

    Dein spezieller Fall wird eventuell abgedeckt durch SelectRangeEvery ... außer dass sich bei dir anscheinend die Bereiche überlappen.

  • Es scheint schon irgend etwas in der Art zu geben laut http://avisynth.org/mediawiki/Block_statements
    Ich steige aber durch die Erklärungen nicht durch.
    Dein Hinweis ist sehr viel versprechend, danke. Ich probiere es nachdem ich meine Anfängerprobleme ganz anderer Art (du hast mir auf den anderen Thread schon geantwortet, auch danke) überwunden habe.
    Und ja die Clipausschnitte überlappen sich massenhaft.

  • Nun ja, so schwierig sieht das ForNext-Statement gar nicht aus ... wichtig ist, dass die in der Schleife auszuführenden Befehle in einer Zeichenkette unterkommen (die durch eval() ausgewertet wird). Und die wird am sichersten in dreifachen Anführungszeichen umschlossen.

    Im Grunde steht ja schon alles in den Beispielen. Setze cnt auf 9, ersetze die 5 mit 81, die -4 mit -27 (oder -28?), und lass die zwei Zeilen mit "cond" weg.

  • Was muss man denn da an Plug Ins installieren damit ForNext-Funktion läuft? Mit meinem Basic-AviSynth läuft die nicht.
    __

    Habe nun eine For-Schleife des GScripts ausprobiert und es läuft wie gebuttert. Auch die Syntax ist für mich zugänglicher als die von ForNext .
    Danke
    __

    Vorschnell gefreut:

    ich schreibe

    loadplugin("GScript.dll")
    a = AviSource("Ikarus01_01.avi")
    b= Trim (a, 0, -1)
    GScript("""
    for ( i = 0 , 90 , 3 ) {
    c = Trim(a, i, -18)
    b = b + c
    }
    """)
    return b

    und es läuft. Ich füge was hinzu

    loadplugin("GScript.dll")
    a = AviSource("Ikarus01_01.avi")
    b= Trim (a, 0, -1)
    GScript("""
    for ( i = 0 , 90 , 3 ) {
    c = Trim(a, i, -18)
    b = b + c + Reverse(c)
    }
    """)
    return b

    und kreige die Meldung:
    Avisynth read error:
    CAVIStreamSynth: System exception - Access Violation at 0x2111879, writing to 0x3ecd000

    Ich füge SetMemoryMax (128) zu Anfang des Scripts und es wird noch schlimmer mit der Fehlermeldung und Avisynth open failer: Avisynth: script open failed! davor

    Einmal editiert, zuletzt von LigH (31. Mai 2010 um 06:12) aus folgendem Grund: Bitte keine "Selbstgespräche" führen, sondern "Ändern" und hinzufügen!

  • Was muss man denn da an Plug Ins installieren damit ForNext-Funktion läuft? Mit meinem Basic-AviSynth läuft die nicht.



    Tja, aber so, wie das in der Dokumentation von AviSynth Version 2.58 erwähnt wurde, müsste es eigentlich mit AviSynth 2.58 ohne Plugins laufen... oder?!

    Anscheinend ist es leicht, in dieser Dokumentation zu überlesen, dass es sich in diesem Bereich mehr oder weniger nur um eine Diskussionsgrundlage handelt: Es liegt anscheinend am Anwender, eine Funktion "ForNext()" erst mal zu implementieren; deren Quelltext ist hier überhaupt nicht dokumentiert worden.
    __

    Zu deinem letzten Fehler:

    Es kann passieren, dass du mit "SetMemoryMax(128)" den erlaubten Speicherverbrauch wesentlich mehr eingeschränkt hast als ohne. Und bedenke, dass AviSynth unter Umständen so oft einen Teil des Videoclips im Speicher halten muss, wie die Schleife durchlaufen soll (oder gar ein Mehrfaches davon; gerade Reverse() braucht noch 'ne Extra-Kopie).

    Auch könnte es sein, dass explizite Programmierung mit einer Variablen mehr hier sicherer ist:

    c = Trim(a, i, -18)
    cr = c.Reverse()
    b = b + c + cr

Jetzt mitmachen!

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