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.