AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Schnellere Alternative zu Avisynth/Vfw möglich?

Schnellere Alternative zu Avisynth/Vfw möglich?

Ein Thema von Garfield · begonnen am 29. Okt 2005 · letzter Beitrag vom 29. Apr 2006
Antwort Antwort
Seite 2 von 3     12 3   
Benutzerbild von dizzy
dizzy

Registriert seit: 26. Nov 2003
Ort: Lünen
1.932 Beiträge
 
Delphi 7 Enterprise
 
#11

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

  Alt 20. Nov 2005, 15:44
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 )
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel
  Mit Zitat antworten Zitat
Benutzerbild von Garfield
Garfield

Registriert seit: 9. Jul 2004
Ort: Aken (Anhalt-Bitterfeld)
1.333 Beiträge
 
Delphi XE5 Professional
 
#12

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

  Alt 21. Nov 2005, 00:23
Zitat von dizzy:
(Und sorry dass ich deinen Monolog gestört habe )
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.
Gruss Garfield
TuxedoOS: Laz2.0.6/FPC3.0.4 - VirtBox6.1+W10: D7PE, DXE5Prof
  Mit Zitat antworten Zitat
Benutzerbild von dizzy
dizzy

Registriert seit: 26. Nov 2003
Ort: Lünen
1.932 Beiträge
 
Delphi 7 Enterprise
 
#13

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

  Alt 21. Nov 2005, 03:48
Zitat von Garfield:
Zitat von dizzy:
(Und sorry dass ich deinen Monolog gestört habe )
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
Zudem fehlt uns in der DP glaube ich noch ein Video-Experte
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel
  Mit Zitat antworten Zitat
Benutzerbild von Garfield
Garfield

Registriert seit: 9. Jul 2004
Ort: Aken (Anhalt-Bitterfeld)
1.333 Beiträge
 
Delphi XE5 Professional
 
#14

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

  Alt 21. Nov 2005, 08:14
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.
Gruss Garfield
TuxedoOS: Laz2.0.6/FPC3.0.4 - VirtBox6.1+W10: D7PE, DXE5Prof
  Mit Zitat antworten Zitat
Benutzerbild von Garfield
Garfield

Registriert seit: 9. Jul 2004
Ort: Aken (Anhalt-Bitterfeld)
1.333 Beiträge
 
Delphi XE5 Professional
 
#15

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

  Alt 21. Nov 2005, 19:40
Mit bitblt hat es nicht geklappt. Jetzt bleibt es so wie es ist. Punktum.
Gruss Garfield
TuxedoOS: Laz2.0.6/FPC3.0.4 - VirtBox6.1+W10: D7PE, DXE5Prof
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#16

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

  Alt 21. Nov 2005, 20:38
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
  Mit Zitat antworten Zitat
Benutzerbild von Garfield
Garfield

Registriert seit: 9. Jul 2004
Ort: Aken (Anhalt-Bitterfeld)
1.333 Beiträge
 
Delphi XE5 Professional
 
#17

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

  Alt 21. Nov 2005, 21:38
Zitat von omata:
Ich bekomme nur Bereichsfehler, ohne ende.
Dürfte eigentlich nicht sein. Geschrieben ist es in Delphi 7 Personal Edition. 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.
Gruss Garfield
TuxedoOS: Laz2.0.6/FPC3.0.4 - VirtBox6.1+W10: D7PE, DXE5Prof
  Mit Zitat antworten Zitat
Benutzerbild von Garfield
Garfield

Registriert seit: 9. Jul 2004
Ort: Aken (Anhalt-Bitterfeld)
1.333 Beiträge
 
Delphi XE5 Professional
 
#18

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

  Alt 21. Nov 2005, 22:53
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.
Angehängte Dateien
Dateityp: 7z version_3_549.7z (210,3 KB, 26x aufgerufen)
Gruss Garfield
TuxedoOS: Laz2.0.6/FPC3.0.4 - VirtBox6.1+W10: D7PE, DXE5Prof
  Mit Zitat antworten Zitat
grizzly

Registriert seit: 10. Dez 2004
150 Beiträge
 
Delphi XE4 Professional
 
#19

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

  Alt 24. Nov 2005, 09:38
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
  Mit Zitat antworten Zitat
Benutzerbild von Garfield
Garfield

Registriert seit: 9. Jul 2004
Ort: Aken (Anhalt-Bitterfeld)
1.333 Beiträge
 
Delphi XE5 Professional
 
#20

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

  Alt 24. Nov 2005, 11:39
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?
Gruss Garfield
TuxedoOS: Laz2.0.6/FPC3.0.4 - VirtBox6.1+W10: D7PE, DXE5Prof
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:24 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf