AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Mediaplayer Firemonkey

Ein Thema von holgerderchsler · begonnen am 26. Sep 2015 · letzter Beitrag vom 30. Sep 2015
Antwort Antwort
Seite 1 von 3  1 23   
holgerderchsler

Registriert seit: 30. Dez 2009
Ort: Zürich
23 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#1

Mediaplayer Firemonkey

  Alt 26. Sep 2015, 09:11
Hallo und einen schönen Tag.

Ich habe in meiner plattformübergreifenden Anwendung einen Mediaplayer integriert. Nun wollte ich das Bild auf dem ganzen Bildschirm darstellen, finde aber keine Möglichkeit dies zu tun. Der Mediaplayer und auch das notwendige MediaplayerControl bieten weder eine Skalierung noch Zoomfunktionen an. Hat da eventuell jemand eine Idee?

Liebe Grüsse

Holger
Holger
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#2

AW: Mediaplayer Firemonkey

  Alt 26. Sep 2015, 11:29
Du kannst aber doch die Properties Width und Height der Komponente an deinen Bildschirm anpassen, oder etwa nicht?
  Mit Zitat antworten Zitat
holgerderchsler

Registriert seit: 30. Dez 2009
Ort: Zürich
23 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#3

AW: Mediaplayer Firemonkey

  Alt 26. Sep 2015, 15:38
Ja, die Eigenschaften kann ich schon ändern, aber das Bild bleibt immer gleich gross oder besser klein.
Holger
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.538 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Mediaplayer Firemonkey

  Alt 26. Sep 2015, 20:00
Ich kenne da leider auch keine Standardmöglichkeit. Es wird maximal die Größe des Videos ausgegeben. Das Bild des Videos wird direkt auf den Screen gerendert, daher helfen alle Umgehungsversuche nicht (z.B. die Mediaplayer-Komponente in ein Scaled-Layout zu legen und dieses zu skalieren).

Für Windows wird die Videoplayer-Funktion in FMX.Media.Win implementiert, die Ausgabegröße des Fensters dort in der procedure "UpdateMediaFromControl" festgelegt. Hier könntest Du evtl. eigene Anpassungen machen (z.B. statt "Bounds.Fit", die Größe des Monitors als Grundlage eines Ausgabe-Rects verwenden).

Du müsstest da natürlich alles selber berechnen, damit die Ausgabe des Bildes die richtige Vergrößerung hat und mit den entsprechenden Offests richtig in das Ausgabefenster reingeht, aber das sollte machbar sein.

Du könntest hier entweder eine eigene Ableitung der Komponente machen, oder eine Kopie der FMX.Media.Win.pas in Dein Projektverzeichnis legen und dort die entsprechenden Änderungen in der Datei vornehmen.
  Mit Zitat antworten Zitat
holgerderchsler

Registriert seit: 30. Dez 2009
Ort: Zürich
23 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#5

AW: Mediaplayer Firemonkey

  Alt 27. Sep 2015, 16:18
Erst mal Danke und schön, dass ich nichts einfaches übersehen habe. Das klingt einleuchtend. Ich könnte mir allerdings vorstellen, dass ich nicht der erste bin, der dieses Problem. Eine Komponente direkt gibt es wohl nicht?

Gruss Holger
Holger
  Mit Zitat antworten Zitat
hathor
(Gast)

n/a Beiträge
 
#6

AW: Mediaplayer Firemonkey

  Alt 27. Sep 2015, 22:50
Da gibt es was:

Delphi-Quellcode:
uses ... FMX.Media.Win,..., mediaPlayerStretchFix;

procedure TfrmMain.Button2Click(Sender: TObject);
var mp: TWindowsMedia;
   filename : String;
begin
filename:= 'F:\_ForExportOnly\SDXC64\TEST6.mp4'; // DEIN Videofile !
  mp:= TWindowsMedia.create(filename);
  mp.Control:= MediaPlayerControl1;
  mp.Play;
  mp.Stretch; // <--------------
end;
---------------------
Delphi-Quellcode:
unit mediaPlayerStretchFix; //20150927

interface

uses Winapi.Windows, FMX.Platform.Win, FMX.Media.Win, FMX.Forms, System.Types,
      FMX.controls, System.Classes, Directshow9;

type

  TMediaPlayerTurbo = class helper for TWindowsMedia
  private
    function getFWnd: HWND;
    function getFControl: TControl;
    function getVMRWC: IVMRWindowlessControl9;
    property leFWnd:HWND read getFWnd;
    property leControl:TControl read getFControl;
    property leFVMRWindowlessControl:IVMRWindowlessControl9 read getVMRWC;
  public
    procedure Stretch;
  end;

implementation

