WEBCam Videorecordung : Zeitbegrenzung über Parametereinstellung wTimeLimit unter WM_CAP_SET_SEQUENCE_SETUP funktioniert nicht

  • VB.NET

    WEBCam Videorecordung : Zeitbegrenzung über Parametereinstellung wTimeLimit unter WM_CAP_SET_SEQUENCE_SETUP funktioniert nicht

    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