[VB6] "Screenshot" vom Formularinhalt

halo4@SETI[CB]

Lt. Junior Grade
Registriert
Jan. 2002
Beiträge
489
Hallo.

Ich Spiele mit der ActiveMovie Bibliothek alias QUARTZ.DLL (IVideoWindow & FilgraphManager) meine MPEG und AVI Dateien ab, nun wollte ich noch von diesen ein "Standbild"-Foto machen können was ich z.b. als bmp wegspeicher (Ohne Formularrand, etc).

Da man von normalen Formularen ja mit .Image den Inhalt des Formulars wegspeichern kann, dachte ich daran dieses Movie objekt in das Formular zu packen. aber ich weiss leider nicht wie ich das anstellen kann.

Code:
Option Explicit
' Objektvariablen
Private VideoW As IVideoWindow
Private Filgraph As FilgraphManager

Private Sub Command3_Click()
    BildSpeichern Form2, "C:\X3X.BMP"
End Sub

'Im Form_Load Ereignis wird "Filgraph" instanziert:
Private Sub Form_Load()
' FilgraphManager instanzieren
Set Filgraph = New FilgraphManager
End Sub

'Video Abspielen
Private Sub Command1_Click()
Dim sPath As String
' Pfad zum Video
sPath = "c:\windows\clock.avi"
' Video laden
Filgraph.RenderFile sPath
' Eigenschaften des Ausgabefenster
Set VideoW = Filgraph
With VideoW
.Caption = "Titel"
.Left = 0
.Top = 0
End With
' Play Video
Filgraph.Run
' Objekt zerstören
Set VideoW = Nothing
End Sub

'Video Anhalten
Private Sub Command2_Click()
    Filgraph.Stop
End Sub

Private Sub BildSpeichern(obj1 As Object, ByVal sFile As String)
  ' Formularinhalt als Bild speichern
  SavePicture obj1.Image, sFile
End Sub
 
Zuletzt bearbeitet:
Je nachdem mit welchem Renderer und Videocodecs das Video spielt, kann das funktionieren oder auch nicht. Sobald Du hardwarebeschleunigtes Video abspielst wird es wahrscheinlich nicht funktionieren.
Das was Du auf dem Bildschirm siehst entspricht dann nicht dem Fensterinhalt, das Du mit .Image abgreifst.

Ein Weg an den Inhalt zu kommen, geht über den Filtergraphmanager. Z.B. im IMediaSample gibt es Funktionen um an den Inhalt eines Videostreams zu kommen. Wie man jetzt aber vom Filtergraphmanager zu einem IMediaSample kommt, kann ich Dir auch nicht direkt sagen. Anfangen kann man da z.B. mit EnumFilters in IFilterGraph.

Nur gemacht habe ich das auch noch nicht. Wenn Du dich in das DirectX SDK von MS vertiefst, da gibt es viele Beispiele zu dem Thema.

MfG

Arnd
 
Hm , ja ich weiss nicht, vielleicht kennt ja jemand noch eine einfache lösung.

Ich will im Prinzip ja nur die mpeg datei ansteuern, sie abspielen und dann an einer bestimmten stelle ein Bild von machen.

Bin da auch erst grad frisch am experimentieren.
 
Hallo halo4@SETI[CB],

ich habe mal im DX SDK nachgeschaut. Es gibt dort eine Beispielanwendung in C++. Die heisst VMRPlayer. Das Interface IVMRWindowlessControl hat die Funktion GetCurrentImage. Damit kann man relativ einfach ein BMP File aus einem Video heraus speichern.

Dazu benötigst Du eine Referenz auf CLSID_VideoMixingRenderer. Daraus holst Du einen Zeiger auf IID_IVMRWindowlessControl. Und damit kannst Du dann mit GetCurrentImage auf das Bild zugreifen.

Von VB6 aus ist das sicher auch machbar, ist aber sicher nicht ganz simpel. Eine einfache Methode wüsste ich jetzt nicht. Probier mal einen simplen Screenshot vom ganzen Bildschirm wenn das Video enthalten ist, dann geht es doch einfach. Wenn nicht wovon ich ausgehe, geht es nur so.

Alternativ könntest Du die Hardwarebeschleunigung für die Graphikkarte ausschalten, dann läuft alles über das normale GDI. Dann sollte auch der Weg mit .Image funktionieren. Aber wer will das schon :-).

MfG

Arnd
 

Ähnliche Themen

Zurück
Oben