AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi VideoWindowEx bei Resize verschieben
Thema durchsuchen
Ansicht
Themen-Optionen

VideoWindowEx bei Resize verschieben

Ein Thema von e-gon · begonnen am 5. Sep 2011 · letzter Beitrag vom 6. Sep 2011
Antwort Antwort
e-gon

Registriert seit: 7. Jul 2003
Ort: Stuttgart
163 Beiträge
 
Delphi 6 Enterprise
 
#1

VideoWindowEx bei Resize verschieben

  Alt 5. Sep 2011, 15:39
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
  Mit Zitat antworten Zitat
Benutzerbild von Cylence
Cylence

Registriert seit: 2. Sep 2004
Ort: Allgäu
246 Beiträge
 
Delphi 7 Enterprise
 
#2

AW: VideoWindowEx bei Resize verschieben

  Alt 5. Sep 2011, 16:22
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;
Tom
Just DO it

Geändert von Cylence ( 5. Sep 2011 um 16:26 Uhr) Grund: hab noch was hinzugefügt
  Mit Zitat antworten Zitat
e-gon

Registriert seit: 7. Jul 2003
Ort: Stuttgart
163 Beiträge
 
Delphi 6 Enterprise
 
#3

AW: VideoWindowEx bei Resize verschieben

  Alt 5. Sep 2011, 16:48
Danke für die schnelle Antwort! Werde ich gleich mal ausprobieren...
  Mit Zitat antworten Zitat
e-gon

Registriert seit: 7. Jul 2003
Ort: Stuttgart
163 Beiträge
 
Delphi 6 Enterprise
 
#4

AW: VideoWindowEx bei Resize verschieben

  Alt 6. Sep 2011, 09:28
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
  Mit Zitat antworten Zitat
Antwort Antwort


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 21:47 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