Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Schnellere Alternative zu Avisynth/Vfw möglich? (https://www.delphipraxis.net/55961-schnellere-alternative-zu-avisynth-vfw-moeglich.html)

dizzy 20. Nov 2005 14:44

Re: Schnellere Alternative zu Avisynth/Vfw möglich?
 
Wenn du doch schon ein Bitmap hast, so stehen dir doch so ziemlich alle Wege offen. In diesem Fall würde ich mit BitBlt() das Bitmap einfach "irgendwo" hinzeichnen. "Irgendwo" kann hierbei so ziemlich alles sein, incl. einer Paintbox oder eines Panels. Halt alles was ein Canvas(.Handle) bzw. hDC hat, wenn ich mich recht entsinne.

Gruss,
Fabian
(Und sorry dass ich deinen Monolog gestört habe :mrgreen: ;))

Garfield 20. Nov 2005 23:23

Re: Schnellere Alternative zu Avisynth/Vfw möglich?
 
Zitat:

Zitat von dizzy
(Und sorry dass ich deinen Monolog gestört habe :mrgreen: ;))

Ich freue mich über jede "Störung". Nur dummerweise stelle ich meist Fragen, bei deren Beantwortung mich niemand stören will. Mal sehen, ob ich mit Deinem Vorschlag Erfolg habe. Danke.

dizzy 21. Nov 2005 02:48

Re: Schnellere Alternative zu Avisynth/Vfw möglich?
 
Zitat:

Zitat von Garfield
Zitat:

Zitat von dizzy
(Und sorry dass ich deinen Monolog gestört habe :mrgreen: ;))

Ich freue mich über jede "Störung". Nur dummerweise stelle ich meist Fragen, bei deren Beantwortung mich niemand stören will.

...oder auch kann. Das Problem kenn ich ganz gut, grad wenn man in Delphi Dinge tut die eher selten damit gemacht werden, was imho stark Multimedia angeht abgesehen von mp3-Playern :mrgreen:
Zudem fehlt uns in der DP glaube ich noch ein Video-Experte :)

Garfield 21. Nov 2005 07:14

Re: Schnellere Alternative zu Avisynth/Vfw möglich?
 
Mit Audio beschäftigen sich hier viele, mit Video nur ein paar. Dabei liegt meiner Meinung das Problem darin, dass mit BASS und DSPack immer auf sehr gute fertige Komponenten verwiesen werden kann und nichts bzw nicht viel selbst gemacht werden muss.

Sieht man sich bei Sourceforge usw um, findet man meist Software, welche in C/C++ programmiert ist. Ausnahmen bilden dabei zum Beispiel Gordian Knot, DVD2Ogm, MPEG2Schnitt, abcAVI und YAAI.

Im englischen Doom9-Forum gibt es ein Unterforum für Softwareentwicklung. Darin werden ab und zu auch Fragen zu Delphi gestellt. Auch das deutsche Doom9|Gleitz-Forum besitzt ein Unterforum zur Softwareentwicklung. Aber dort kann man auch keine Delphi- sondern nur allgemeine Fragen stellen.

Derzeit komme ich auf meinem Celeron 2200 Notebook auf 21-22 fps. VirtualDub ist kaum schneller. Damit werde ich mich zufrieden geben müssen, wenn bitblt nichts mehr bringen sollte.

Garfield 21. Nov 2005 18:40

Re: Schnellere Alternative zu Avisynth/Vfw möglich?
 
Mit bitblt hat es nicht geklappt. Jetzt bleibt es so wie es ist. Punktum.

omata 21. Nov 2005 19:38

Re: Schnellere Alternative zu Avisynth/Vfw möglich?
 
Moin,

ich würde mich ja gern mit diesem Thema beschäftigen. Aber wenn ich die Beispiele ausprobiere, geht nichts. Ich bekomme nur Bereichsfehler, ohne ende.

Finde ich sehr schade
Thorsten

Garfield 21. Nov 2005 20:38

Re: Schnellere Alternative zu Avisynth/Vfw möglich?
 
Zitat:

Zitat von omata
Ich bekomme nur Bereichsfehler, ohne ende.

Dürfte eigentlich nicht sein. Geschrieben ist es in Delphi 7 Personal Edition. :cry: Der einzige Fehler welcher mir noch aufgefallen ist, ist dass beim temporären Avisynth-Script für MPEG eine Zeile fehlt.

Delphi-Quellcode:
.    TSL_tmpAVS := TStringlist.create;
      TSL_tmpAVS.Add('SetMemoryMax(' + IntToStr(Memory.Quelle) + ')');
      TSL_tmpAVS.Add('LoadPlugin("' + Video.Decoder + '")'); // <- die Zeile kann raus
      TSL_tmpAVS.Add('MPEGSource("' + Video.QuelleScript + '")');
      TSL_tmpAVS.Add('ConvertToRGB'); // <- diese fehlt.
      TSL_tmpAVS.SaveToFile(Video.tmpQuelle);
      TSL_tmpAVS.Free;
Liegt daran, das MPEG im Farbraum YUV arbeitet und die Anzeige RGB benötigt.

Ob die Avisynth-Version eine Rolle spielt weiß ich nicht. Verwendet wurde Avisynth 2.5.6, weil in dem Script eine Funktion verwendet werden soll, welche es erst in Version 2.5.4 implementiert wurde.

