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?
avisynth.dll: Fehlermeldung auslesen.
-
-
schau doch mal in den VDub-Code rein. evt. steht da was drin.
-
http://forum.doom9.org/showthread.php?t=40921
hier die avsynth.h Datei portiert zu Delphi .pas
http://www.koders.com/delphi/fidF901…21B5BB4430.aspx -
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).
-
Stimmt, da habe ich mich vertan ....
Habe es nun als Anhang reingesetzt.
Das müsste jener portierte Header sein, um mit Delphi z.B. Filter zu programmieren.
-
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:
Codefunction 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.
-
Das dürfte der Thread sein: http://forum.doom9.org/showthread.php?p=696784
-
Das istd er allgeimeine avisynth.h "potierungsthread" hin zu Delphi.
Dein Problem, was die Fehlerausgbe angeht, dürfte aber wie gesagt eher hier zu finden sein:
http://forum.doom9.org/showthread.php?t=40921Am besten du schreibst "Jonny" mal an. Er ist sehr nett, ich hatte mit ihm mal Exchanges bzgl. der Prediction bei Qcce.
-
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.
-
Es gibt eine avswrapp.dll, mit der man einzelne Bilder und Fehler holen kann.
http://aquaplaning.20m.com/ -
Die kenn ich, wenn du mir jetzt noch sagen kannst, wie man das Ding nutzt ... Hmmm
Habe mal in diese main.pas nachgesehen, aber werde eben aus Delphi nicht recht schlau. Bzw. ich müste eh erst die avswarp.pas in eine Purebasic headerfile portieren.
AvsWarp btw. gibt KEIN audio weiter, nur Video -
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 incredibleAvsWarp 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.
-
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
ThemaSeltsames AVISynth-Problem
Hin und wieder schreibe ich auch mal etwas aufwändigere Scripte, die auch meistens funktionieren, aber beim Versuch, sie in Echtzeit im Media-Player abzuspielen seltsame Probleme verursachen.
Ein Beispiel ist ein Script, das nichts anderes tut, als ein Video zu importieren, zu bobben (Kernelbob), zu croppen und zu letterboxen.
Öffne ich das in MediaPlayer (auch MPC), gibt's eine wilde Ruckelorgie bis hin zu Slideshow oder gar keiner Bewegung.
Öffne ich es aber in VirtualDub, dann kriege ich eine…Kika12. 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.
-
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 incredibleEs 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. -
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…63cdb87d8a582b9Hier die "Essenz":
Code
Alles anzeigenpfileWav.IAVIFILE siWav.AVISTREAMINFO psWav.IAVISTREAM psAvi.l fmtWav.WAVEFORMATEX If CallFunction( #Lib, "AVIFileOpen",@pfileWav, @strFileWAV, #OF_READ, #Null)=0 If CallFunction( #Lib, "AVIFileGetStream",pfileWav, @psWav, #streamtypeAUDIO, 0)=0 If CallFunction( #Lib, "AVIStreamInfo",psWav, @siWav, SizeOf(AVISTREAMINFO))=0 If CallFunction( #Lib, "AVIStreamReadFormat",psWav, 0, #Null, @lFmtSize) =0 If lFmtSize If CallFunction( #Lib, "AVIStreamReadFormat",psWav, 0, @fmtWav, @lFmtSize)=0 lStreamLength = CallFunction( #Lib, "AVIStreamLength",psWav) If lStreamLength lpbData = AllocateMemory(lStreamLength) If CallFunction( #Lib, "AVIStreamRead",psWav, 0, lStreamLength, lpbData, lStreamLength, #Null, #Null)=0
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.
-
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 ... hmmmNoch 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.
-
Jetzt mitmachen!
Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!