Mit Avisynth Frame extrahieren?

  • Versuche schon seit ein paar Tagen mit Avisynth Frames als TBitmap (Delphi)
    aus Videos zu extrahieren.
    Verwende im Moment eine avsWARP.dll von aquaplaning.

    Bei "AVISource" gibt es damit keine Probleme, aber bei "DirectShowSource"
    löst sich der Pointer zum Clip einfach auf! (Zeigt auf keinen Clip mehr).
    Erst nach entladen u. laden der DLL kann ein neuer Frame geholt werden.

    Habe schon einige Versuche an der Source von avsWARP getestet, aber
    da meine Kenntnisse in C++ sehr bescheiden sind, bisher ohne Erfolg.

    Hat jemand eine Lösung parat, um über Avisynth Frames ohne Probleme
    zu extrahieren?

    Bin für jede Antwort dankbar
    Gruß gispos

  • Eventuell muss man dafür bei DirectShowSource noch weitere Parameter angeben, z.B. "seek=true" oder "seekzero=true". Manche Videoformate (z.B. defekte ASF/WMV ohne Index) lassen sich nämlich nicht beliebig oft an beliebiger Stelle abspielen.

    Und für AVIs sollte man eh AviSource verwenden, entsprechend MPEG2Source (DGMPGDec.dll) für MPEG2-Video usw.

  • seek=true und anderes hab ich Versucht, liegt aber wirklich am Pointer
    der avsWARP.dll, der zeigt nach erstem Frame extrahieren auf keinen
    Clip mehr. Habe hierzu schon einen Beitrag gelesen (Smart Pointer "PClip" sei
    sehr unbeständig).
    Aber bei diesem verfluchtem DirectShow von Windows gibt's irgenwoh immer
    Probleme, notfalls wird die ganze Anwendung in den Abgrund gerissen.

    Hab mir gerade AVSRedirect Source angeschaut, werde mal hierzu einen
    Delphi Wrapper schreiben u. testen. Vieleicht klappt's ja damit.

    PS: Natürlich öffne ich Avi's mit "AviSource"

    Gruß gispos

  • Als Endergebnis von etlichen Versuchen mit diversen Sourcen, angefangen
    mit avsWARP über AVSRedirect bis Avisynth_c, erscheint mir nur eine
    Alternative als einigermaßen Fehlerfrei zu sein (…

    Das öffnen über ein AVS Skript mit PAviFile (VFW) (…

    Try
    Bei alle anderen Versuchen, bei denen die avisynth.dll direkt geladen wird
    gibt es Probleme unterschiedlichster Art.
    1.) DLL lässt sich nicht fehlerfrei entladen.
    2.) Einmal funktioniert es, dann kommt doch irgendwann eine Fehlermeldung.
    3.) Anwendung wird bei Fehlern, mit in den Abgrund gerissen.
    (Was vor allem beim statischen laden der DLL passiert)
    4.) Ich habe keine Lust mehr grrrrr…
    5.) Raise

    Except
    Terminate
    End:

  • Das ganze hat doch noch ein gutes Ende gefunden. :D

    Nach dem auch andere AviSynth Sample Programme ab und an beim beenden
    Fehler zeigten, kam ich auf die glorreiche Idee meine AviSynth Version
    zu checken. 2.5.8 alpha.
    Hm… nach einem downdate auf 2.5.7 liefs dann wie geschmiert.

    Damit es wirklich reibungslos funktioniert muss aber die DLL direkt geladen
    werden. Alle bereits existierenden Warpper zeigen zumindest bei mir,
    unterschiedliche Fehler.
    Auch das laden über ein Skript mit AviFile ist möglich, aber wohl nicht so
    elegant und effizient wie das direkte laden.

    Aber beim direkten laden ist es wirklich klasse. So unkompliziert und fehlerfrei
    habe ich DirectShow(ohne Anzeige) zum Frame extrahieren noch nie
    verwenden können.

    Hut ab, an die AviSynth Entwickler. :ja:

    gispos

  • Versuche schon seit ein paar Tagen mit Avisynth Frames als TBitmap (Delphi) aus Videos zu extrahieren...

    ...da meine Kenntnisse in C++ sehr bescheiden sind, bisher ohne Erfolg.

    Ich lese das so, dass gispos in Delphi programmiert, und gezwungen war, C++-Quellen zu lesen, um deren Algorithmen in Delphi nachahmen zu können.

  • Am Anfang versuchte ich es mit den bekannten Sourcen von avsWARP und AVSRedirect, von denen
    es jeweils eine C++ Version für die DLL und eine Delphi Source (um die Funktionen der DLL aufzurufen) gibt.
    Die DLL ruft dann wiederum die AviSynth.dll auf.
    So mache ich dies übrigens auch mit „FreeImage.dll“ für die ich eine kleine DLL in Delphi gecodet habe um auf die C++ Functionen zuzugreifen.

    Bei beiden DLL’s scheint es aber im C++ Code Ungereimtheiten zu geben.
    Nun ja, da wie schon gesagt, da meine C++ Kenntnisse nicht die besten sind,
    haben diverse Versuche den C++ Code zu Ändern keine Erfolge gebracht.
    Hab halt in der falschen Programmiersprache gelernt.

    Nun gut, zufällig bin ich ich auf die Avisynth_c Source gestoßen, die schon im Delphi Code vorliegt.
    Also diverse Variablen und Konstanten sind schon nach Delphi portiert worden.

    Da aber die AviSnynth_c Source auf statisches laden ausgerichtet ist, ich dies aber überhaupt nicht gebrauchen kann, habe ich mir gewisse Funktionen extrahiert und auf dynamisches laden umgeschrieben.
    Das war’s dann auch schon. Kein großer Aufwand.

    Also es gibt keinen C++ Code den ich posten könnte, und die Avisynth_c Source ist beim „googeln“ leicht zu finden.

    Nachtrag: hier die Source, http://rapidshare.com/files/41226498/avisynth_c.rar

    Grüße gispos

  • Der Pointer zum PVideoFrame ist ein SmartPointer. Dieser ist IMHO nicht Heap allocated, daher sollte dieser vor dem exportieren aus der Funktion oder dll o.ä. zuerst mit Avisynth BitBlt() Funktion auf einen HeapAllocated Speicherbereich gesetzt werden, bzw. kannst du ihn direkt bei RGB32 damit vert. spiegeln und in die in Delphi o.ä. erstellte bitmap kopieren. Denn um einen Blocktransfer kommste eh nicht herum ;)

Participate now!

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