Garfield 21. Nov 2005 21:53

Re: Schnellere Alternative zu Avisynth/Vfw möglich?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Jetzt habe ich mal das ABitmap : TBitmap als Rückgabe entfernt und bitblt eingefügt.

Delphi-Quellcode:
function Tfrm_Haupt.HoleImage(FrameNumber): Boolean;
begin
  GetFrame := AVIStreamGetFrameOpen(AVIStream, nil);
  BitmapInfoHeader := AVIStreamGetFrame(GetFrame, FrameNumber);
  bits := Pointer(Integer(BitmapInfoHeader) + SizeOf(TBitmapInfoHeader));

  DC_Handle := CreateDC('Display', nil, nil, nil);

  try
    hBmp := CreateDIBitmap(
    DC_Handle,
    BitmapInfoHeader^,
    CBM_INIT,
    bits,
    PBITMAPINFO(BitmapInfoHeader)^,
    DIB_RGB_COLORS);
  finally
    DeleteDC(DC_Handle);
  end;

  bitblt (img_Video.Canvas.Handle,
          0,
          0,
          BitmapInfoHeader.biWidth,
          BitmapInfoHeader.biHeight,
          hBmp,
          0,
          0,
          SrcCopy);

  AVIStreamGetFrameClose(GetFrame);

  Result := True;

end;
Das Bild ist weiß und alles sehr träge. In den Beispiele, welche ich gesehen habe wurde auch mit Bitmaps gearbeitet. Hier ist die Source ein DIBitmap.

grizzly 24. Nov 2005 08:38

Re: Schnellere Alternative zu Avisynth/Vfw möglich?
 
Also auf meiner Kiste läuft das Programm problemlos. Das einzige "Ruckeln" zeigt sich wie erwartet beim rückwärts Abspielen. Aber hier hat auch VirtualDUB Probleme. Das liegt meines Erachtens nur an der Art und Weise, wie AVIs kodiert sind: Ein vollständiger Frame wird gefolgt von einem Haufen Differenzframes. Angenommen, Dein Programm ist bei Frame 100, soll nun Frame 99 anzeigen, aber das ist nur ein Differenz-Bildchen relativ zu Bild 80, dann muß AviSynth alle Bilder ab Frame 80 bis zu Frame 99 dekodieren. Für Bild 98 gehts dann wieder los: Dekodiere alles von Bild 80 bis 98 und so weiter. Geht jetzt zwar marginal schneller, aber Echtzeit ist das nicht. Da hilft dann nur ein Cache :( .
Das ist natürlich nur eine Theorie, paßt aber zu meinen Beobachtungen beim Rückwärtslaufenlassen: Großer Ruckler, nicht mehr ganz so großer Ruckler, etwas kleinerer Ruckler...... kleiner Ruckler, kein Ruckler, wieder großer Ruckler...

Seltsam ist allerdings, daß ich auch nur auf knapp 22fps komme, aber die CPU Last noch lang nicht bei 100% angekommen ist.

(15min rumprobieren....)

Aha, AVISynth liefert das Video in der vorgegebenen FrameRate von 25Hz. Und mit dem Timer wird man halt gelegentlich mal den Einsatz versäumen (?).
Habe mal eben aus einem bestehenden AVI mittels VirtualDUB 1400 Frames als neues AVI exportiert mit einer Framerate von 50Hz statt 25Hz, und siehe da: Wenn ich in Deinem Programm auf den Timer verzichte und statt dessen im "OnIdle" Event das nächste Bild sauge (also so schnell wie möglich), habe ich plötzlich 100fps (frag mich jetzt bitte keiner, warum nicht 50Hz, ich blick hier nicht mehr durch).
Irgendwie müßte man AVISynth das eigene Timing abgewöhnen können. In der Hilfe hab ich nur ConvertFPS, ChangeFPS und AssumeFPS gefunden, aber das hat nix bewirkt.

Grüße
Michael

Garfield 24. Nov 2005 10:39

Re: Schnellere Alternative zu Avisynth/Vfw möglich?
 
Hallo Michael,

das Ruckeln müsste auf den Dateizugriff zurückzuführen sein. Beim Vorwärtsabspielen wird die Datei von vorn nach hinten gelesen. Beim Rückwärtsspielen muss immer wieder zurückgesprungen und der Anfang des vorigen Frames gesucht werden.

Die Framerate dient normalerweise nur als Information für den Player, in welchem Abstand er die Frames anfordern/abspielen soll. Sonst müsste die Geschindigkeit beim Scrollen mit Cursortasten höher sein, was leider nicht ist.

ConvertFPS und ChangeFPS greifen in die Framefolge ein. Je nach Wert löschen sie Frames oder fügen welche ein. AssumeFPS verändert nur die Geschwindigkeit von Video und passt gleichzeitig die Audiogeschwindigkeit an. Die Änderung der Framerate mit VirtualDub bewirkt beim Video dasselbe wie AssumeFPS.

OnIdle kannte ich bisher nicht. Die Geschwindigkeit ist besonders beim Scrollen mit den Curcortasten Rechts und Links wichtig. Kann man da OnIdle auslösen?


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:33 Uhr.
Seite 2 von 3     12 3      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz