Arrays

Wie jeder Nutzer von Avisynth weiß, werden Arrays nicht nativ von der Skriptsprache unterstützt.

Allerdings gibt es eine Bibliothek mit dem Namen [AVSLib], die eine funktionale Schnittstelle für die Erstellung und Manipulation von Arrays zur Verfügung stellt. Gekoppelt mit Avisynths OOP-Stil für den Aufruf von Funktionen kann man Arrays als Objekte mit Methoden behandeln, die als Code-Scripting-Konzept vertraut und einfach zu verstehen sind.

Daher sind zwei vorbereitende Schritte nötig, bevor du in der Lage bist, Prozess-Arrays in deinem Skript zu erstellen und zu manipulieren:

Jetzt bist du bereit, dein erstes Array zu erstellen! Für ein fast reales Fallbeispiel nehmen wir das Folgende an (was in vielen Situationen üblich ist) :

Nachdem dies erledigt ist, kommen wir zum eigentlichen Code:

Zuerst erstellen wir das Array. .. 1 .., .. 2 .. usw. sind tatsächlich Dateinamen-Strings. Der Clip wird in diesem Beispiel mit AviSource geladen, aber DirectShowSource kann auch verwendet werden.

inp = ArrayCreate( \
AviSource(..1..), \
AviSource(..2..), \
... \
AviSource(..n..) )

Dann konvertieren wie sie zu gleichen fps, Audio, Farbraum und Größe, indem wir  AssumeFPS, ConvertAudioTo16bit, ConvertToYV12 und BilinearResize bzw. (oder irgendeinenen anderen passenden Resizer) verwenden. Wir verwenden OOP + Verkettung, um kompakte Ausdrücke zu erzeugen.

Beachte, da Avisynth keine Möglichkeit für in-place-Änderung von Variablen zur Verfügung stellt, müssen wir nach jeder Arrayoperation das Ergebnis wieder einer Arrayvariable (in der Regel der gleichen) zuweisen.

inp = inp.ArrayOpFunc("AssumeFPS", "24").ArrayOpFunc("ConvertAudioTo16bit" \
).ArrayOpFunc("ConvertToYV12").ArrayOpFunc("BilinearResize", "640,480")

Zum zuschneiden wollen wir auch Arrays anderer Art verwenden. Unten steht ts für das erste Frame, das ageschnitten werden soll, te für das letzte. Jede Zahl korrespondiert zu einem Clip in der Variable inp.

ts = ArrayCreate(12, 24, ..., 33)       # n Gesamtanzahl
te = ArrayCreate(8540, 7834, ..., 5712) # n Gesamtanzahl

Wir brauchen auch einen Zähler, um die Dinge einfacher zu machen. Wir werden ArrayRange verwenden, um eine Array 0,1,2,... zu erstellen.

cnt = ArrayRange(0, inp.ArrayLen()-1)

Zusätzlich müssen wir eine benutzerdefinierte Funktion definieren, die inp, ts, te und cnt akzeptiert und das Trimmen erledigt.

Da ArrayOpArrayFunc nur zwei Arrays pro Elementverarbeitung akzeptiert, ist es einfacher, "inp" und cnt als Array-Elemente und ts, te als ganze Arrays zu übergeben.

Function MyTrim(clip c, int count, string fs, string fe) {
return c.Trim(fs.ArrayGet(count), fe.ArrayGet(count))
}

Jetzt können wir das Trimmen durchführen:

inp = ArrayOpArrayFunc(inp, cnt, "MyTrim", StrQuote(ts)+","+StrQuote(te))

Wir beenden die Verarbeitung mit einem letzten Optimieren der Helligkeit mit verschiedenen Einstellungen auf jeden Clip und des Farbtons mit gleichen Einstellungen für alle Clips.

bright = ArrayCreate(2.0, 1.5, ..., 3.1) # n Gesamtzahl

Function MyTweak(clip c, float br) {
return c.Tweak(bright=br, hue=12.3)
}

inp = ArrayOpArrayFunc(inp, bright, "MyTweak")

Jetzt können wir die Ergebnisse kombinieren und sie als Output des Skripts ausgegeben. Wir verwenden Dissolve für eine weiche Überblendung.

return inp.ArraySum(sum_func="Dissolve", sum_args="5")

Das war's. Die n-Eingang Clips sind zu einem gemeinsamen Video- und Audio-Format konvertiert, beschnitten und optimiert mit individuellen Einstellungen und kommen als ein einzelner Video-Stream heraus mit nur 11 Zeilen Code (ohne Kommentare).

Andere Arten von Array-Signalverarbeitung sind ebenfalls möglich (in Stücke schneiden, d.h. die Operationen auf eine Teilmenge von Elementen beschränken, zusammenfügen, multiplexen, usw.), aber diese Themen sollten in anderen Seiten besprochen werden. Wer interessiert ist, kann in der AVSLib documentation stöbern. Man kann auch einen genaueren Blick auf die Beispiele der AVSLib Dokumentation werfen.


Zurück zur Scripting Referenz.

$Date: 2008/04/20 19:07:33 $