Einzelnen Beitrag anzeigen

Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#4
  Alt 1. Jul 2003, 14:51
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:
  1. TFilterGraph
    Die Standardeinstellungen können beibehalten werden
    Die Ereignisse OnActivate und OnGraphPaused habe ich hier verwendet
  2. TSampleGrabber
    Die Eigenschaft FilterGraph muss gesetzt werden
    Die Eigenschaft MediaType wird wie folgt gesetzt:
    Major Type Video, Sub Type RGB24 und Format Type VideoInfo
  3. 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 )
  4. 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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat