AnotherUnblendPattern() (?)

  • Hallo

    Ich denke mal, das Forum ist richtig hierfür.

    Ich hatte mal versucht, die Funktion UnblendPattern zu verstehen. Damit keine Missverständnisse auftreten, ich beziehe mich auf die folgende - möglicherweise schon veraltete - Version (Zeilen etwas umgebrochen):


    function unblendpattern(clip clip, int offset,
    \ float fps, bool refitfps, bool debug)
    {
    a = (debug == true) ? clip.ShowFrameNumber() : clip
    b = changefps(trim(a,0,-1),framerate(a)*100).assumefps(framerate(a))
    out = (offset == 0) ? changefps(a, fps) :
    \changefps((b.trim(0, -offset) + a), fps)
    out = out.trim(int(offset / (framerate(a)/fps)) , 0)
    out = (refitfps == true) ? out.assumefps(framerate(a)/2, true)\
    .resampleaudio(audiorate(a)) : out
    return out
    }

    Wenn ich es richtig sehe, wird der erste Frame nur ein paar mal dupliziert (offset), dann mit changeFPS() die gewünschte Anzahl Frames rausgeschnitten und am Schluß noch ein bisschen mit audio und fps rumgefummelt. (Tschuldigung, war vermutlich eine Menge Arbeit).

    ChangeFPS() scheint sich aber ziemlich stur zu verhalten und bei einer gegebenen Konvertierung SourcFPS -> TargetFPS immer dieselben Frames übrig zu lassen, unabhängig vom Filmmaterial. Bei 50->24FPS zum Beispiel die Frames: "0, 2, 4, 6, 8, 10, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 38, 40, 42, 44, 46, 48". Das brachte mich auf die Idee, das ganze mit SelectEvery nachzubilden (erster Entwurf):


    function AnotherUnblendPattern(clip c, int Period,
    \ string SelectFrames, int StartFrame)
    {
    offset = Period - (StartFrame % Period)
    a = (offset == 0) ? c : blankclip(c, offset) + c
    a = eval("a.SelectEvery(" + string(Period) + "," + SelectFrames + ")")
    return a
    }

    Kurze Erklärung:
    Period gibt die Länge der Sequenz an, die man
    untersucht hat um ein Pattern zu finden,
    das sich dann hoffentlich mit dieser Periode
    wiederholt. (Zum Beispiel 50)
    SelectFrames enthält eine kommaseparierte Liste der Frames,
    die übrigbleiben sollen (also die guten). Der erste
    Frame einer Periode hat die Nummer 0; am besten in
    VirtualDub(Mod) alles vor der untersuchten Sequenz
    erst mal wegschneiden.
    StartFrame ist die absolute Nummer des ersten Frames der
    untersuchten Sequenz. Der Offset wird daraus berechnet,
    ich glaube, das stimmt so auch.

    Nach dem Aufruf der Funktion muß man vorne noch ein paar schwarze Frames wegschneiden. Außerdem muß man sich noch um die Framerate kümmern: untersucht man eine 1 Sekunde lange Sequenz, hat der Ergebnisclip natürlich eine Framerate, die der Anzahl der Frames in SelectFrames entspricht. Die genaue Formel müsste sein:

    Framerate(a) = Framerate(c) * nFrames/Periode

    mit nFrames der Anzahl der Frames in SelectFrames.Auch dazu kann man noch eine Zeile in die Funktion einbauen (Umwandlung in eine gewünschte FPS-Zahl). Die Audiospur scheint synchron zu bleiben (?).

    Grossartig getestet habe ich es aber noch nicht, die Idee kam mir erst im Verlauf des Abends. Aber ein paar Vergleiche mit UnblendPattern. So liefert der Aufruf:

    f1 = f.AnotherUnblendPattern(50, "0,2,4,6,8,10,13,15,17,19,21,"
    \"23,25,27,29,31,33,35,38,40,42,44,46,48", 0)

    bei einem 50FPS Clip dasselbe wie

    f2 = f.UnblendPattern(0, 24, false, false)

    wie man mit Subtract(f1,f2) leicht feststellen kann.

    Man muß zur Synchronisierung aber vorne noch ein paar Frames wegschneiden. Ich glaube, auch bei UnblendPattern bleibt vorne schon mal einer der duplizierten Frames zuviel übrig. Wenn der Startframe bzw. der Offset von 0 verschieden sind, wird es etwas schwieriger die genauen Werte zu finden, aber es geht. Die Funktion scheint also dasgleiche Ergebnis zu liefern, ist aber einfacher zu handhaben (keine Offsetsuche) und flexibler (beliebiges Pattern). Möglicherweise lassen sich durch einen mehrfachen Aufruf hintereinander auch kompliziertere Blendings entfernen (scheinbar unregelmäßige, die durch Überlagerung zweier regelmäßiger entstehen)?!

    Vielleicht hilft der Ansatz ja weiter.

  • hehe. Was Du vorschlaegst ist ein Rueckschritt, denn mit selectevery habe ich angefangen.

    klar selektiert changefps immer - zyklisch natuerlich - die gleichen frames.
    das ist doch auch sinn und zweck der ganzen aktion.

    Da man aber mit selectevery nicht jede beliebige Framerate abgedeckbekommen
    (man muesste endlos viele Presets aufwaendigst ermitteln....)

    So hat man ein kleines, aber feines Werkzeug, um zykische, mathematisch ausbalancierte Patterns manuell zu dezimieren.

    Diese Funktion entstand vor ca. nem halben Jahr. (kommt das hin, Baroenchen?)
    Da hatte BaronVlad nen Film gecaptured, der auf 26fps beschleunigt wurde...

  • Ich wage es schon gar nicht mehr, meine Funktion "Funktion" zu nennen, ist ja nur SelectEvery mit Offset.

    Bei der Erklärung zu UnblendPattern hatte ich einiges missverstanden: die Suche in den 50 Frames soll gar nicht das komplette Muster enthüllen, sondern nur die Framerate liefern? Ich hielt das für einen nützlichen Nebeneffekt. Das Muster selbst kann viel länger sein?

    Die Offsetwerte wurden auf 0 - 100 beschränkt. Theoretisch könnte die Periode des Musters auch länger sein und damit auch der Offset höher. Oder kommt das praktisch wegen der angewendeten Methoden bei der Filmverschandelung nicht vor?

    Außerdem soll UnblendPattern() auch die doppelten Frames wegschneiden?

    Der Unterschied zu SelectEvery() liegt wohl darin, das durch die geringfügige Änderung der Framerate sich die Abstände zwischen den Sprüngen, die ChangeFPS im ansonsten regelmäßigen Muster macht, verändern? Und damit diese längeren Zyklen nachgebildet werden können?

    Wenn das stimmt, ergibt sich aber theoretisch bei der Anwendung noch ein Problem:
    Angenommen ich untersuche bei Frame #50000 und habe einen guten Offset gefunden. Wenn ich jetzt noch die Framerate geringfügig ändere, um eine etwaige Drift zu beseitigen, driftet auch das Muster unter dem von mir untersuchten Bereich weg, schließlich beginnt ChangeFPS immer am Beginn des Videos. Ich muß also wieder einen neuen Offset suchen. Eine furchtbare Iteration beginnt. Irgendwie sollte der Offset mit der Framerate gekoppelt werden.

    Falls diese Überlegung richtig ist, könnte eine Lösung möglicherweise so erfolgen (ich bin mir nicht wirklich sicher):
    Zwei zusätzliche Parameter: DeltaFPS und Startnummer
    anstatt FPS geringfügig zu ändern, ändert man nun DeltaFPS (Default=0.0)
    Startnummer enthält die Nummer des untersuchten Bereichs
    Aus dem Verhältnis von DeltaFPS zu FPS sollte sich "eigentlich irgendwie" errechnen lassen, wieviele Frames vor Startnummer dazukommen oder verschwinden, und der Offset sich entsprechend anpassen lassen.


    Oder ist das schon wieder alles Müll?

  • Oder ist das schon wieder alles Müll?

    Nicht alles ;)

    Genau diese Frage mit dem Offset bei krummen Dezimierungsverhaeltnissen hatte ich mir aber auch schon gestellt....
    Und ich bin zu keine Vernuenftigen loesung gekommen.

    also: tu Dir keinen Zwang an... :)

Jetzt mitmachen!

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