![]() |
Bitmap mit Mediaplayer Display füllen
Moin Zusammen,
ich habe mal angefangen ein wenig mit Graphik zu experimentieren, und suche nun nach einer Erklärung für folgendes Problem. Vorab:
Code:
Die Zeile
TMediaPlayer.Display = frmDisplay
Code:
funktioniert, wenn der Mediaplayer nicht geöffnet ist.
bmpWork.Canvas.CopyRect(frmDisplay.ClientRect, frmDisplay.Canvas, frmDisplay.ClientRect);
Wird aber etwas dargestellt so ist die Bitmap hinterher ausschliesslich schwarz. :shock: Warum :?: :?: :?: Meine bislang einzige Erklärung: TMediaPlayer.Display nutzt nur den äusseren Rahmen des angegebenen WinControls, aber nicht dessen Oberfläche, zeichnet also gar nicht auf dieser. Sie wird nur als "Grundfarbe" geschwärzt. Dann bliebe wohl als Workaround nur noch ein Screenshot (MCI_CAPTURE wird als "unsupported" nicht ausgeführt) :? |
Hi Christian,
das könnte daran liegen, dass der MCI-Treiber vielleicht zwecks flimmerfreiem und möglichst schnellem Bild per DirectDraw auf diese Oberfläche zeichnet, von dem Bild ließe sich dann nicht so einfach ein Screenshot erstellen. Wie HyperSnapDX usw. aber beeisen muss es ja eine Möglichkeit geben, vielleicht ebenfalls mit DirectX, darauf zuzugreifen, ich wüsste allerdings nicht wie. MfG, d3g |
Moin d3g,
danke, gute Idee, DirectX könnte ich auch mal versuchen. Mir geht's hier ja auch nicht um eine Problemlösung, sondern, im Wesentlichen, um Ideen, wie man die Zeichenfläche des Mediaplayers anzapfen kann, bzw. den Grund warum es so wie ich es geschrieben habe nicht funktioniert. |
Moin Zusammen,
jetzt bekomme ich aber Verständnisprobleme :? Ich habe jetzt drei ScreenShot Varianten ausprobiert.
Ergebnis: In allen drei Fällen ist exakt der Bereich, der das Display des Mediaplayers darstellt schwarz. :shock: :shock: :shock: Bevor ich mich jetzt auch noch auf DirectX stürze... Hat noch jemand eine Idee? |
Wenn du Pech hast, dann läuft das Videobild im Overlay-Modus. Bei diesem wird ein Bereich mit einer bestimmten Farbe gefüllt, wobei für die Ausgabe der Bilddaten die Grafikkarte selbst verantwortlich ist. Somit steht im Bildschirmspeicher, auf den Windows nur zugreifen kann, nur die Overlay-Farbe und nur diese kannst du dann kopieren. Aber so viel ich weiß nutzt der MediaPlayer DirectShow also nicht den Overlay-Modus (wie es TV-Karten machen).
|
Moin jbg,
danke für die Info. Vermutlich wird das Video wohl tatsächlich im Overlaymodus dargestellt. Dafür spricht auf jeden Fall, dass sich an der Stelle, an der sich das Video befinden sollte grundsätzlich eine schwarze Fläche zeigt. Sobald der Mediaplayer geschlossen wird ist dem nicht so. Was ich zusätzlich noch beobachten konnte: Wird das Fenster mit dem Video verschoben, so verrutscht es dabei, und wird, sozusagen nachgeführt, bis es wieder im vorgesehenen Ausschnitt zu sehen ist. Da werde ich mir wohl mal intensiver das PSDK und DDK vornehmen müssen :? Vielleicht gibt's ja doch 'ne Lösung. Ursache könnte, in irgendeiner Form, auch die vorhandene TV-Karte sein. Vor deren Installation hatte ich das alles nicht ausprobiert. |
Hi Christian,
an der TV-Karte liegt's nicht, ich habe nämlich keine und es funktioniert trotzdem nicht. Wenn man unter Linux die libmpeg2 benutzt, kommt es zu den gleichen Effekten. Vielleicht kannst du dir ja mal den Sourcecode davon anschauen: ![]() MfG, d3g |
Moin Zusammen,
ich hab' inzwischen noch mal experimentiert. Ein Screenshot von Virtual Dub tut's problemlos, was mich vermuten lässt, dass dort kein Mediaplayer verwendet wird. (In den Sourcen konnte ich auch nichts entsprechendes finden) Dann fiel mir zufällig auf, dass ein Screenshot von IrfanView auch Ok war. Hierbei wird aber ganz offensichtlich ein über MCICreateWnd erzeugtes Fenster verwendet (für die die's interessiert: Unter W2K in der msvfw32.dll zu finden, nicht wie's im PSDK steht in der vfw32), und bei dem hatte ich das gleiche Problem. :shock: Wiederum durch Zufall, bin ich nun darauf gekommen, dass ein Screenshot immer funktioniert, wenn das Formular einen Moment lang nicht sichtbar war. Hat dafür jemand eine Erklärung? So würde es gehen. Ist natürlich als Lösung indiskutabel:
Delphi-Quellcode:
PS:
MediaPlayer1.Display := Panel1;
MediaPlayer1.Close; MediaPlayer1.Open; Panel1.Width := Mediaplayer1.DisplayRect.Right - Mediaplayer1.DisplayRect.Left; Panel1.Height := Mediaplayer1.DisplayRect.Bottom - Mediaplayer1.DisplayRect.Top; WindowState := wsMinimized; Application.ProcessMessages; Sleep(100); WindowState := wsNormal; Bei der Suche bin ich auf ein Forum gestossen, in der empfohlen wurde die Hardwarebeschleunigung für die Anwendung, oder, zur Not im System abzuschalten (leider ohne Beispiel :? ). Dann wird kein Overlay verwendet. Dazu konnte ich dann leider für meine Geforce 2MX nichts finden. |
Re: Bitmap mit Mediaplayer Display füllen
Desktop -> Rechtsklick -> Eigenschaften -> Einstellungen -> Erweitert -> Problembehandlung ;-)
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:23 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