Hallo zusammen,
ich habe mich ein wenig mit TMediaPlayer unf TMediaPlayerControl beschäftigt, aber ich finde keine
Möglichkeit einen Screenshot davon zu machen.
Hier auch ähnliches Ergebnis
http://stackoverflow.com/questions/1...control-in-fm2
Echt CrossPlatform:
Für einen Hinweis für echte Platformunabhängige Variante, vielleicht so so wie SampleBufferToBitmap
bei dem VideoCapture, wäre ich sehr dankbar.
Windows HWND Lösung:
Mir würde momentan auch erstmal die reine Windows-Lösung ausreichen:
Mit einigen Hacks auf die private members bekomme ich ein HWND von dem
DirectX Fenster,
in dem der Renderer (hoffentlich) zu kopieren scheint.
Wie kann ich nun aber mit diesem HWND unter FMX (Rx10 Seattle) weiterarbeiten ?
Kann ich mit dem HWND ein Fmx-Fenster erzeugen, und davon dann einfach mit MakeScreenshot ein TBitmap kopieren ?
Kann ich den Fensterinhalt vom HWND über HDC in ein FMX.Graphics.TBitmap kopieren ?
Zusammen mit HWND finde ich eigentlich nur etwas zu
VCL.Graphics.TBitmap, und das ist wohl nicht kompatibel zu FMX,
obwohl ich es kompilieren kann.
Über reine Windows Funktionen scheint es möglich zu sein,
HWND -> HDC -> tagBITMAP, aber am Ende bräuchte ich daraus wieder als FMX-Bitmap.
Gibt es da vielleucht einen eleganten Weg, und kann ich die HWND und
Vcl überhaupt zusammen
mit FMX mischen ohne auf die Nase zu fallen ?
EDIT:
Ich habe einen guten
Hinweis hier gefunden !
So geht der Weg von
Vcl zu Fmx
Aber leider bekomme ich das VideoBild doch nicht, sondern nur den Hintergrund.
Vielleicht ist es doch nicht das richtige
Handle, oder es ist nur ein unsichtbares Fenster ?
Ich hole mir das
Handle von hier:
Code:
function TMyMediaPlayerControl.DoMakeScreenshot : FMX.Graphics.TBitmap;
var
P: TPointF;
R: TRect;
Bounds: TRectF;
Form: TCommonCustomForm;
mpa: TMediaPlayerControl_Accessor;
ma: TMediaPlayer_Accessor;
wma: TWindowsMedia_Accessor;
begin
Result := nil;
mpa := TMediaPlayerControl_Accessor(Self);
if (mpa.FMediaPlayer <> nil) and (mpa.FMediaPlayer.Media <> nil) then
begin
ma := TMediaPlayer_Accessor( mpa.FMediaPlayer );
if Assigned( ma ) then
begin
wma := TWindowsMedia_Accessor( ma.FMedia );
if Assigned( wma ) then
begin
Result := FMX.Graphics.TBitmap.Create;
MakeScreenshot_FromHWND(wma.FWnd, Result ); // siehe Methode vom Link oben, Austausch über TMemoryStream
end;
end;
end;
end;
EDIT2:
Das HWND
Handle war richtig, denn für das Abnehmen der
DirectX-Bildinfo funktioniert diese Methode:
https://villavu.com/forum/showthread.php?t=108664
Allerdings muss man den Mode
DirectX, statt der empfohlenen DDraw benutzen.
Damit kann ich wirklich vom echten Hilfswindow einen Screenshot machen, und die Größe hängt vom Window ab, nicht vom
Video selbst.
DirectX rendert und skaliert das schön da rein, und der Screenshot holt das Bild wieder heraus.
Genau das was ich brauche.
Das Mischen
Vcl:TBitmap und Fmx:TBitmap macht bis jetzt auch keine Probleme, das Kopieren weiterhin wie oben
über TStream.Copy.
Bleibt noch die Frage: Geht es auch eleganter, nur mit FMX Hausmitteln, ohne über den
VCL Zwischenschritt ?
So dass ich nicht nur
DirectX, sonder am Besten auch OSX, iOS, Android nutzen kann ...
Rollo
Rollo