Hallo. Die folgende Prozedur verwende ich nur zum Testen der Methode.
Es wird eine AVI Datei geöffnet, der erste Frame gelesen/entpackt und dann auf eine Form geblittet ( zumindest ist das so vorgesehen *g* ).
Option Explicit
Public Sub Blitfirstframe(ByVal AVIFile As String, ByRef Ziel As Form)
Dim Ergebnis As Long 'Funktionsrückgaben
Dim DateiZeiger As Long 'AVIFile Interface-Handle
Dim StreamZeiger As Long 'AVIStream Interface-Handle
Dim FrameCount As Long 'Gesamtmenge an Frames im Stream
Dim ErsterFrame As Long 'Position des ersten Frames
Dim DateiInfo As AVI_FILE_INFO 'Datei-Info-Struktur
Dim StreamInfo As AVI_STREAM_INFO 'Stream-Info-Struktur
Dim GFZeiger As Long 'GetFrame Interface-Handle
Dim PDIBZeiger As Long 'Zeiger auf packed device independent
' bitmap im Speicher
Dim BIHeader As BitmapInfoHeader 'Infoheader benötigt für GetFrame
'Dim i As Long
Dim MEMhdc As Long 'Speicher-Devicecontext
'----------------------------------------
'Avifile Library öffnen
Call AVIFileInit
'File-Interface Zeiger holen
Ergebnis = AVIFileOpen(DateiZeiger, AVIFile, OF_SHARE_DENY_WRITE, 0&)
If Ergebnis <> AVIERR_OK Then GoTo Aufräumen
'Den ersten verfügbaren Stream öffnen
Ergebnis = AVIFileGetStream(DateiZeiger, StreamZeiger, streamtypeVIDEO, 0)
If Ergebnis <> AVIERR_OK Then GoTo Aufräumen
'Position des ersten Frames checken
ErsterFrame = AVIStreamStart(StreamZeiger)
If ErsterFrame = -1 Then GoTo Aufräumen
'Gesamtlänge des Streams auslesen(in Frames)
FrameCount = AVIStreamLength(StreamZeiger)
If FrameCount = -1 Then GoTo Aufräumen
'Dateiinfo Struktur lesen
Ergebnis = AVIFileInfo(DateiZeiger, DateiInfo, Len(DateiInfo))
If Ergebnis <> AVIERR_OK Then GoTo Aufräumen
'Streaminfo Struktur lesen
Ergebnis = AVIStreamInfo(StreamZeiger, StreamInfo, Len(StreamInfo))
If Ergebnis <> AVIERR_OK Then GoTo Aufräumen
'Bitmapinfoheader-Struktur vorbereiten (dieses Format soll die
' GetFrame-Funktion liefern)
With BIHeader
.biBitCount = 24
.biClrImportant = 0
.biClrUsed = 0
.biCompression = BI_RGB
.biHeight = StreamInfo.rcFrame.bottom - StreamInfo.rcFrame.top
.biPlanes = 1
.biSize = 40
.biWidth = StreamInfo.rcFrame.right - StreamInfo.rcFrame.left
.biXPelsPerMeter = 0
.biYPelsPerMeter = 0
.biSizeImage = (((.biWidth * 3) + 3) And &HFFFC) * .biHeight
End With
'GetFrame-Objekt erstellen
GFZeiger = AVIStreamGetFrameOpen(StreamZeiger, BIHeader)
If GFZeiger = 0 Then
MsgBox "Es konnte kein geeigneter Codec zur Dekompression des" & _
"Videostreams gefunden werden!", vbCritical, "Sowas aber auch"
GoTo Aufräumen
End If
'For i = ErsterFrame To (FrameCount - 1) + ErsterFrame
' PDIBZeiger = AVIStreamGetFrame(GFZeiger, i)
'
'Next
'Ersten Frame entpacken
PDIBZeiger = AVIStreamGetFrame(GFZeiger, ErsterFrame)
'Bei jedem Aufruf von AVIStreamGetFrame wird das alte pDIB gelöscht
'SpeicherDC erstellen und DIB selektieren
MEMhdc = CreateCompatibleDC(Ziel.hdc)
If MEMhdc = 0 Then GoTo Aufräumen
Ergebnis = SelectObject(MEMhdc, PDIBZeiger)
'An dieser Stelle scheitert der gesamte Code - SelectObject liefert
' NULL zurück
If Ergebnis = 0 Then GoTo Aufräumen
'Von SpeicherDC auf Zielkontext blitten
Ergebnis = BitBlt(Ziel.hdc, 0, 0, 320, 240, MEMhdc, 0, 0, vbSrcCopy)
Debug.Print Ergebnis
Ziel.Refresh
Aufräumen:
If MEMhdc <> 0 Then DeleteDC MEMhdc
'Released das Interface und löscht das verbliebene pDIB
If GFZeiger <> 0 Then Call AVIStreamGetFrameClose(GFZeiger)
If StreamZeiger <> 0 Then Call AVIStreamRelease(StreamZeiger)
If DateiZeiger <> 0 Then Call AVIFileRelease(DateiZeiger)
Call AVIFileExit
End Sub An der Stelle wo das DIB in den Speicherdevicekontext selektiert werden soll, springt der Code 'Aufräumen' an, da die Funktion fehlschlägt.
Das Modul mit den Deklarationen poste ich extra - das Forum meckert sonst, die Nachricht wäre zu lang  |