Einzelnen Beitrag anzeigen

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