Zugriff mit C++ auf Avisynth-API

  • Hallo,

    ich würde gerne Avisynth zur Ermittlung diverser Medieninformationen nutzen,
    z.B. die Spieldauer, Frameanzahl oder die FPS. Meine Applikation schreibe ich in C++ (VCL).
    Im Netz habe ich schon nach Codesnipplets gesucht, aber nichts gefunden, was mir direkt weiterhelfen könnte.
    Weiß jemand hier im Forum Rat?

    Gruß
    B

  • Ps.: Falls Du da was schreibst würde ich mich für den SourceCode interessieren. :)


    Meinst du in Sachen AviSynth oder generell?

    Momentan nutze ich AVIFILEINFO aus der vfw.h um die Spieldauer zu ermitteln. Dies beschränkt mich aber auf avi-dateien. Mpegs oder anderes kann ich somit nicht verarbeiten.
    Mal sehen ob ich durch den Link, den du mir gegeben hast durchsteigen kann, irgendwie ist das ein wenig kompliziert, sich zuerst ein Enviroment zu machen, nur um dann die duration zu ermitteln...

    Gruß
    B

    PS: Sorry fürs falsche Subforum.. Schaue mir dann mal die Sourcen der genannten Programme durch...

  • AviSynth bietet doch das Ergebnis eines AviSynth-Skriptes so an wie eine unkomprimierte AVI-Datei.

    Mit welchem "...Source()"-Plugin AviSynth seinerseits die Videoquelle geladen hat, ist da doch irrelevant. Das ist ja gerade der Grund, warum man Frameserver erfunden hat: Weil die alles mögliche so wie ein AVI an das aufrufende Programm weiterleiten!

  • Zitat

    Meinst du in Sachen AviSynth oder generell?


    Vor allem Avisynth, ansonsten guck ich aber auch gern auf SourceCode. :)

    Wenn es Dir nur um die Infos geht nimm MediaInfo, entweder auf die .dll zugreifen, oder halt einfach die CommandLine Version aufrufen und den Output catchen&parsen. (ist auf jeden Fall eine einfache und betreffend externen Erwartungen sparsame Lösung, da sie sich nicht wie avisynth auf DirectShow oder AviSource verlässt um an die Info zu kommen)

    Cu Selur

  • Ich bekomme gerade voll den HASS auf das Mediainfo Package!
    Es verspricht sehr viel z ukönnen - kann es sich er auch, nur das einbinden der DLL funktioniert überhaupt nicht.
    Zuerst musste ich mir die nötigen Sourcen aus mehreren seltsam aufgeteilten Paketen zusammensuchen, und dann funktioniert es nicht mal.
    Übrigens musste ich für den Mist auch noch die ZenLib runterladen. Sehr seltsam alles.

    Code
    #include "mediainfo.h"
    [...]
     MediaInfo MI;


    Führt zu einer ungelösten externen Referenz: MediaInfoLib
    Lib und DLL sind aber im Projekt eingebunden.
    Keine Ahnung was der Kerl für chaotische namensräume benutzt, ich gebs auf durch dem seinen source zu steigen. Und das sogenannte SDK, was da auf der HP ist, ist für mich auch nicht zu gebrauchen.

    Lange Rede kurzer Sinn: 4 Stunden verschwendet und immer noch vor dem Problem eine gute Methode Spieldauern von verschiedensten Medienformaten zu ermitteln. :(

  • MediaInfoDLL.h hast DU aber auch included, oder?
    Hast Du die dll's runtergeladen und auch die Infos und das Beispiel für Developer durchgelesen?

    Cu Selur

  • Hallo nochmal,

    es war gestern wohl nur ein wenig zu spät geworden.... Keine Ahnung worans lag, aber jetzt compiliert es ohne Mucken...

    Jedoch habe ich nun ein anderes Problem - ich hoffe mir kann hier in diesem Forum wieder weitergeholfen werden.

    Code
    MediaInfo MI;
    MI.Open(_T("C:\vids\Donald Duck - 1949 - Donald's Happy Birthday.mp4"));
    MI.Option(_T("Inform"), _T("General;Example : FileSize=%FileSize%"));
    ShowMessage(MI.Inform().c_str());

    Die MessageBox ist leer, ich hätte aber die Dateigröße erwartet.....
    Returnwert vom MI.Open ist 0.
    Hab ich einen Denkfehler?

    Gruß
    B

    Edit: Ja ich habe einen Denkfehler: Pfadangaben in Anführungszeichen brauchen doppelte Backslashs. -_-

  • Zitat

    Pfadangaben in Anführungszeichen brauchen doppelte Backslashs.


    Yup, zum Escapen. ;) Schreibst du eine GUI dazu? Falls ja, würde ich QT empfehlen, da gibt es für so etwas auf kleine nette Routinen. :)
    Muss man vor allem darauf achten wenn man CrossPlattform-Code schreibt. ;)

    Cu Selur

  • Hallo,

    ich weiß zwar nicht, was du mit QT meinst, aber ja, ich schreibe mir eine Gui für folgende Aufgabe:

    -> Per Drag&Drop _viele_ Videodateien in eine Listbox
    -> Mache für alle Dateien in der Listbox:
    ---> Ermittle Spieldauer
    ---> Ermittle gewünschte Dateigröße anhand Spieldauer
    ---> Errechne dafür passende Bitrate
    ---> Konvertiere Videostream pass 1 nach x264
    ---> Konvertiere Videostream pass 2 nach x264
    ---> Konvertiere Audiostream nach AAC
    ---> joine die Dateien
    ---> lösche Zwischendateien
    ->ende

    Bisher funktioniert alles ausgezeichnet, aber: ich starte für die Konvertierungen und den Join externe Executables. Die muss man sich leider separat herunterladen und ins Verzeichnis kopieren. Als nächstes würde ich gerne sukkzesive die einzelnen Schritte in meine Anwendung "reinholen"...
    Hintergrund ist die Migration meines Videoarchives ins MP4-Format.
    Ich für mich kann damit leben, dass externe Tools aufgerufen werden, wenn jedoch der Sourcecode verfügbar ist, wieso dann nicht einfach integrieren....

    Gruß
    B

  • QT: http://trolltech.com/products/qt

    Anmerkung zum "joinen der Dateien" und dem separaten Encoden:

    Sei sicher, dass Du da auch Dateien hast die sich separat komplett abspielen lassen. Wenn man z.B. vob Dateien nimmt, kann es sein, dass Frames die zum Decoden der xten Datei nötig sind am Ende von Datei x-1 sind. Encoded man nun die Files separat, werden am Anfang von Datei x nun einige Frames übersprungen (da sie nicht decodiert werden können), was zu einem größeren Delay und einem Sprung beim späteren Playback führen kann. ;)

    Zitat

    Ich für mich kann damit leben, dass externe Tools aufgerufen werden, wenn jedoch der Sourcecode verfügbar ist, wieso dann nicht einfach integrieren....

    (Je nach Grad der Integration kann es lizenztechnische Folgen haben. ;))
    Bei x264 hat es halt den Vorteil, dass es keine Probleme macht wenn der Nutzer die x264 Version wechselt und den Aufruf eventuell durch eigene Parameter erweitert. ;)
    Der Punkt mit den .dlls spricht LigH schon richtig an, CL tools haben den Vorteil, dass man bei CrosssPlatform halt nicht extra Code für jedes OS machen muss. ;)

    Cu Selur

    Ps.: das KDE Frontend unter Linux baut z.B. auf QT auf. ;)

  • Plattformunabhängig wird meine Applikation wohl nicht werden, denn bisher ist alles auf VCL aufgebaut. Insofern ist der Hinweis auf QT zwar nett gemeint, scheidet aber für mich aus. Ich nutze kein Linux (weil ich es nicht geschafft habe meine CPU anständig zu untertakten und undervolten, aber das ist eine andere Geschichte).

    Der Hinweis auf die Lizenzen ist gut, bevor ich da integriere sollte ich mich da absichern. Beim Nero-AAC Encoder gibt es sowieso nichts zu integrieren, und ich werde mich hüten, diesen in meinem Package zum Download anzubieten. ;)

    Wenn ich den Sourcecode mal aufgeräumt habe, stell ich den mal hier irgendwo rein - falls es interessiert. Vielleicht schon mit einem Binary für Win32.

    Gruß
    B

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!