avisynth.dll: Fehlermeldung auslesen.

  • Als ich mehrere Encoder ausprobierte, war da einer dabei, welcher die Fehlermeldungen von AviSynth als Messagebox ausgab. Weiß vielleicht jemand, wie man diesen Errorcode erhält?

    Gruß Frank

  • Zitat von incredible

    hier die avsynth.h Datei portiert zu Delphi .pas


    Da haste dich verguckt...

    Das sind die VfW-Header. Die für AviSynth suche ich bis heute vergeblich - hab mich selbst mal versucht, bin aber gescheitert an einer Interface-Deklaration mit variabler Parameteranzahl (so was beherrscht Delphi "eigentlich" nicht).

  • In den VDM-Source hatte ich mal reingesehen, wenn auch aus einem anderen Grund. Ich fand mich auf Grund mangelnder C/C++ Kenntnisse allerdings nicht zurecht. Von der Vfw.pas gibt es etliche unterschiedliche Versionen. Leider bekommt man dort keinen Fehlercode sondern nur eine Graphik, aus welcher man auf Grund der Größe auf eine Fehlermeldung Rückschlüsse ziehen kann.

    In meinem Programm muss das Bild eine bestimmte Mindestgröße besitzen, um überhaupt geladen zu werden. Ist das Bild zu klein, wird das Laden abgelehnt. Sonst würde das Bild wie im Anhang aussehen.

    Die avsynth.h hatte ich mal mit Dr Bob portiert. Da kam allerdings nichts sinnvolles heraus. Die avisynth_c.pas sieht sehr interessant aus. Da sehe ich die Funktionen:

    Code
    function avs_clip_get_error(pac: PAVS_Clip): PChar; stdcall; external 'avisynth.dll';
    function avs_is_error(v: AVS_Value): Boolean;
    function avs_as_error(v: AVS_Value): PChar;
    function avs_new_value_error(v0: PChar): AVS_Value;


    Mal sehen, was für mich in Frage kommt.

    So etwas habe ich schon mehrmals gesucht und nicht gefunden. Die Sourcen von AviSynth habe ich mir deshalb auch schon gezogen...

    Nachtrag: Anhang vergessen.

  • Uups. Deinen letzten Beitrag habe ich nicht mehr gelesen; da war ich schon unterwegs.

    Den Thread habe ich mir wohl nicht aufmerksam genug angesehen. Das Archiv von Johny ist sehr interessant. Das Script als avsinfo.in in das Verzeichnis von avsinfo.exe, avsinfo.exe ausführen und anschließend hat man eine avsinfo.out mit der Fehlermeldung. Das Übersetzen der Unit erscheint mir nicht möglich, da ich die Funktionen nicht in der Vfw.pas finden konnte.

    Gruß Frank

  • Zitat von incredible

    Die kenn ich, wenn du mir jetzt noch sagen kannst, wie man das Ding nutzt ... Hmmm


    Für die Fehlermeldung brauchst Du nur die Funktionen AVSSource und GETError. AVSSource gibt einen Integerwert zurück, welcher im Fehlerfall negativ ist. Mit GETError bekommt man dann die Fehlermeldung als String. Dabei ist jedoch der Code für die Zeilenschaltung fehlerhaft. Es wird nur #10 anstelle von #13#10 ausgegeben. Für eine MessageBox ist das zwar ausreichend, für ein Memo usw nicht.

    Zitat von incredible

    AvsWarp btw. gibt KEIN audio weiter, nur Video ;)

    Wenn man nur eine Fehlermeldung benötigt, ist das unerheblich ;)

    Ausserdem ist die DLL buggy. Die Wiedergabe startet nur von Frame 0 und bleibt irgendwann einfach stehen. Startet man mittendrin, wird nur ein Frame angezeigt.

    Gruß Frank

  • Die dll. ist ja quasi "nur" ein Wrapper.
    Ich hatte den Sinn nie so recht verstanden, da zu dieser ebenso ein nicht gerade kleines header-file ebenso unerlässlich ist (avswarp.pas).
    Die Dll gibt keine reine *PointerAdresse für das resultierte Bild im Speicher wieder, sondern jagt diese Farbraum-Nativen Bilddaten eben noch durch einen (aus dem XVID Projekt kommenden) Farbraumwandler "mmx_YV12toRGB()" o.ä..
    Für reine Preview Applikationen bräuchte man das nicht.
    Man müsste lediglich direkt via API mit der Avisynth.dll oder Avisynth_c.dll kommunizieren und via "envoke" am ende der "Kette" ein ConverttoRGB32() mit dranschmeissen.

    Hatte mir mal so einen Workflow via Avisynth durchgesehen.

    1. Handle via "AVS_CreatescriptEnvironment()" Erlangen
    2. Auf jenes Handle "AVS_Envoke(...)" anwenden
    3. Via AVS_GetFrame(...) die resultierenden Bilddaten in einen Speicherbereich holen.
    4. Diesen Speicherbereich sodann via GetDIBits(...) in eine Bitmap wandeln
    5. Im Programm sodann anzeigen
    6. Dies Ganze in einer FPS-Nativen Zeitschleife ablaufen lassen (WinAPI: GetTickCount()).

    Das da oben ist aber eine "reine" Vermutung. Wollte dies mal angehen und die dazu benötigten Typen/Declarationen aus avisynth.h zu Purebasic hin portieren.

    Nur ... wenn man sich da tagelang die Arbeit macht und nach 2-3 Monaten vieles für die Katz ist, da sodann viell. Avisynth 3.0 raus sein könnte. Müsste man sodann alles wieder umschreiben. Aber ich weiss nicht die Bohne bescheid, was da an Avisynth 3.0 anders sein könnte ;)

  • Hier ging es mir hier nur darum, einen Fehlercode auswerten zu können. Aber die Wiedergabe ist für mich auch ein Thema. Zur Zeit verwende ich VfW. Kika hat

    Kika
    12. Oktober 2005 um 11:10

    berichtet, dass VirtualDub eine bessere Wiedergabe hat. Bisher habe ich aber noch nichts gefunden, was für eine Beschleunigung tauglich ist.

    Gruß Frank

  • In jenem Thread wurde eben der MPC genutzt, welcher ja Dshow zur Wiedergabe nutzt.

    Man hat ja (imho) die 3 bekannten Möglichkeiten für eine Wiedergabe zur Auswahl:

    1. vfw ... via der AviFil32.dll ---> AvistreamGetFrameOpen()
    1a. vfw ... via der MSvfw32.dll ---> ICDecompress()

    2. Dshow ... via dem Directshow Interface

    3. AcitveMovie ... via der WinMM.dll ---> MciSendstring()

    zu 1.: Für mich die wirklich unproblematischste Art Videomaterial wiederzugeben, wie man es von Vdub her kennt. Nur habe ich das mit der AudioStream Wiedergabe noch nicht raus, kommt aber noch ;)

    zu2.: Für mich viel zu *tricky* da sich da fix Filter reinmogeln können und unerfahrene User der durch dich erstellten Appliation damit Probleme bekommen könnten. (Was weisst du was die da in der Dshow Kette haben).

    zu3.: Ist sehr komfortabel, Audio kein Problem, lässt sich via DeviceHandle auch in einem Videofenster innerhalb der Appl. darstellen.
    Nur: Es gibt riesige Probleme wenn ein avs script mit DirectshowSource() geöffnet wird. Denn das geht nur mit MCISendstring(..... Type MPEGVIDEO ...) und da funktionierts sodann nicht mit Frames sondern MS und das "seeken" ist neben anderen Problemen! der reine Horror. Bei Type AVIVIDEO gibt ansonsten keine Probleme, nur können sodann scripte mit DirectshowSource() nicht richtig "terminiert" werden ---> Appl. hängt sich auf. So habe ich das bei Scripten mit mp4 Importen festgestellt.

    Es gibt übrigens NOCH ein Avisynth.dll Wrapper (im Anhang).
    Dieser liefert auch Audio, ... habe ihn mir aber noch nicht genau unter die Lupe genommen ... mal sehen ;)

  • Zitat von incredible

    1. vfw ... via der AviFil32.dll ---> AvistreamGetFrameOpen()
    1a. vfw ... via der MSvfw32.dll ---> ICDecompress()


    Ich benutze den SDC-Tipp mit der dazu angebotenen vfw.pas unter Verwendung von AVIStreamGetFrameOpen(AVIStream, nil);. Ich musste feststellen, das mindestens vier verschiedene vfw.pas kursieren, ohne dass Versionhinweise enthalten sind. Wenn ich wüsste, wie die Audiowiedergabe funktioniert, hätte ich damit bereits den TMediaPlayer ersetzt.

    An Directshow bin ich bisher nicht herangekommen und mit MciSendstring() hatte ich bei SVCDPal2DVD auch schon keinen Erfolg.

    Zitat von incredible

    Es gibt übrigens NOCH ein Avisynth.dll Wrapper (im Anhang).
    Dieser liefert auch Audio, ... habe ihn mir aber noch nicht genau unter die Lupe genommen ... mal sehen ;)


    Ich habe wieder ein paar Stunden gesucht, aber wieder nur viele irrelevante Seiten gefunden. Werde ihn mir heute abend mal ansehen.

    Gruß Frank

  • Audio geht theoretisch so:

    1. Via "AvifileGetstream(*pAudiostream,......#StreamtypeAudio)" den Pointer zum Audiostream holen.
    2. Via Avistreaminfo(...... &pAudiostream ...., *pWfmt) das Audioformat an eine (WaveformatEX imho) Struktur senden.
    3. Aus der WaveformatEX Struktur die SampleLänge etc etc etc etc ermitteln
    4. Via AviStreamRead(.....) (imho) die Audiodaten ab Start X (INT64!!) und der Länge Y (INT64!!) an einen *AudioBuffer übergeben.
    5. Den *AudioBuffer via DirectSound oder API Inbezugnahme der oben erhaltenen WaveformatEX Struktur abspielen.

    Aber .. det iss "noch" alles theeeeeorieeee ;)

    Hier noch was aus dem PureBasic Forum bzgl. Audiostream handling bei Avi's:
    http://forum.purebasic.com/english/viewto…63cdb87d8a582b9


    Hier die "Essenz":

    Bzgl. variablen mit Strukturen in Purebasic:

    "siWav.AVISTREAMINFO"

    ist in c++

    "AVISTREAMINFO siWav"

    in Vb oder Delphi (imho)

    "siWav As AVISTREAMINFO"


    Wenn ich "PARanoia" als stable release rausgegeben haben werde, werde ich mich mit Niko dort mal in Verbindung setzen, es müsste für ihn ein (imho) Klacks sein, Avis via der AviFil32.dll mit Video UND audio abzuspielen ;)

  • Auf Grund des TMediaPlayers und es DSPacks denke ich mal, dass man in Delphi kaum Sourcen dazu findet ausser natürlich die zum DSPack. Und wenn es um die Audiowiedergabe geht, wird man in der Regel auf die Bass.DLL verwiesen.

    Gruß Frank

  • Ist das diese Bassmod.dll ? Denn diese kann auch Audio aus einem Buffer ausgeben, also anstatt eines Files.
    Ist zwar LGPL aber dennoch wieder mal eine externe dll - müsste somit eingebunden werden und da weiss ich nicht wies mit der Lizenz in Konflikt kommen könnte ... hmmm

    Noch was:
    Generell macht die direkte Übergabe der Bild- und Audiodaten an das Programm via direktem!! ansprechen der Avisynth.dll weitaus mehr Sinn als der Weg via vfw.
    Warum?
    Weil es a) viel fixer geht, also der Umweg über erneutes Laden via vfw fällt weg (darum ist Mencoder ohne interne WinAPI calls imho auch merklich! schneller als Qenc obwohl dieser auch auf Libavcodec zugreift)... API kann soooo langsam sein ;) ... nutze z.B. mal WinAPI GetPixel() um den RGB Wert eines Pixels in einer Bitmap zu fischen = GÄHHHN.
    Und --- last but not least: Man könnte eine "richtige" AVIsynth GUI bauen, bedeutet jede Änderung an Slidern welche parameter in avs funktionen erneut setzen könnten direkt im Videowindow zu sehen sein.
    Somit wäre ein "Levels" tuning on.the.fly möglich. Stell dir mal vor, wenn via vfw und einem Slider-Tick jedes Mal das .avs "neu" gespeichert und "neu" geöffnet werden müsste.
    LimitedSharpen könnte somit eine GUI verpasst bekommen und die Hand-Fummelei wäre pasé. Hmmm nun ja, es wäre zumindest wesentlich leckerer zu bedienen.

  • Die BassMOD.DLL ist eine angepasste Version der Bass.DLL - http://www.un4seen.com/bass.html

    Wenn ich wüsste wie ich es anstellen muss, würde ich den Umweg über Vfw auch gern weglassen. Bei der Wiedergabe via Timer spielt es ja nicht die Rolle. Aber eben beim Scrollen mit den Cursortasten. Und die von Dir genannten Vorteile sind auch beachtlich.

    Gruß Frank

Jetzt mitmachen!

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