AVISynth-Script --> Bild --> C++

  • Hallo,

    weiß jemand wie man die Bilder die durch ein AVISynthScript erstellt werden in C++ an ein Objekt (Panel,Bitmap-Object ...) übergibt oder wo ich sowas nachlesen kann?

    greets
    LTJ

  • Ja, das ist so in etwa das was ich gesucht habe.

    Hab hier noch eine API-Referenz für AVISynth C mit kleinem Beispiel gefunden.
    http://kevin.atkinson.dhs.org/avisynth_c/api.html
    Das ist auf jeden Fall für den Einstieg noch ne Ecke einfacher. Leider sind die meisten Funktionen schon wieder nur aufgelistet und nicht richtig erklärt.
    Ehrlichgesagt finde ich es auch nicht gerade clever von den AVISynth-Entwicklern die API so schlampig zu erläutern, wenn sie doch so sehr nach Programmierern von Filterplugins lechzen. Generell würde jeder Programmierer, wenn die Möglichkeit besteht, einer gut dokumentierten Bibliothek den Vorrang geben, anstatt tagelang durch try&error zum Ziel zu kommen.
    Gleiches Spiel mit ffmpeg. Schade eigentlich.

    greets
    LTJ

  • Ich dreh langsam durch, ich bekomme es einfach nicht gebacken die Funktionen überhaupt anzusprechen. Nichtmal eine simple Zuweisung will funktionieren :(.

    Hier mal der Versuch eines Testcases um eine AVS Scriptumgebung zu erstellen und einer simplen Abfrage ob eine Filterfunktion vorhanden ist.
    Ich beziehe mich dabei auf die C-Funktionen aus dieser API-Doku (die natürlich auch mit denen in der avisynt_c.h identisch sind).

    PHP
    #include <iostream>#include <avisynth_c.h>using namespace std;int main() {// Einen Pointer auf eine AVS Scriptumgebung anlegen --> kompiliert (Der Wahnsinn)AVS_ScriptEnvironment *scriptumgebung;// Funktion um eine Scriptumgebung zu erstellen:// AVS_ScriptEnvironment * avs_create_script_environment(int version);// Umgebung auf den Pointer legen (schon ein Compiler Error)scriptumgebung = avs_create_script_environment(AVISYNTH_INTERFACE_VERSION);// Funktion um das Vorhandensein einer AVISynth-Funktion abzurufen (glaube ich zumindest):// int avs_function_exists(AVS_ScriptEnvironment *, const char * name)// In diesem Falle als Beispiel "mpeg2source()".if (avs_function_exists(scriptumgebung, "mpeg2source"))cout << "mpeg2source da";cout << "mpeg2source nicht da";return 0;}

    Die Zuweisung der Umgebung auf die variable quittiert der Compiler schon mit

    Code
    main.cpp|14|undefined reference to __imp__avs_create_script_environment@4'|

    Das deutet normalerweise immer auf eine fehlende Bibliothek hin.
    Ich hab die avisynth.dll auch garnicht eingebunden, weil ich der Meinung bin, das die durch die avisynth_c.h schon integriert ist.
    Muß ich die dll etwa doch zusätzlich nochmal laden?
    Wenn ja, warum klappt dann das Anlegen der pointer-Variablen?

    Was läuft denn da nun schon schief? :huh:

    greets
    LTJ

  • Bin jetzt schon ein ganzes Stück weiter.
    Allerdings hänge ich jetzt daran einen YV12 RAW Bytestream in einen gängigen Bildcontainer zu verpacken.
    Möglichst ohne Konvertierung.

    greets
    LTJ

  • Dann müßte ich aber wieder an die API davon ran und die verstehe ich nicht, so ganz. Meine Ausgabe ist bisher bitidentisch mit der von avs2yuv mit -raw.
    Das kann aber irgendwie kein Programm lesen.
    YV12 kann man in BMP wahrscheinlich nicht unterbringen oder?
    Oder ich müßte zusätzlich noch zu RGB konvertieren, aber ich weiß nicht wie langsam das am Ende alles wird, schließlich sollen die Bilder beim scrubben live angezeigt werden.

    greets
    LTJ

    // EDIT
    RGB klappt.
    Welcher der AVISynth Resizefilter arbeitet denn am schnellsten, völlig unabhängig von der Bildqualität?

    Edited 2 times, last by LessThanJake (October 11, 2008 at 12:32 AM).

  • Also, wat isch ja nett so janz verschtehe is ja warum da mit da mit der C-API von Avisynth das ganze angegangen wird, wenn er eh in c++ programmiert. Da kann er doch direkt mit dem Interface des ScriptEnvironments arbeiten.

    Schaue mal den Avisynthwrapper der MeGUI an. Den habe ich mal als simplen Wrapper angepasst und um Audiofunktionen erweitert, wo er sodann von Dizmon noch was verändert wurde. (Nur hat der sodann seinen Namen vor die Funktionen gesetzt ... doll nech?).

    Hier das Original des Avisynthwrappers:
    http://forum.doom9.org/showthread.php…ghlight=wrapper

    Entweder du nutzt diesen um direkt an den Frame zu kommen, den du sodann bearbeiten kannst, so z.B. via GDI anzeigen o.ä..
    Oder du guckst in die Source und siehst wie einfach es ist direkt in c++ avisynth auch nativ anzusteuern.

    Grüße
    Inc.

  • Quote

    Da kann er doch direkt mit dem Interface des ScriptEnvironments arbeiten.

    Nein kann "er" nicht, weil sich die in Avisynth.h definierte API nicht mit dem GCC übersetzten läßt. Für den GCC wurde daher extra die Avisynth C - API entwickelt, die sich in avisynth_c.h wiederfindet. Um avisynth.h benutzen zu können muß ein MS-Compiler verwendet werden. Der GCC und der MS-Compiler produzieren unterschiedliche Symbole, so dass ein Aufruf von bspw.

    Code
    CreateScriptEnvironment(AVISYNTH_INTERFACE_VERSION)


    nicht notwendigerweise den gleichen Einsprungpunkt in der avisynth.dll hat, wie

    Code
    avs_create_script_environment(AVISYNTH_INTERFACE_VERSION)


    wenn überhaupt ein Einsprungpunkt existiert. Und dieser entspräche dann sicher nicht der gewünschten Funktion.

    Im Grunde ist das aber egal, ob man die normale, oder die C-API verwendet, die Funktionen sind identisch. Der einzige Unterschied besteht darin, dass ein Anwender ein mit der C-API verfasstes Plugin per LoadCPlugin einbinden muß.

    greets
    LTJ

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!