Hallo,
ich nutze AviSynth für meine "Versus" Videos. Die Möglichkeiten die es mir bietet, übertrifft so ziemlich alles was ich mit "normaler" Video-Software erreichen kann. Vor allem im kostenlosen Bereich. Ein Feature welches ich besonders mag, ist "Animate".
Für mein aktuelles Projekt würde ich gerne eine Laufschrift realisieren. Der alte Punktestand läuft aus dem Bild raus, während der neue Punktestand dessen Platz einnimmt. Das klappt an sich auch ganz gut. Mein Problem ist jetzt aber, dass die Laufschrift für genau einen Frame an - zumindest für mich - zufälligen Ort platziert wird.
Hier mal ein paar Screenshots:
[Blockierte Grafik: http://imageshack.us/a/img812/2038/spj9.th.png]
(Vor der Animation)
[Blockierte Grafik: http://imageshack.us/a/img22/7484/d4ma.th.png]
(1 Bild vor dem "Bug")
[Blockierte Grafik: http://imageshack.us/a/img28/9366/sgiv.th.png]
(Bild mit dem "Bug")
[Blockierte Grafik: http://imageshack.us/a/img546/2227/wzu4.th.png]
(1 Bild nach dem "Bug")
[Blockierte Grafik: http://imageshack.us/a/img19/7641/nm6m.th.png]
(Vorläufiges Ende der Animation)
Und hier der dazu gehörige Quelltext:
Function ChangeScore( clip aClip, string aPlayer, string aType, int aStart, int aEnd ) { # Zentrum des Punktestandes ermitteln lX = ( aPlayer == "d" ) || ( aPlayer == "D" ) ? 180 : 1740 lY = 196 # Untere Linie des Punktestandes lEnd = aEnd <= 0 ? aClip.FrameCount() : aEnd - 1 # Ende der Anzeige des Untertitels # Punkte anhand der Erfolges vergeben lPoints = ( aType == "h" ) || ( aType == "H" ) ? 3 : 0 lPoints = ( aType == "b" ) || ( aType == "B" ) ? 2 : lPoints lPoints = ( aType == "n" ) || ( aType == "N" ) ? 1 : lPoints # Nachricht auswählen lMessage = ( aType == "h" ) || ( aType == "H" ) ? "Haupt (" + string( lPoints ) + ")" : "" lMessage = ( aType == "b" ) || ( aType == "B" ) ? "Bonus (" + string( lPoints ) + ")" : lMessage lMessage = ( aType == "n" ) || ( aType == "N" ) ? "Neben (" + string( lPoints ) + ")" : lMessage # Aktuellen Punktestand auswählen lDisplayScore2 = string( ( aPlayer == "d" ) || ( aPlayer == "D" ) ? gDomenik : gChris ) # Punktestand des Spielers aktualisieren global gDomenik = ( aPlayer == "d" ) || ( aPlayer == "D" ) ? int( gDomenik ) + int( lPoints ) : int( gDomenik ) global gChris = ( aPlayer == "c" ) || ( aPlayer == "C" ) ? int( gChris ) + int( lPoints ) : int( gChris ) # Neuen Spielstand zwischenspeichern lDisplayScore = string( ( aPlayer == "d" ) || ( aPlayer == "D" ) ? gDomenik : gChris ) # Animation durchführen # Art des Erfolges einfliegen lassen aClip=aClip.Animate( aStart , aStart+29 , "subtitle", lMessage , -100, 100, aStart, aStart+100, "Verdana", 48, $FFFFFF, $000000, 3, lMessage , 180, 100, aStart, aStart+100, "Verdana", 48, $FFFFFF, $000000, 2 ) # Neuen Punktestand einfliegen lassen aClip=aClip.Animate( aStart+15, aStart+29+15, "subtitle", lDisplayScore , 0, lY, aStart, aStart+100, "Verdana", 96, $FFFFFF, $000000, 3, lDisplayScore , 180, lY, aStart, aStart+100, "Verdana", 96, $FFFFFF, $000000, 3 ) # Alten Punktestand rausfliegen lassen aClip=aClip.Animate( aStart , aStart+29+15, "subtitle", lDisplayScore2, lX, lY, aStart, aStart+100, "Verdana", 96, $FFFFFF, $000000, 2, lDisplayScore2, -200, lY, aStart, aStart+100, "Verdana", 96, $FFFFFF, $000000, 2 ) Return aClip}
Ich benutze diese Funktion wie folgt: (Entspricht dem obigen Screenshots)
Randnotiz: Die Anzeigedauer ist absichtlich nicht auf die volle Länge eingestellt, da ich an diesem Effekt arbeite.
Ist das ein Bug oder mache ich etwas falsch? Bevor ich es vergesse ... Mir ist bekannt, dass ich den Wert von "align" von 2 auf 3 ändere. Dies auf "von 2 auf 2" zu setzen, ändert jedoch nichts.
Ich hatte dieses Problem schon einmal, habe mich aber im vorherigen Fall entschieden einen anderen Effekt einzusetzen.
Das würde ich hier gerne vermeiden. Und manuelles Nachbearbeiten fällt auch weg.
Über eure Hilfe würde ich mich natürlich sehr freuen.
Gruß
Chris.