PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Die Syntax bringt mich um...


Kika
16. April 2005, 16:09
Hallo,

ich experimentiere gerade ein wenig. Aktuell bin ich dabei, aus 4:3-Videos 16:9 letterboxed zu kreieren (über den Sinn und Unsinn mag man streiten, ich mach's halt).

Dazu habe ich mir zwei kleine Funktionen erstellt:

function rangecrop16_9(clip i, int top, int start, int end)
{
Trim(i, start, end).crop(0,top,704,432)
}

function pan_rangecrop16_9(clip i, int s_top, int e_top, int start, int end)
{
Trim(i, start, end).Animate(0,end-start, "crop", 0,s_top,704,432, 0,e_top,704,432)
}

Die erste schneidet im Bereich start(frame) bis end(frame) von oben "top" Pixel ab, die zweite verschiebt dabei das Bild gleich noch vertikal im Bereich zwischen "s_top" und "e_top".
Zuvor wird mit KernelBob() ein quasi progressives Video erzeugt, um das Interlacing nicht aus dem Tritt zu bringen.
Das klappt auch alles wunderbar.

Um jetzt bei etlichen Szenen, für die ich jeweils ein anderes Cropping benutzen muss, nicht jedes Mal alles direkt eingeben zu müssen, wollte ich gerne mit einer Art Parameterliste arbeiten:

Allgemeiner Top-Crop, Menge der Croppings, Art des jeweiligen Croppings, Parameter des jeweiligen Croppings.
Am Ende sollen dann alle Croppings zusammen gesetzt werden und Szenen, die nicht betroffen sind, mit dem allgemeinen Top-Crop beschnitten werden.

Aber irgendwie finde ich keine geeignete Form, solch eine Parameterliste anzulegen und auszulesen.
Könnte mal bitte jemand den Nebel um meinen Geist etwas lichten?

Gruß,
Kika


BTW: Kann es sein, dass LeakKernelBob() im Gegensatz zu KernelBob() mal wieder das Fieldorder-Flag ändert?

LigH
16. April 2005, 16:23
Soweit ich mich erinnere, sind "Arrays" nicht vorgesehen.

Außerdem steige ich noch nicht so ganz durch, was du möchtest - vielleicht würden ein paar konkrete Beispiele helfen (auch Beispiele dafür, wie es unvorteilhaft wäre).

Kika
16. April 2005, 16:45
Nun gut...

Ich schaue mir die Szenen, die ich so bearbeiten will an und notiere entsprechende Parameter. Für jede einzelne Szene, bei dem ich ein anderes als das Standard-Cropping benötige, muss ich auf diese Weise jeweils den kompletten Befehl eingeben und einen neuen Clip erzeugen, die dann am Ende zusammen gesetzt werden müssen.

Um das zu autmatisieren, bin ich auf die Idee gekommen, die Parameter in einen String zu schreiben und den mittels Eval und MidStr zu bearbeiten - wozu ich dann wieder eine Schleife benötige.

Der String könnte so aussehen:

Liste="2,74,r,16,20,200,p,4,64,220,230"

2 wäre die Gesamt-Anzahl der Croppings, die 74 wären der Allgemeinwert. r stünde für Rangecrop16_9(), p stünde für pan_rangecrop16_9(), der Rest wären die Parameter für die Croppings bzw. die jeweilige Crop-Funktion.

param1=MidStr(liste, 9,17)
Das ergäbe dann die Parameter für den ersten Crop (namlich 16,20,200), aufgerufen mit
eval("rangecrop16_9(clip," + param1 +")")

Die Steuer-Funktion soll also erkennen, dass sie 2Mal croppen soll. Einmal mit der einen, einmal mit der anderen Croppfunktion. Das sowie den Menge der Parameter müsste man ja aus dem Kennbuchstaben herauslesen können. Dass manche Parameter auch noch unterschiedlich lang sind, erkennt man ja an den Kommas. Alle Frames, die nicht aufgelistet sind, sollen mit dem Allgemeinwert gecroppt werden.
Und am Ende soll ein einziges Video in der Originalreihenfolge der Szenen entstehen.

Kompliziert, geb' ich zu.

scharfis_brain
16. April 2005, 17:05
es gibt doch nen conditionalreader()
guck mal, ob Du damit weiterkommst.

ich hab ihn noch nie verwandt, da ich lieber scripte schreibe, die volladaptiv arbeiten.

klar, dass das in Deinem Fall nicht geht.

und jo, auch nach diskussionen wollte leak es nicht implementieren, dass die fieldorderinfo mitgeschliffen wird.
leakkernelbob(...) verhält sich in dieser hinsicht wie bob()
es setzt die fieldorder immer auf BFF!

Kika
16. April 2005, 17:12
es gibt doch nen conditionalreader()
guck mal, ob Du damit weiterkommst.

Den habe ich auch noch nicht benutzt, kam mir nicht so ganz geheuer vor. ;)

Aber generell macht mir auch eher die Schleifenprogrammierung Schwierigkeiten. Mit MidStr() und Eval() komme ich klar.
Ist halt viel zu lange her, dass ich mal programmiert habe, und die dabei verwendete Syntax/Notation war eben eine andere. Für mch wäre das fast einfacher, wenn ich's mit Assembler zu tun hätte.

Aber ich seh' schon..., der ConditionalReader wird wohl die einzig praktikable Lösung sein. Befreit mich aber auch nicht von der Last, eine Schleife erzeugen zu müssen.

leakkernelbob(...) verhält sich in dieser hinsicht wie bob()


Dacht' ich's mir doch... :(
Vertrauensseelig wie ich bin, habe ich etliche Szenen zur Probe mit dem Leak encoded, ohne das vorher zu überprüfen... Na ja, selbst schuld.

Kika
16. April 2005, 18:28
Heureka! Es klappt, es klappt sogar perfekt!

Hätte ich mir den ConditionalReader nur mal früher angeschaut..., das hätte viel Zeit und Kopfzerbrechen gespart.
Die Lösung liegt im ConditionalReader, kombiniert mit ScriptClip.

Das folgende Miniscript verschiebt den Bildausschnitt erst hoch, dann wieder runter. Alle nicht in der Parameterdatei explizit angegebenen Frames werden dabei mit dem Defaultwert gecroppt.

ScriptClip("crop(0,myvar,704,432).Addborders(0,64,0,64)")
ConditionalReader("croppings.txt", "myvar")

Die Parameterdatei croppings.txt sieht so aus:

Type int
Default 64
I 0 240 64 2
I 241 300 2 64


Das ist auch schon alles. Ganz einfach, wenn man's erstmal begriffen hat. :)

P.S.
Nicht über die seltsamen Border wundern, das Ausgangsvideo ist schon gecroppt auf 704x560.

Kika
18. April 2005, 10:58
Wie schon gesagt, funktioniert das so wie zuletzt beschrieben tadellos. Ich habe gestern damit mehrere Sequenzen bearbeitet und bin mit den Ergebnissen sehr zufrieden. Allerdings würde ich mir sowas wie einen "dynamischen Letterboxer" wünschen. Ein Tool, bei dem man einen 704x432-Rahmen über das Videobild legen, verschieben und die Werte in eine Datei schreiben kann. Würde viel Arbeit ersparen, geht aber auch so einigermaßen schnell.

Allerdings bleibe ich bei der Kernaussage: Die AVISynth-Syntax bringt mich echt um.
Wieso ich z.B. im ScriptClip-Befehl die Variable "myvar" benutzen kann, obwohl sie erst danach im ConditionalReader definiert wird, ist mir nicht klar.

Wilbert
19. April 2005, 23:42
Wieso ich z.B. im ScriptClip-Befehl die Variable "myvar" benutzen kann, obwohl sie erst danach im ConditionalReader definiert wird, ist mir nicht klar.
Guck mal nach "Advanced conditional filtering: part I" in

http://www.avisynth.org/ConditionalFilter