das zweite script funktioniert, weil direkt im "return" bei jeder Bedingung ein clip zurückgegeben wird (durch das return wird das "last" sozusagen unterdrückt).
Ich glaube auch (da muss ich mal forschen)
- dass eine user-funktion einen Wert zurückgeben MUSS
- an eine Funktion wird alles (auch globale Variablen) nur byvalue (also als Kopie) übergegen. Man kanns daher in der Funktion nicht ändern.
Beiträge von WarpEnterprises
-
-
Welche Fehlermeldung?
Mit oder ohne audio? -
Vielleicht solltest du dir auch nochmal folgendes verinnerlichen:
über das skript wird eine Schnittliste erstellt, das skript wird also "von hinten" in eine Art Zugriffsbaumstruktur zerlegt und NICHT wie ein normales C/Basic-Programm "durchlaufen".
Die obigen Versuche sind eigentlich ziemliche Grenzfälle der skript-Sprache.
Da es sicher noch einige Lücken in der Fehlerbehandlung gibt, kann man grade bei rekursiven skripts schon mal einen crash erreichen.
Im obigen Beispiel fällt mir da folgendes auf.
(1) Die Zeile
StackHorizontal(clip1,Tweak(clip2,bright=counter))
heisst ja
last = StackHorizontal(clip1,Tweak(clip2,bright=counter))
Das wolltest du sicher nicht.(2) eine Funktion, die in der Schnittliste nicht gebraucht wird, wird auch nicht aufgerufen. Da "last" nie zurückgegeben wird, kommen deine Funktionen auch nicht zum Tragen.
(3) Ich glaube, jede user-Funktion muss einen Rückgabewert haben
-
Hier kommt der Avisynth-Archäologe:
-
War früher auch wirklich so (z.B. Version 2.08).
-
-
und ich hab mich schon gewundert, "wo du bleibst"...
Das gute am ScriptClip ist, dass ICH nichts machen muss. :lol:
Du kannst natürlich auch Addborders,... verwenden, um zu zentrieren.
oder mein Zoom-Plugin zum verschieben. -
-
Nachtrag: manchmal denkt man zu kompliziert!
Mit ScriptClip kannst du jetzt schon genau das machen:Code#ScriptClip braucht irgendein Basis-Clip. Muss genau den richtigen Zieltyp/Grösse haben blankclip(width=400,height=200,pixel_type="RGB24") #jetzt CoronaSequence mit ScriptClip JEDEN FRAME aufrufen. #der Filename des Bildes muss mit String und current_frame zusammengesetzt werden #danach resizen - fertig. Und egal, wie gross das Bild ist. #der CoronaSource ist die Grösse auch egal, da für jedes Bild neu initialisiert wird. scriptclip("""coronasequence("d:\avitest\img\puzzle"+string(current_frame,"%03.0f")+".bmp",0,205,25).bilinearresize(400,200)""")
Ist natürlich wesentlich langsamer.
Die """ sind dazu gut, damit IM STRING auch " verwendet werden kann.
Ich werde die andere Möglichkeit trotzdem noch einbauen, aber sag mir, ob du auch mit dieser Lösung zurechtkommst. -
Kannst du etwas genauer beschreiben, wozu die input-Bilder verschieden gross sein müssen bzw. wieso sie es sind?
Die DLL so zu machen, dass sie ein FIXES Format ausgibt und die Bilder darauf plaziert (meinetwegen auch zentriert,...) ist relativ leicht.
Ein Resize passt mir aber nicht recht ins Konzept und die vorhandenen AviSynth-resizer dynamisch anzuzapfen kann ich dzt. auch nicht (obwohl es wahrscheinlich gar nicht mal so schwer ist.)
Übrigens, falls du es nicht ohnehin weisst: PNG unterstützt auch teilweise Transparenz (d.h. einen ECHTEN alpha-Kanal, nicht nur eine alpha-Farbe wie GIF)
-
Gibt's doch alles schon:
Mit CoronaSource aus ImageSequence.DLL
Geht prima (verwende es z.B.fürs rendern in povray, Ausgabe in PNG) -
dazu von mir noch ein bisschen was:
das Wiki:
- geht unbürokratischer zu editieren
- das Layout/die Optik ist und die allgemeine Form ist halt nicht so schön
- die Übersetzung ist leichter, da man sich Seite für Seite vornehmen kann
- alles muss online erfolgen -> nix für 56kdas CVS:
- nicht ganz so einfache Anmeldung und Verbindung (wegen security)
- man kann (hoffentlich) schöne HTM-Seiten erstellen (aber bitte NICHT mit MSWord)
- geht prima offline und dann uploaden
- Übersetzung ist etwas schwieriger, da die englische Version die Henne und deutsch/französisch die Eier sind, die Änderungen erstrecken sich oft auf mehrere Seite und man soll ja auch den Gesamtzusammenhang erhalten (das ist also mehr als blosses Übersetzen)Wilbert: weisst du, was aus jernst und dolemite geworden ist?
-
zum variablen Vergrössern (also abhängig von der framenummer) kannst du auch das Zoom()-plugin verwenden.
-
mit den Formaten ist gemeint, dass das FARB- und das TON-Format gleich sein muss.
AVI ist meist YUY2, MPG meist YV12, du brauchst also irgendein ConvertToXXX.
Ansonsten ist es völlig egal, welche Quelle das Video hat - da kannst du zusammenfügen was du willst. -
* das "?" braucht keine Leerzeichen drumrum
* "mode" "bewirkt" nix sondern ist nur mein Zwischenspeicher, damit das ganze lesbarer wird (weil eben AviSynth kein "schönes" if-then-else kann
* dass ich mehrmals "mode = " -Zeilen habe, soll es auch nur besser lesbar machen. Im Prinzip könnte man eine lange Wurscht machen, nur dann ist sonst echt niemandem geholfen.
* der Trick kommt dann mit dem Select - netter Befehl, der recht selten "erwähnt" wird, aber wie hier exakt passt (hoffentlich gut genug beschrieben in syntax.htm)Alles klar?
-
Bitte schön - hier die "Vollversion". Die vielen Fallunterscheidungen kommen davon, dass ja auch frame 0-0 oder 1-1 oder 0-1 etc. gehen soll, beim Trim aber der zweite Wert "0" das ganze Clip nehmen würde.
#Beispiel: roter Block auf Version() drauf
s=version().trim(0,100)
Block(s,0,2, 10,15, 20,25,$FF0000)
return last#zwei user-Funktionen, die ich dazu brauche: diese können auch als .avsi-Datei im plugin-Verzeichnis abgespeichert werden, dann kennt AviSynth sie immer und in deinem Script muss nur "Block(...)" stehen.
function Block(clip c, int von, int bis, int _x, int _y, int _width, int _height, int _color) {
#overlays a block
block = blankclip(c, color=_color, width=_width, height=_height)
ov=overlay(c,block,x=_x,y=_y)
return SwitchClip(c,ov,von,bis)
}function SwitchClip(clip c1, clip c2, int frame_start, int frame_end) {
# switches between c1 and c2 from frame_start to frame_end
# 0 : illegal
# 1 : m-n
# 2 : 0-0
# 3 : 0-n
# 4 : 1-1
# 5 : 1-nmode = 1
mode = frame_start==0 ? (frame_end==0 ? 2 : 3) : mode
mode = frame_start==1 ? (frame_end==1 ? 4 : 5) : mode
mode = ( frame_start>frame_end? 0 : mode)return select (mode, \
c1, \
trim(c1,0,frame_start-1) ++ trim(c2,frame_start,frame_end) ++ trim(c1,frame_end+1,0), \
trim(c2,0,-1) ++ trim(c1,1,0), \
trim(c2,0,frame_end) ++ trim(c1,frame_end+1,0), \
trim(c1,0,-1) ++ trim(c2,1,1) ++ trim(c1,2,0), \
trim(c1,0,-1) ++ trim(c2,1,frame_end) ++ trim(c1,frame_end+1,0) \
)
} -
Das mit dem Overlay ist schon recht optimal, wenn du das oft brauchst, musst du eine benutzerdefinierte Funktion schreiben (nicht in C sondern im AviSynth) die genau das macht und als Eingabevariablen deine Werte nimmt.
also sowas wie:function block(clip c, int x, int y) {
blockclip = blankclip(c,...)
return overlay(..blockclip,... x , y,...)
}Schreib mal genau deine Vorstellungen (also was genau sich bei bei den verschiedenen Stellen ändern und wie)
-
nochmal von vorne:
- mit welchen playern, AviSynth version und OS testest du?
- ist nach dem AviSynth das Bild und der Ton async oder die Untertitel und der Ton?
- was für ein AVI ist es (besonders: welches Audioformat) -
C3D ist weiters recht tolerant in den Einstellungen.
Auch wenn man (zu) "hohe" Werte nimmt, kommen nicht gleich eklatante Artefakte, bei vielen anderen Entrauschern ist das gar nicht so. Der Prinzip des Algorithmus ist halt genial einfach. -
sorry, hatte kleinen Auslassfehler:
es muss heissena_len = int(AudioLength(audio)*FrameRate(audio)/AudioRate(audio))
dass ist dann eine Ganzzahl (sonst meckert Trim) und auch schon in frames.