Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi DirectX IVideoWindow Refresh (https://www.delphipraxis.net/143612-directx-ivideowindow-refresh.html)

Garfield 19. Nov 2009 09:36


DirectX IVideoWindow Refresh
 
Hallo,

ich gebe über DirectX ein Video wieder. Über eine TScrollbar kann die Position im Video verändert werden. In einer TListBox sind verschiedene Positionen (Kapitel) eingetragen. Durch einen Klick auf einen Eintrag wird bei angehaltenem Video die Position der TScrollBar verändert.

Mein Problem ist nun, das die Anzeige im IVideoWindow nur regelmäßig aktualisiert wird, wenn die Position der TScrollBar mit der Maus oder den Cursortasten verändert wird. Beim Klick auf die Einträge in der TListBox wird mal aktualisiert und mal nicht. Wenn das Formular verschoben wird, wird an dem DirectX-Player ein NotifyOwnerMessage geschickt und das Bild aktualisiert.

Was ist der Unterschied, wenn die Position der TScrollBar per Maus/Cursortasten oder per Befehl geändert wird? Gibt es eine Möglichkeit ein Neuzeichnen zu erzwingen? Der Befehl Pause führt in diesem Fall leider nicht zum Erfolg.

Garfield 22. Nov 2009 10:11

Re: DirectX IVideoWindow Refresh
 
Der Versuch, IWindowlessControl anstelle IBasicVideo2 zu versuchen, hat nicht funktioniert.

Garfield 22. Nov 2009 14:06

Re: DirectX IVideoWindow Refresh
 
Urspünglich hatte ich versucht, die Aktualisierung mit einem IMediaControl.Pause direkt nach dem IMediaSeeking.SetPosition() erreichen. Das hatte ich so auch in Beispielen so gesehen. Und bei der TSrcollBar ging es sogar ohne. Das Ergebnis steht oben im ersten Beitrag. Nach langem Suchen habe ich in der MSDN bei IMediaSeeking::SetPosition folgendes gefunden und fast überlesen:

Zitat:

If the filter graph is stopped, the video renderer does not update the image after a seek operation. To the user, it will appear as if the seek did not happen. To update the image, pause the graph after the seek operation. Pausing the graph cues a new video frame for the video renderer. You can use the IMediaControl::StopWhenReady method, which pauses the graph and then stops it.
IMediaControl.StopWhenReady anstelle von IMediaControl.Pause und es funktioniert.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:13 Uhr.

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