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 3 von 3     123
grizzly

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

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

  Alt 24. Nov 2005, 12:31
Mein Eindruck ist, daß AviSynth sich an der Framerate des Videos orientiert, und einfach die Bilder nicht schneller liefert als vorgesehen. Im Normalfall mit 25fps. (Vielleicht wegen Audio-Synchronisierung?)

Mit dem "OnIdle" wollte ich nur sehen, wie schnell es eigentlich gehen können sollte. Quick und dirty hab ich folgenden Routine eingetragen:
Delphi-Quellcode:
procedure Tfrm_Haupt.OnIdle(Sender: TObject; var done: boolean);
begin
 tb_Frame.position := tb_Frame.position+1;
 done := false;
end;
Und dann in Deiner FormCreate folgendes aufgerufen:
Application.onidle := OnIdle; Wenn man jetzt ein AviSynth-file lädt, dann wird dies sofort abgespielt. Und da hatte ich mich gewundert, daß das bei mir immer noch nur mit 25Hz lief und nicht mit allem was die Kiste her gab. Das habe ich erst erreicht, nachdem ich die Videoframerate im AVI selber hochgedreht habe (VirtualDUB). Deshalb die Vermutung, daß AviSynth selbstständig versucht, die Framerate einzuhalten.

Mit dieser Änderung kam dann das OnIdle Experiment auf gut 100Hz. Scrollen mit den Pfeiltasten kommt allerdings nur auf gut 30Hz, und das hat einen simplen anderen Grund: Die Tastaturwiederholrate!

Das mit dem scrollen muß anders laufen. Vielleicht so: Du mußt den wm_keydown Event für die links/rechts Pfeile (vk_Left, vk_right) abpassen, und dann solange auf Teufel komm raus scrollen, bis der wm_keyup event für diese Tasten kommt. Dann bist Du unabhängig von der Tastatuswiederholrate.

Ohne den Code zu testen, könnte so aussehen:
Delphi-Quellcode:
procedure Tfrm_Haupt.OnIdle(Sender: TObject; var done: boolean);
begin
 IF ScrollDir <> 0 then // Natürlich noch Grenzen abfangen!
   tb_Frame.position := tb_Frame.position+ScrollDir;
 done := false;
end;

procedure Tfrm_Haupt.AppMessage(var Msg: TMsg; var Handled: boolean);
begin
  if Msg.message = wm_keydown then
    begin
      if Msg.wParam = vk_Left
        then begin
          ScrollDir := -1;
          Handled := true;
        end;
      if Msg.wParam = vk_Right
        then begin
          ScrollDir := +1;
          Handled := true;
        end;
    end;
  if Msg.message = wm_keyup then
    begin
      if Msg.wParam = vk_Left
        then begin
          ScrollDir := 0;
          Handled := true;
        end;
      if Msg.wParam = vk_Right
        then begin
          ScrollDir := 0;
          Handled := true;
        end;
    end;
end;
Und dann in Deiner FormCreate folgendes aufgerufen:
Delphi-Quellcode:
   Application.onidle := OnIdle;
   Application.OnMessage := AppMessage;
Aber natürlich: Das könnte dann sogar zu hektisch werden. Vielleicht doch via TimeGetTime nachsehen, wann der letzte Frame geholt wurde, um damit selbst eine gewisse Geschwindigkeitskontrolle zu haben.

Aber auch: Das ganz funktioniert nur, wenn man AviSynth überreden kann, die Frames ohne Zeitverzögerung herauszugeben.


Gruß
Michael

PS.: Der OnIdle wird automatisch ausgelöst wann immer das System den Eindruck hat, die Software hätte gerade nix zu tun. Das ist also eine gute Stelle, "nichts tun" zu verhindern, aber auch die Maschine nicht zu überfordern...
  Mit Zitat antworten Zitat
Benutzerbild von Garfield
Garfield

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

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

  Alt 24. Nov 2005, 16:03
Audio ist in diesem Fall nicht dabei. Irgendwie scheint es tatsächlich etwas mit der Framerate zu tun zu haben. Das selbe Video läuft mit 50 fps-Encoding schneller als mit 25 fps-Encoding, obwohl es eigentlich dieselben Frames sind.

Die Geschwindigkeit scheint auch vom System abhängig zu sein. Auf meinem Athlon 2400 XP mit Win98SE geht es erheblich flotter vorwärts als auf dem Celeron 2200 mit WinXP. Die Geschwindigkeit bleibt aber egal ob Play, Cursortaste oder OnIdle in etwa gleich.

