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...