Hallo,
im Forum sind einige Beispiel zur Aufnahme von Videos enthalten. Meine Videos werden nicht manuell , sondern über Code gestartet/gestoppt/gespeichert.
Das funktioniert im Prinzip auch alles. Die Funktion SendMessage(hHwnd, WM_CAP_SEQUENCE, 0, 0) selbst nimmt das Video auf und hört damit aber nach dem Start auch nicht auf. Das ist soweit auch okay.
Eine Timer-Unterbrechung zum Stop des Videos wurde ignoriert, vermutlich hat WM_CAP_SEQUENCE Vorrang vor dem Timer und lässt sich so nicht unterbrechen/stoppen.
Also habe ich versucht gemäß der Dokumentation die Einstellungen zu überschreiben mit WM_CAP_SET_SEQUENCE_SETUP.
Durch Änderung der Variablen
fYield = 1
fLimitEnabled = True
wTimeLimit = 15
sollte das Video eigentlich auch stoppen...aber die Aufnahme wird eben nach 15 Sekunden NICHT beendet, sondern läuft endlos weiter.
Die Funktionen WM_CAP_GET_SEQUENCE_SETUP und WM_CAP_SET_SEQUENCE_SETUP liefern beide einen Wert <> 0 aus, also nach meinem Verständnis erfolgreich.
Vielleicht liegt ein Fehler in der Struktur bei mir vor ??
Wäre dankbar für einen Tipp, was ich möglicherweise ausprobieren könnte.
Liebe Grüße Uwe
Anbei mein Code :
Private Structure CAPTUREPARMS
Public dwRequestMicroSecPerFrame As Int32
Public fMakeUserHitOKToCapture As Int32
Public wPercentDropForError As Int32
Public fYield As Int32
Public dwIndexSize As Int32
Public wChunkGranularity As Int32
Public fUsingDOSMemory As Int32
Public wNumVideoRequested As Int32
Public fCaptureAudio As Int32
Public wNumAudioRequested As Int32
Public vKeyAbort As Int32
Public fAbortLeftMouse As Int32
Public fAbortRightMouse As Int32
Public fLimitEnabled As Int32
Public wTimeLimit As Int32
Public fMCIControl As Int32
Public fStepMCIDevice As Int32
Public dwMCIStartTime As Int32
Public dwMCIStopTime As Int32
Public fStepCaptureAt2x As Int32
Public wStepCaptureAverageFrames As Int32
Public dwAudioBufferSize As Int32
Public fDisableWriteCache As Int32
Public AVStreamMaster As Int32
End Structure
Private Const WS_CHILD As Int32 = &H40000000
Private Const WS_VISIBLE As Int32 = &H10000000
Private Const INVALID_HANDLE_VALUE As Int32 = -1
Private Const WM_USER As Int32 = &H400
Private Const WM_CAP_SET_CALLBACK_VIDEOSTREAM As Int32 = WM_USER + 6
Private Const WM_CAP_DRIVER_CONNECT As Int32 = WM_USER + 10
Private Const WM_CAP_DRIVER_DISCONNECT As Int32 = WM_USER + 11
Private Const WM_CAP_DLG_VIDEOFORMAT As Int32 = WM_USER + 41
Private Const WM_CAP_DLG_VIDEODISPLAY As Int32 = WM_USER + 43
Private Const WM_CAP_GET_VIDEOFORMAT As Int32 = WM_USER + 44
Private Const WM_CAP_SET_VIDEOFORMAT As Int32 = WM_USER + 45
Private Const WM_CAP_DLG_VIDEOCOMPRESSION As Int32 = WM_USER + 46
Private Const WM_CAP_SET_PREVIEW As Int32 = WM_USER + 50
Private Const WM_CAP_SET_PREVIEWRATE As Int32 = WM_USER + 52
Private Const WM_CAP_SET_SCALE As Int32 = WM_USER + 53
Private Const WM_CAP_EDIT_COPY As Long = WM_USER + 30
Private Const WM_CAP_FILE_SET_CAPTURE_FILE = WM_USER + 20
Private Const WM_CAP_SEQUENCE As Int32 = WM_USER + 62
Private Const WM_CAP_SEQUENCE_NOFILE As Int32 = WM_USER + 63
Private Const WM_CAP_SET_SEQUENCE_SETUP As Int32 = WM_USER + 64
Private Const WM_CAP_GET_SEQUENCE_SETUP As Int32 = WM_USER + 65
Private Const WM_CAP_STOP As Int32 = WM_USER + 68
Private oCapParams As New CAPTUREPARMS
Private Sub video_start()
' Videoaufnahme starten
Dim iHeight As Integer = BildBox.Height
Dim iWidth As Integer = BildBox.Width
Dim dateiname_avi As String
Dim egal As Integer
hHwnd = capCreateCaptureWindowA(iDevice, WS_VISIBLE Or WS_CHILD, 0, 0, 640, 480, BildBox.Handle.ToInt32, 0)
' Treiber aufrufen und Camera starten
If SendMessage(hHwnd, WM_CAP_DRIVER_CONNECT, iDevice, 0) Then
SendMessage(hHwnd, WM_CAP_SET_SCALE, True, 0)
SendMessage(hHwnd, WM_CAP_SET_PREVIEWRATE, 66, 0)
SendMessage(hHwnd, WM_CAP_SET_PREVIEW, True, 0)
SendMessage(hHwnd, WM_CAP_SET_SCALE, 1, 0)
' User wählt Videoformat aus
' SendMessage(hHwnd, WM_CAP_DLG_VIDEOCOMPRESSION, 0, 0)
' SendMessage(hHwnd, WM_CAP_DLG_VIDEOFORMAT, 0, 0)
zaehler = zaehler + 1
dateiname_avi = My.Computer.FileSystem.SpecialDirectories.Temp & "\Test" & Str(zaehler) & ".avi"
' Datei löschen falls vorhanden
If Dir(dateiname_avi) <> "" Then
My.Computer.FileSystem.DeleteFile(dateiname_avi)
End If
' Videoeinstellungen einlesen
If SendMessage(hHwnd, WM_CAP_GET_SEQUENCE_SETUP, Len(oCapParams), oCapParams) <> 0 Then
' Videoeinstellungen verändern
oCapParams.fYield = 1
oCapParams.fAbortLeftMouse = 0
oCapParams.fAbortRightMouse = 0
oCapParams.fLimitEnabled = True
oCapParams.wTimeLimit = 15
' Videoeinstellungen zurückschreiben
SendMessage(hHwnd, WM_CAP_SET_SEQUENCE_SETUP, Len(oCapParams), oCapParams) <> 0 Then
End If
SendMessage(hHwnd, WM_CAP_FILE_SET_CAPTURE_FILE, Nothing, dateiname_avi)
SendMessage(hHwnd, WM_CAP_SEQUENCE, 0, 0)
SetWindowPos(hHwnd, HWND_BOTTOM, 0, 0, BildBox.Width, BildBox.Height, SWP_NOMOVE Or SWP_NOZORDER)
Else
DestroyWindow(hHwnd)
End If
End Sub
im Forum sind einige Beispiel zur Aufnahme von Videos enthalten. Meine Videos werden nicht manuell , sondern über Code gestartet/gestoppt/gespeichert.
Das funktioniert im Prinzip auch alles. Die Funktion SendMessage(hHwnd, WM_CAP_SEQUENCE, 0, 0) selbst nimmt das Video auf und hört damit aber nach dem Start auch nicht auf. Das ist soweit auch okay.
Eine Timer-Unterbrechung zum Stop des Videos wurde ignoriert, vermutlich hat WM_CAP_SEQUENCE Vorrang vor dem Timer und lässt sich so nicht unterbrechen/stoppen.
Also habe ich versucht gemäß der Dokumentation die Einstellungen zu überschreiben mit WM_CAP_SET_SEQUENCE_SETUP.
Durch Änderung der Variablen
fYield = 1
fLimitEnabled = True
wTimeLimit = 15
sollte das Video eigentlich auch stoppen...aber die Aufnahme wird eben nach 15 Sekunden NICHT beendet, sondern läuft endlos weiter.
Die Funktionen WM_CAP_GET_SEQUENCE_SETUP und WM_CAP_SET_SEQUENCE_SETUP liefern beide einen Wert <> 0 aus, also nach meinem Verständnis erfolgreich.
Vielleicht liegt ein Fehler in der Struktur bei mir vor ??
Wäre dankbar für einen Tipp, was ich möglicherweise ausprobieren könnte.
Liebe Grüße Uwe
Anbei mein Code :
Private Structure CAPTUREPARMS
Public dwRequestMicroSecPerFrame As Int32
Public fMakeUserHitOKToCapture As Int32
Public wPercentDropForError As Int32
Public fYield As Int32
Public dwIndexSize As Int32
Public wChunkGranularity As Int32
Public fUsingDOSMemory As Int32
Public wNumVideoRequested As Int32
Public fCaptureAudio As Int32
Public wNumAudioRequested As Int32
Public vKeyAbort As Int32
Public fAbortLeftMouse As Int32
Public fAbortRightMouse As Int32
Public fLimitEnabled As Int32
Public wTimeLimit As Int32
Public fMCIControl As Int32
Public fStepMCIDevice As Int32
Public dwMCIStartTime As Int32
Public dwMCIStopTime As Int32
Public fStepCaptureAt2x As Int32
Public wStepCaptureAverageFrames As Int32
Public dwAudioBufferSize As Int32
Public fDisableWriteCache As Int32
Public AVStreamMaster As Int32
End Structure
Private Const WS_CHILD As Int32 = &H40000000
Private Const WS_VISIBLE As Int32 = &H10000000
Private Const INVALID_HANDLE_VALUE As Int32 = -1
Private Const WM_USER As Int32 = &H400
Private Const WM_CAP_SET_CALLBACK_VIDEOSTREAM As Int32 = WM_USER + 6
Private Const WM_CAP_DRIVER_CONNECT As Int32 = WM_USER + 10
Private Const WM_CAP_DRIVER_DISCONNECT As Int32 = WM_USER + 11
Private Const WM_CAP_DLG_VIDEOFORMAT As Int32 = WM_USER + 41
Private Const WM_CAP_DLG_VIDEODISPLAY As Int32 = WM_USER + 43
Private Const WM_CAP_GET_VIDEOFORMAT As Int32 = WM_USER + 44
Private Const WM_CAP_SET_VIDEOFORMAT As Int32 = WM_USER + 45
Private Const WM_CAP_DLG_VIDEOCOMPRESSION As Int32 = WM_USER + 46
Private Const WM_CAP_SET_PREVIEW As Int32 = WM_USER + 50
Private Const WM_CAP_SET_PREVIEWRATE As Int32 = WM_USER + 52
Private Const WM_CAP_SET_SCALE As Int32 = WM_USER + 53
Private Const WM_CAP_EDIT_COPY As Long = WM_USER + 30
Private Const WM_CAP_FILE_SET_CAPTURE_FILE = WM_USER + 20
Private Const WM_CAP_SEQUENCE As Int32 = WM_USER + 62
Private Const WM_CAP_SEQUENCE_NOFILE As Int32 = WM_USER + 63
Private Const WM_CAP_SET_SEQUENCE_SETUP As Int32 = WM_USER + 64
Private Const WM_CAP_GET_SEQUENCE_SETUP As Int32 = WM_USER + 65
Private Const WM_CAP_STOP As Int32 = WM_USER + 68
Private oCapParams As New CAPTUREPARMS
Private Sub video_start()
' Videoaufnahme starten
Dim iHeight As Integer = BildBox.Height
Dim iWidth As Integer = BildBox.Width
Dim dateiname_avi As String
Dim egal As Integer
hHwnd = capCreateCaptureWindowA(iDevice, WS_VISIBLE Or WS_CHILD, 0, 0, 640, 480, BildBox.Handle.ToInt32, 0)
' Treiber aufrufen und Camera starten
If SendMessage(hHwnd, WM_CAP_DRIVER_CONNECT, iDevice, 0) Then
SendMessage(hHwnd, WM_CAP_SET_SCALE, True, 0)
SendMessage(hHwnd, WM_CAP_SET_PREVIEWRATE, 66, 0)
SendMessage(hHwnd, WM_CAP_SET_PREVIEW, True, 0)
SendMessage(hHwnd, WM_CAP_SET_SCALE, 1, 0)
' User wählt Videoformat aus
' SendMessage(hHwnd, WM_CAP_DLG_VIDEOCOMPRESSION, 0, 0)
' SendMessage(hHwnd, WM_CAP_DLG_VIDEOFORMAT, 0, 0)
zaehler = zaehler + 1
dateiname_avi = My.Computer.FileSystem.SpecialDirectories.Temp & "\Test" & Str(zaehler) & ".avi"
' Datei löschen falls vorhanden
If Dir(dateiname_avi) <> "" Then
My.Computer.FileSystem.DeleteFile(dateiname_avi)
End If
' Videoeinstellungen einlesen
If SendMessage(hHwnd, WM_CAP_GET_SEQUENCE_SETUP, Len(oCapParams), oCapParams) <> 0 Then
' Videoeinstellungen verändern
oCapParams.fYield = 1
oCapParams.fAbortLeftMouse = 0
oCapParams.fAbortRightMouse = 0
oCapParams.fLimitEnabled = True
oCapParams.wTimeLimit = 15
' Videoeinstellungen zurückschreiben
SendMessage(hHwnd, WM_CAP_SET_SEQUENCE_SETUP, Len(oCapParams), oCapParams) <> 0 Then
End If
SendMessage(hHwnd, WM_CAP_FILE_SET_CAPTURE_FILE, Nothing, dateiname_avi)
SendMessage(hHwnd, WM_CAP_SEQUENCE, 0, 0)
SetWindowPos(hHwnd, HWND_BOTTOM, 0, 0, BildBox.Width, BildBox.Height, SWP_NOMOVE Or SWP_NOZORDER)
Else
DestroyWindow(hHwnd)
End If
End Sub