procedure TMediaPlayerTurbo.Stretch;
var
  P: TPointF;
  R: TRect;
  Bounds: TRectF;
  Form: TCommonCustomForm;
  // this is just an updated version of TRecF.Fit to support scaling up
  function MyRectFit(var R: TRectF; const BoundsRect: TRectF): Single;
  var ratio: Single;
  begin
    Result := 1;
    if BoundsRect.Width * BoundsRect.Height = 0 then Exit;
    if (R.Width / BoundsRect.Width) > (R.Height / BoundsRect.Height) then
      ratio := R.Width / BoundsRect.Width
    else
      ratio := R.Height / BoundsRect.Height;
    // UPDATED
    R := RectF(0, 0, R.Width / ratio, R.Height / ratio);
    Result := ratio;
    RectCenter(R, BoundsRect);
  end;

begin
  if leFWnd <> 0 then
  begin
    if (leControl <> nil) and not(csDesigning in Control.ComponentState) and
      (Control.ParentedVisible) and (Control.Root <> nil) and
      (Control.Root.GetObject is TCommonCustomForm) then
    begin
      Form := TCommonCustomForm(Control.Root.GetObject);
      P := self.GetVideoSize;
      Bounds := TRectF.Create(0, 0, P.X, P.Y);
      // UPDATED: Bounds.Fit(RectF(0, 0, Control.AbsoluteWidth, Control.AbsoluteHeight));
      MyRectFit(Bounds, RectF(0, 0, Control.AbsoluteWidth, Control.AbsoluteHeight));
      Bounds.Offset(Control.AbsoluteRect.Left, Control.AbsoluteRect.Top);
      SetParent(leFWnd, FmxHandleToHWND(Form.Handle));
      SetWindowPos(leFWnd, 0, Bounds.Round.Left, Bounds.Round.Top, Bounds.Round.Width,
                   Bounds.Round.Height, 0);
      R.Create(0, 0, Bounds.Round.Width, Bounds.Round.Height);
      if leFVMRWindowlessControl <> nil then
        leFVMRWindowlessControl.SetVideoPosition(nil, @R);
      ShowWindow(leFWnd, SW_SHOW)
    end
    else
      ShowWindow(leFWnd, SW_HIDE)
  end;
end;

function TMediaPlayerTurbo.getFControl: TControl;
begin result:=TControl(fCOntrol); end;

function TMediaPlayerTurbo.getFWnd: HWND;
begin result:=self.fWnd; end;

function TMediaPlayerTurbo.getVMRWC: IVMRWindowlessControl9;
begin result:=self.FVMRWindowlessControl; end;

end.
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.538 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Mediaplayer Firemonkey

  Alt 28. Sep 2015, 00:01
Ja klar, Classhelper geht natürlich auch (oft).

Hier nur 3 kurze Anmerkungen:

1. Man muss nicht unbedingt ein eigenes Media-Objekt erzeugen. Man kann die ergänzte Funktion auch bei den üblicherweise verwendeten Komponenten mit

TWindowsMedia (Mediaplayer1.Media).stretch; aufrufen.

2. Das ist natürlich nur eine Lösung für Windows, wollte man eine Plattform-übergreifende Lösung, müsste man auch Classhelper für FMX.Media.Mac.pas, FMX.Media.iOS.pas und FMX.Media.Android.pas erstellen.

3. Gut wäre auch, man macht einen Feature-Request und regt beim Quality-Portal an, eine entsprechende Erweiterung in die bestehende Komponente einzubauen.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.859 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Mediaplayer Firemonkey

  Alt 28. Sep 2015, 09:50
http://www.fmxexpress.com/record-pla...droid-and-ios/
Markus Kinzler
  Mit Zitat antworten Zitat
hathor
(Gast)

n/a Beiträge
 
#9

AW: Mediaplayer Firemonkey

  Alt 28. Sep 2015, 11:01
Man kann die ergänzte Funktion auch bei den üblicherweise verwendeten Komponenten mit

TWindowsMedia (Mediaplayer1.Media).stretch; aufrufen.
Ja, das funktioniert sehr gut:
Delphi-Quellcode:
procedure TfrmMain.FormResize(Sender: TObject);
begin
if (MediaPlayer1.State = TMediaState.Playing) then
TWindowsMedia (Mediaplayer1.Media).stretch;
end;
  Mit Zitat antworten Zitat
holgerderchsler

Registriert seit: 30. Dez 2009
Ort: Zürich
23 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#10

AW: Mediaplayer Firemonkey

  Alt 28. Sep 2015, 15:33
Super, viele Ideen. werde heute Abend am PC die tollen Ideen probieren umzusetzen, sage euch dann, wie es gelaufen ist.

Liebe Grüsse und vielen Dank.

Holger
Holger
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 04:42 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