Moin Zusammen,
Problem erkannt, und mittels Workaround gelöst
Wenn man über MCICreateWnd ein Mediaplayerfenster erzeugt, gibt es ja auch einen Menüpunkt der es einem gestattet Kommandos zu verschicken, so wie man es programmseitig mittels mciSendString machen kann.
Auch über diesen Weg gab' es nun die Rückmeldung, dass die Kommandos nicht unterstützt werden. Scheint also doch kein Anwendungsfehler von mir zu sein, sondern tatsächlich nicht so zu gehen
Auf welchem Wege nun das Kopieren aus dem Menü heraus intern funktioniert hab' ich allerdings nicht herausbekommen können.
Falls ich nicht der einzige bin, der so etwas vorhat möchte ich allerdings mal kurz den Workaround vorstellen, den ich dazu gefunden habe.
Ich habe mir das DSPack (Version 2.31 vom 01.06.2003) von
www.progdigy.com heruntergeladen, dass, hauptsächlich, ein Wrapper für DirectShow ist. Leider lässt sich diese Version nur mit
DirectX 9 verwenden. Dessen Installation ist also auch notwendig.
Wichtig noch für alle die DelphiX verwenden. Aufgrund von Namensgleichheit bei Units ist davon auszugehen, dass dies nach der Installation des DSPack nicht mehr funktioniert. Ich habe nicht versucht beides parallel lauffähig zu bekommen, obwohl es wohl machbar sein sollte.
Die für meinen Workaround erforderlichen Interfaces wären IFilter, IFilterGraph, ISampleGrabber, IMediaSeeking und IVideoWindow, falls es jemand mal ohne Komponenten ausprobieren möchte (erstmal werde ich mir das ersparen
)
Als Komponenten aus dem DSPack werden benötigt:
- TFilterGraph
Die Standardeinstellungen können beibehalten werden
Die Ereignisse OnActivate und OnGraphPaused habe ich hier verwendet
- TSampleGrabber
Die Eigenschaft FilterGraph muss gesetzt werden
Die Eigenschaft MediaType wird wie folgt gesetzt:
Major Type Video, Sub Type RGB24 und Format Type VideoInfo
- TFilter
Die Eigenschaft FilterGraph muss gesetzt werden.
Als BaseFilter habe ich unter Selector\Filters\DirectShow Filters\SampleGrabber ausgewählt
(nicht wundern, wenn auf den [...] Button bei BaseFilter erst mal nichts passiert. Die Kompo sucht erst einmal die auf dem Rechner befindlichen Filter zusammen, und das kann dauern )
- TVideoWindow
Die Eigenschaft FilterGraph muss gesetzt werden.
Und so sieht dann der Code aus:
Delphi-Quellcode:
procedure Delay(const AdwMilliSec : DWORD);
var
dwStart : DWORD;
begin
dwStart := GetTickCount;
while (GetTickCount-dwStart) < AdwMilliSec do Application.ProcessMessages;
end;
// an beliebiger Stelle, z.B. auf Button Click, den FilterGraph aktivieren
FilterGraph1.Active := true;
// OnActivate des FilterGraph
FilterGraph1.RenderFile('<Pfad der betreffenden Datei>');
FilterGraph1.Pause;
// OnGraphPaused
// (in diesem Beispiel werden das erste und das letzte Bild der Datei als Bitmap gespeichert)
var
bmpWork : TBitmap;
ms : IMediaSeeking;
i64Current : int64;
i64Stop : int64;
begin
bmpWork := TBitmap.Create;
try // Anfangsbild speichern
SampleGrabber1.GetBitmap(bmpWork);
bmpWork.SaveToFile('c:\testbmpA.bmp');
finally
FreeAndNil(bmpWork);
end;
// IMediaSeeking abfragen, um die Position verstellen zu können
FilterGraph1.QueryInterface(IMediaSeeking,ms);
// aktuelle Position und Endposition in der Datei auslesen
ms.GetPositions(i64Current,i64Stop);
// aktuelle Position auf Endposition setzen
ms.SetPositions(i64Stop,AM_SEEKING_AbsolutePositioning,i64Stop,AM_SEEKING_AbsolutePositioning);
// Ein wenig auf das Positionieren warten
Delay(500);
bmpWork := TBitmap.Create;
try
SampleGrabber1.GetBitmap(bmpWork);
bmpWork.SaveToFile('c:\testbmpE.bmp');
finally
FreeAndNil(bmpWork);
end;
end;
Was vielleicht noch interessant ist:
Ohne das VideoWindow funktioniert es nicht, aber die Grösse des VideoWindow spielt keine Rolle, da die herauskopierten Frames immer in ihrer jeweiligen 100% Grösse (Abmessung) gespeichert werden.