Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi VideoWindowEx bei Resize verschieben (https://www.delphipraxis.net/162784-videowindowex-bei-resize-verschieben.html)

e-gon 5. Sep 2011 14:39

VideoWindowEx bei Resize verschieben
 
Hallo,

um Videos anzuzeigen nutze ich VideoWindowEx. Funktioniert auch ganz gut.

Aber ich möchte, dass das Video immer in der Mitte meines Fensters angezeigt wird, auch wenn das Fenster verkleinert oder vergrößert wird. Hierzu nutze ich die Top- und Left-Eigentschaft von VideoWindowEx. Dabei wird allerdings nur ein schwarzes Rechteck, nicht aber das Video selbst, verschoben.
Beim Verschieben des ganzen Fensters wandert das Video mit. Es kann also nichts mit Overlay zu tun haben...

Kann es daran liegen, dass ich FilterGraph nutze? Kennt jemand eine Möglichkeit das Video selbst (auch wenn es gerade abgespielt wird) innerhalb eines Fensters zu verschieben?

Gruß
e-gon

Cylence 5. Sep 2011 15:22

AW: VideoWindowEx bei Resize verschieben
 
Hi,

evtl hilft dir diese funktion damit wärs glaub ich möglich:

Delphi-Quellcode:
function StretchRectEx(aRect : TRect; VideoAspectRatio : TPoint;
     SubtitleHeight, SubtitleNonOverlappedRows, SubtitleMaxRows,
     VideoVertShift, VideoHorizShift, VideoZoom: integer; StretchRatio : integer;
     out Centered : boolean): TRect;
var
  imgW, imgH,       // video width, height
  imgWzoom, imgHzoom, // zoomed video width, height
  rectW, rectH,     // destination width, height
  TmpTop : Integer;           // aux for video top
begin
  rectW := aRect.Right - aRect.Left;
  rectH := aRect.Bottom - aRect.Top;
  imgW := rectW;
  imgH := MulDiv(imgW, VideoAspectRatio.Y, VideoAspectRatio.X);
   if imgH > rectH then begin
       imgH := rectH;
       imgW := MulDiv(imgH, VideoAspectRatio.X, VideoAspectRatio.Y);
     end;
  imgH := MulDiv(imgH, StretchRatio, 100);
  TmpTop := (rectH - imgH) div 2;
  if (rectH - (TmpTop + imgH)) < (SubtitleHeight * SubtitleNonOverlappedRows) then
    Centered := true
  else begin
      Centered := false;
      TmpTop := (rectH - imgH - SubtitleMaxRows * SubtitleHeight) div 2;
    end;
  imgWzoom := MulDiv(imgW, VideoZoom, 100);
  imgHzoom := MulDiv(imgH, VideoZoom, 100);
  TmpTop := TmpTop + (imgH - imgHzoom) div 2;
  Result := Bounds(aRect.Left + (rectW - imgWzoom) div 2 + VideoHorizShift,aRect.Top + TmpTop + VideoVertShift, imgWzoom, imgHzoom);
end;

ach ja und wie man sie ausführt:

Delphi-Quellcode:
var
  BasicVideo2 : IBasicVideo2;
  R : TRect;
  centering : boolean;
begin
  Centering := True;
  if Succeeded(ActiveFiltergraph.QueryInterface(IID_IBasicVideo2, BasicVideo2)) then begin
      R := StretchRectEx(MRVideoWindow.ClientRect, // BoundsRect,
         Point(Trunc(ASpx.Value),Trunc(Aspy.Value)),0,0,0,
         Trunc(Vertshift.Value), Trunc(horzshift.Value),
         Trunc(ZoomX.Value), 100, centering);
       BasicVideo2.SetDestinationPosition(R.Left, R.Top,
         (R.Right - R.Left), (R.Bottom - R.Top));
      BasicVideo2 := nil;
    end;

e-gon 5. Sep 2011 15:48

AW: VideoWindowEx bei Resize verschieben
 
Danke für die schnelle Antwort! Werde ich gleich mal ausprobieren...

e-gon 6. Sep 2011 08:28

AW: VideoWindowEx bei Resize verschieben
 
Nachdem BasicVideo2.SetDestinationPosition auch nicht den erhofften Erfolg brachte, habe ich nach vielen Versuchen nun endlich eine simple Lösung gefunden:
Wenn man die Eigenschaft Width oder Height von VideoWindowEx zuerst auf 0 setzt und dann den eigentlichen Wert zuweißt, wird VideoWindowEx gezwungen sich selbst zu aktualisieren und nimmt dabei auch gleich die neuen Werte von Top und Left an.
Vielleicht nicht die eleganteste Lösung, aber effektiv und funktioniert selbst bei laufendem Video!

Gruß
e-gon


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:56 Uhr.

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