Hallo,
ich bin am Wochenende beim surfen wiedermal über den Restore24-Filter von Didee (?) gestolpert und in der Folge über eben diese Thread. Also wollte ich mal mein Glück an Avisynth unter Linux versuchen - folgendes ist dabei bislang rausgekommen. Die Quellen habe ich aus dem CVS vom 20.03.2007, zwischenzeitlich scheint sich auch nichts mehr getan zu haben. Distribution ist Debian testing/unstable, wahlweise auf i386 (Laptop) oder amd64 (Desktop).
Die vorrausgesetzte Software war soweit in Form von Debian-Paketen vorhanden, bis auf zwei Ausnahmen. Zum einen bedurfte das x264 Paket einer Modifikation, um es mit GUI zu übersetzen. Und dann war da noch die libboost, für die bei Debian der circular-buffer nicht als Paket vorhanden ist. Daher habe ich diesen im Avisynth-Quellverzeichnis entpackt und dort mit relativem Pfad eingebunden ('#include "..."' statt '#include <...>'). Dementsprechend konnte ich auch die Überprüfung auf circular-buffer in der Datei build/linux/m4/boost.m4 entfernen.
Nachdem die Vorarbeit geleistet war, gings ans Kompilieren. Hier trat die nächste Wiedrigkeit auf - in src/bin/encode.c fehlte ein dritter Parameter an die Funktion avs_clip_new_from_file(). Somit habe ich diesen dort hinzugefügt, per copy and paste nach dem Beispiel aus src/bin/open.c inklusive der folgenden Fehlerbehandlung. Keine Ahnung, was die genau macht, aber nun ließ sich das ganze immerhin übersetzen.
Gesagt, getan. Als Resultat der Mühen fand ich eine ausführbare Datei "build/linux/build/avisynth_test". Als ich darin nun mittels "File" -> "Open" eine Video-Datei öffnen wollte, schloss sich das Programm aber recht schnell mit einer Exception (irgendwas in der Richtung "cannot create (Font) Face"). Der Grund dafür war ein absoluter Pfad zu einer Schriftart Arial ("C:\\WINNT\\Fonts\\Arial.ttf") in der Datei src/filters/source/messageclip.cpp. Also gut - quick and dirty einen ehr Linux/Unix typischen Pfad hinein-gehackt und neu kompiliert.
Nach dem Bestätigen des Öffnen-Dialogs in "avisynth_test" tritt nun keine Exception mehr auf. Allerdings wird mir auch kein Video-Bild angezeigt. Die "File Information" sagt mir:
Video stream Size: 378x107 [richtig wäre 720x576] Framerate: 25/1 (25.000) [richtig] Frame count: 25 [richtig wäre 500] Time: 1.0 [auch falsch] Audio stream No audio stream [richtig]
Bei der geöffneten Datei handelte es sich um einen MPEG2-Video Elementary Stream, den ich mir irgendwann mit dem "mpeg2enc" aus den mjpegtools habe erstellen lassen. Auch bei anderen Videos ändern sich die angezeigten Daten nicht. So langsam vergeht mir die Motivation.
Also gut - wozu lässt sich Avisynth unter Linux gebrauchen? Wie bedient man es? Gibt es ein Command Line Interface? Wo ist die Dokumentation? Nein, ich meine ich die Klassen-Dokumentation
Vielleicht sollte ich noch erwähnen, dass ich mich nie mit den Windows-Tools zur Video be- und verarbeitung beschäftigt habe. Das meiste habe ich bislang unter Linux mit transcode, mencoder und co erledigt. Dementsprechend ist Avisynth für mich völliges Neuland.
Hier noch ein diff der Dateien, die ich modifizieren musste, um avisynth_test gangbar zu machen - quick and dirty, wie gesagt.
$ pwd
/usr/src/avisynth-cvs20070320
$ cvs diff -u ./src/bin/encode.c ./src/filters/source/messageclip.cpp
Index: ./src/bin/encode.c
===================================================================
RCS file: /cvsroot/avisynth2/avisynth/src/bin/Attic/encode.c,v
retrieving revision 1.1.2.5
diff -u -r1.1.2.5 encode.c
--- ./src/bin/encode.c 21 Aug 2006 18:39:15 -0000 1.1.2.5
+++ ./src/bin/encode.c 22 Mar 2007 14:58:58 -0000
@@ -245,10 +245,43 @@
AVS_VideoInfo *info;
AVS_ColorSpace *csp;
AVS_ColorSpace_Id csp_id;
+ AVS_Error *error = NULL;
if (!data->env)
data->env = avs_environment_new (10000000);
- data->clip = avs_clip_new_from_file (data->filename, data->env);
+ data->clip = avs_clip_new_from_file (data->filename, data->env, &error);
+
+ if (!data->clip) {
+ GtkWidget *dialog;
+
+ if (error) {
+ dialog = gtk_message_dialog_new (GTK_WINDOW (data->window),
+ GTK_DIALOG_DESTROY_WITH_PARENT,
+ GTK_MESSAGE_ERROR,
+ GTK_BUTTONS_CLOSE,
+ "Avisynth error (%d): %s",
+ avs_error_code_get (error),
+ avs_error_message_get (error));
+ g_print ("error : %s\n", avs_error_description_get (error));
+ gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
+ avs_error_description_get (error));
+ }
+ else {
+ dialog = gtk_message_dialog_new (GTK_WINDOW (data->window),
+ GTK_DIALOG_DESTROY_WITH_PARENT,
+ GTK_MESSAGE_ERROR,
+ GTK_BUTTONS_CLOSE,
+ "Internal error");
+ gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
+ "memory allocation failure");
+ }
+ g_print ("ERROR\n");
+ gtk_dialog_run (GTK_DIALOG (dialog));
+ gtk_widget_destroy (dialog);
+ return -1;
+ }
+
+
info = avs_clip_videoinfo_get (data->clip);
if (!avs_videoinfo_has_video (info)) {
Index: ./src/filters/source/messageclip.cpp
===================================================================
RCS file: /cvsroot/avisynth2/avisynth/src/filters/source/Attic/messageclip.cpp,v
retrieving revision 1.1.2.4
diff -u -r1.1.2.4 messageclip.cpp
--- ./src/filters/source/messageclip.cpp 15 Jul 2005 21:49:50 -0000 1.1.2.4
+++ ./src/filters/source/messageclip.cpp 22 Mar 2007 14:58:59 -0000
@@ -44,7 +44,7 @@
MessageClip::MessageClip(std::string const& msg, CPVideoInfo const& vi, PEnvironment const& env)
- : StaticImage( CreateFrame(msg, text::freetype::Font("C:\\WINNT\\Fonts\\Arial.ttf", 28), vi->GetDimension(), vi->GetColorSpace(), env), vi )
+ : StaticImage( CreateFrame(msg, text::freetype::Font("/usr/share/fonts/truetype/msttcorefonts/Arial.ttf", 28), vi->GetDimension(), vi->GetColorSpace(), env), vi )
, msg_( msg ) { }
@@ -67,7 +67,9 @@
{
using namespace text::freetype;
- Font font("C:\\WINNT\\Fonts\\Arial.ttf", 28);
+ // Font font("C:\\WINNT\\Fonts\\Arial.ttf", 28);
+ Font font("/usr/share/fonts/truetype/msttcorefonts/Arial.ttf", 28);
+
DimensionFP6 dimFP6 = font.GetTextBoundingBox(msg).GetDimension();
Dimension dim( dimFP6.GetWidth().GetRoundedUp(), dimFP6.GetHeight().GetRoundedUp() );
Alles anzeigen