Ich habe OnIdle und AppMessage ausprobiert. Es funktioniert sehr gut, aber ich kann nicht feststellen, dass es schneller geht.

Zitat von grizzly:
Aber auch: Das ganz funktioniert nur, wenn man AviSynth überreden kann, die Frames ohne Zeitverzögerung herauszugeben.
Das geht am besten, wenn man ohne Umwege an Avisynth herangeht. Wie zum Beispiel bei AVSCompare mit der avswrap.dll, welche allerdings fehlerhaft ist. Die ersten Frames kommen mit einer sehr hohen Framerate.

Ich habe auch schon daran gedacht, einfach Frames zu überspringen. Zum Beispiel, wenn die Taste Shift gedrückt ist, geht es in Zehner Schritten weiter.
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
 
#23

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

  Alt 24. Nov 2005, 19:26
Ich Depp !

Sorry für die falsche Fährte! Ich hatte tatsächlich geglaubt, ich bekomme mein Test-Video von AviSynth nur in 25fps, und mein in VirtualDUB mit 50Hz FrameRate neu berechnetes viel schneller. Aber nach einer Stunde rumprobieren hab ich endlich gemerkt: Die Ursache waren nur die unterschiedlichen Codecs! Das erste Video hat soviel Zeit zum dekodieren benötigt (DivX), und das neue mit einem alten MPEG4 ging ratz fatz.

Wenn ich meinen oben geposteten Code einfüge kann ich das einfach MPEG4 kodierten Video mit ca. 80fps nach rechts scrollen, im Original DivX kraucht der Rechner mit ca. 22fps dahin (nach links geht natürlich wieder gar nix wegen der leidigen Sucherei (Referenzframe, Differenzframe etc...)

Im Code oben muß natürlich für vk_right ScrollDir := +1; gesetzt werden, werde das gleich mal korrigieren...

Ansonsten ist das mit Deinem Ansatz gleich in 10er Sprüngen durchzulaufen wohl das vielversprechenste, besonders nach "links".

Oder man muß die Methode ändern, wie man die Frames aus dem Video zieht. Denn beim Abspielen schafft der Rechner das Video schließlich auch mit 25fps, samt Ton.

Gruß
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
 
#24

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

  Alt 24. Nov 2005, 22:24
Das Projekt ist für die Anzeige von Capture- und DV-AVI gedacht. Zum Test verwende ich HuffYUV-komprimierte Analog-Capture. Damit komme ich auf etwa 20-22 fps. Interessanterweise kann ich mit dem oben geposteten Teilprojekt vor und zurück genauso schnell scrollen. Im eigentlichen Projekt ruckelt es denn beim zurückscrollen wieder.

Das mit dem -/+ habe ich schon korrigiert. War etwas irritiert, als nichts ging. Aber die Methode der Eingabeverarbeitung kannte ich noch nicht. Im eigentlichen Projekt habe ich die onKey* für zwei Komponenten verwendet.

Natürlich geht es schneller. Bei AVSCompare für Avisynth 2.5* von aquaplaning und theWEF ( http://aquaplaning.20m.com/ ) geht es auch schneller. Aber wie gesagt, es ist fehlerhaft. Das Bild bleibt einfach stehen und wenn man ins Video scrollt, hat man nur ein Standbild. Mit dem DSPack oder direct mit DirectX (siehe MPEG2Schnitt http://www.mdienert.de/mpeg2schnitt/index.htm) geht es auch.

Das DSPack usw ist aber für AviSynth nicht so geeignet. Mit Vfw kann man jedes Frame einzeln anfordern und dann das nächste Script entsprechend schreiben. Dieses arbeitet im Encoder mit 15 fps. Wie schnell es in der Vorschau ist, weiß ich allerdings nicht.

In dem Beitrag http://forum.gleitz.info/showpost.ph...9&postcount=15 gibt es eine DLL in C, welche man eventuell nach Delphi übersetzen könnte. Ich kann nur kein C/C++.
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
 
#25

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

  Alt 29. Apr 2006, 22:59
Das ist nun die Lösung, welche ich gefunden habe.
Angehängte Dateien
Dateityp: exe vfwalternative_513.exe (467,5 KB, 33x aufgerufen)
Dateityp: 7z vfw-alternative_790.7z (12,6 KB, 42x aufgerufen)
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 18:35 Uhr.
Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf