AVI-Aufnahme mit Webcam funktioniert nicht

  • Hallo,

    ich habe aus diesem Thread hier (http://www.autoitscript.com/forum/topic/27…age__hl__webcam) unten stehendes Skript (von verschiedenen Stellen zusammengesucht). Die Screenshots klappen, aber das Aufnehmen eines Films klappt nicht. Ich habe schon einiges ausprobiert, aber nichts hat funktioniert. Es wird zwar eine AVI-Datei angelegt, aber die hat 0KB.

    Hat jemand eine Idee, wo das Problem liegt? Oder funktioniert es ggf. bei euch sogar - auf der Seite hat sich nie jemand beschwert (außer einem, der hatte eine TV-Karte), das die Funktion nicht funktioniert.

    Gruß
    Trainer

    Spoiler anzeigen
    [autoit]

    #include-once
    #include <GUIConstants.au3>
    #include <WindowsConstants.au3>

    [/autoit] [autoit][/autoit] [autoit]

    ;Konstanten - START
    #Region
    $WM_CAP_START = 0x400
    $WM_CAP_UNICODE_START = $WM_CAP_START +100
    $WM_CAP_PAL_SAVEA = $WM_CAP_START + 81
    $WM_CAP_PAL_SAVEW = $WM_CAP_UNICODE_START + 81
    $WM_CAP_UNICODE_END = $WM_CAP_PAL_SAVEW
    $WM_CAP_ABORT = $WM_CAP_START + 69
    $WM_CAP_DLG_VIDEOCOMPRESSION = $WM_CAP_START + 46
    $WM_CAP_DLG_VIDEODISPLAY = $WM_CAP_START + 43
    $WM_CAP_DLG_VIDEOFORMAT = $WM_CAP_START + 41
    $WM_CAP_DLG_VIDEOSOURCE = $WM_CAP_START + 42
    $WM_CAP_DRIVER_CONNECT = $WM_CAP_START + 10
    $WM_CAP_DRIVER_DISCONNECT = $WM_CAP_START + 11
    $WM_CAP_DRIVER_GET_CAPS = $WM_CAP_START + 14
    $WM_CAP_DRIVER_GET_NAMEA = $WM_CAP_START + 12
    $WM_CAP_DRIVER_GET_NAMEW = $WM_CAP_UNICODE_START + 12
    $WM_CAP_DRIVER_GET_VERSIONA = $WM_CAP_START + 13
    $WM_CAP_DRIVER_GET_VERSIONW = $WM_CAP_UNICODE_START + 13
    $WM_CAP_EDIT_COPY = $WM_CAP_START + 30
    $WM_CAP_END = $WM_CAP_UNICODE_END
    $WM_CAP_FILE_ALLOCATE = $WM_CAP_START + 22
    $WM_CAP_FILE_GET_CAPTURE_FILEA = $WM_CAP_START + 21
    $WM_CAP_FILE_GET_CAPTURE_FILEW = $WM_CAP_UNICODE_START + 21
    $WM_CAP_FILE_SAVEASA = $WM_CAP_START + 23
    $WM_CAP_FILE_SAVEASW = $WM_CAP_UNICODE_START + 23
    $WM_CAP_FILE_SAVEDIBA = $WM_CAP_START + 25
    $WM_CAP_FILE_SAVEDIBW = $WM_CAP_UNICODE_START + 25
    $WM_CAP_FILE_SET_CAPTURE_FILEA = $WM_CAP_START + 20
    $WM_CAP_FILE_SET_CAPTURE_FILEW = $WM_CAP_UNICODE_START + 20
    $WM_CAP_FILE_SET_INFOCHUNK = $WM_CAP_START + 24
    $WM_CAP_GET_AUDIOFORMAT = $WM_CAP_START + 36
    $WM_CAP_GET_CAPSTREAMPTR = $WM_CAP_START + 1
    $WM_CAP_GET_MCI_DEVICEA = $WM_CAP_START + 67
    $WM_CAP_GET_MCI_DEVICEW = $WM_CAP_UNICODE_START + 67
    $WM_CAP_GET_SEQUENCE_SETUP = $WM_CAP_START + 65
    $WM_CAP_GET_STATUS = $WM_CAP_START + 54
    $WM_CAP_GET_USER_DATA = $WM_CAP_START + 8
    $WM_CAP_GET_VIDEOFORMAT = $WM_CAP_START + 44
    $WM_CAP_GRAB_FRAME = $WM_CAP_START + 60
    $WM_CAP_GRAB_FRAME_NOSTOP = $WM_CAP_START + 61
    $WM_CAP_PAL_AUTOCREATE = $WM_CAP_START + 83
    $WM_CAP_PAL_MANUALCREATE = $WM_CAP_START + 84
    $WM_CAP_PAL_OPENA = $WM_CAP_START + 80
    $WM_CAP_PAL_OPENW = $WM_CAP_UNICODE_START + 80
    $WM_CAP_PAL_PASTE = $WM_CAP_START + 82
    $WM_CAP_SEQUENCE = $WM_CAP_START + 62
    $WM_CAP_SEQUENCE_NOFILE = $WM_CAP_START + 63
    $WM_CAP_SET_AUDIOFORMAT = $WM_CAP_START + 35
    $WM_CAP_SET_CALLBACK_CAPCONTROL = $WM_CAP_START + 85
    $WM_CAP_SET_CALLBACK_ERRORA = $WM_CAP_START + 2
    $WM_CAP_SET_CALLBACK_ERRORW = $WM_CAP_UNICODE_START + 2
    $WM_CAP_SET_CALLBACK_FRAME = $WM_CAP_START + 5
    $WM_CAP_SET_CALLBACK_STATUSA = $WM_CAP_START + 3
    $WM_CAP_SET_CALLBACK_STATUSW = $WM_CAP_UNICODE_START + 3
    $WM_CAP_SET_CALLBACK_VIDEOSTREAM = $WM_CAP_START + 6
    $WM_CAP_SET_CALLBACK_WAVESTREAM = $WM_CAP_START + 7
    $WM_CAP_SET_CALLBACK_YIELD = $WM_CAP_START + 4
    $WM_CAP_SET_MCI_DEVICEA = $WM_CAP_START + 66
    $WM_CAP_SET_MCI_DEVICEW = $WM_CAP_UNICODE_START + 66
    $WM_CAP_SET_OVERLAY = $WM_CAP_START + 51
    $WM_CAP_SET_PREVIEW = $WM_CAP_START + 50
    $WM_CAP_SET_PREVIEWRATE = $WM_CAP_START + 52
    $WM_CAP_SET_SCALE = $WM_CAP_START + 53
    $WM_CAP_SET_SCROLL = $WM_CAP_START + 55
    $WM_CAP_SET_SEQUENCE_SETUP = $WM_CAP_START + 64
    $WM_CAP_SET_USER_DATA = $WM_CAP_START + 9
    $WM_CAP_SET_VIDEOFORMAT = $WM_CAP_START + 45
    $WM_CAP_SINGLE_FRAME = $WM_CAP_START + 72
    $WM_CAP_SINGLE_FRAME_CLOSE = $WM_CAP_START + 71
    $WM_CAP_SINGLE_FRAME_OPEN = $WM_CAP_START + 70
    $WM_CAP_STOP = $WM_CAP_START + 68
    #EndRegion
    ; Konstanten - ENDE

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $avi = DllOpen("avicap32.dll")
    $user = DllOpen("user32.dll")
    $snapfile = @ScriptDir & "\scrshot.bmp"
    $moviefile = @ScriptDir & "\record.avi"

    [/autoit] [autoit][/autoit] [autoit]

    $Main = GUICreate("Camera",350,270)
    $cap = DllCall($avi, "int", "capCreateCaptureWindow", "str", "cap", "int", BitOR($WS_CHILD,$WS_VISIBLE), "int", 15, "int", 15, "int", 320, "int", 240, "hwnd", $Main, "int", 1)

    [/autoit] [autoit][/autoit] [autoit]

    DllCall($user, "int", "SendMessage", "hWnd", $cap[0], "int", $WM_CAP_DRIVER_CONNECT, "int", 0, "int", 0)
    DllCall($user, "int", "SendMessage", "hWnd", $cap[0], "int", $WM_CAP_SET_SCALE, "int", 1, "int", 0)
    DllCall($user, "int", "SendMessage", "hWnd", $cap[0], "int", $WM_CAP_SET_OVERLAY, "int", 1, "int", 0)
    DllCall($user, "int", "SendMessage", "hWnd", $cap[0], "int", $WM_CAP_SET_PREVIEW, "int", 1, "int", 0)
    DllCall($user, "int", "SendMessage", "hWnd", $cap[0], "int", $WM_CAP_SET_PREVIEWRATE, "int", 1, "int", 0)

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState(@SW_SHOW)

    [/autoit] [autoit][/autoit] [autoit]

    HotKeySet("!1", "SnapShot") ;ALT+1 --> Snapshot
    HotKeySet("!2", "StartRecording") ;ALT+2 --> Aufnahme starten
    HotKeySet("!3", "StopRecording") ;ALT+3 --> Aufnahme beenden

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    While 1
    $msg = GUIGetMsg()
    If $msg = $GUI_EVENT_CLOSE Then
    DllCall($user, "int", "SendMessage", "hWnd", $cap[0], "int", $WM_CAP_SET_CALLBACK_FRAME, "int", 0, "int", 0)
    DllCall($user, "int", "SendMessage", "hWnd", $cap[0], "int", $WM_CAP_END, "int", 0, "int", 0)
    DllCall($user, "int", "SendMessage", "hWnd", $cap[0], "int", $WM_CAP_DRIVER_DISCONNECT, "int", 0, "int", 0)
    DllClose($avi)
    DllClose($user)
    Exit
    EndIf
    Sleep(1)
    Wend

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;--------------- Funktionen -----------------------
    Func SnapShot()
    DllCall($user, "int", "SendMessage", "hWnd", $cap[0], "int", $WM_CAP_GRAB_FRAME_NOSTOP, "int", 0, "int", 0)
    DllCall($user, "int", "SendMessage", "hWnd", $cap[0], "int", $WM_CAP_FILE_SAVEDIBA, "int", 0, "str", $snapfile)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func StartRecording()
    WinSetTitle($Main, "", "WebCam - Capturing...")
    DllCall($user, "int", "SendMessage", "hWnd", $cap[0], "int", $WM_CAP_FILE_SET_CAPTURE_FILEA, "int", 0, "str", $moviefile)
    DllCall($user, "int", "SendMessage", "hWnd", $cap[0], "int", $WM_CAP_SEQUENCE, "int", 0, "int", 0)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func StopRecording()
    DllCall($user, "int", "SendMessage", "hWnd", $cap[0], "int", $WM_CAP_STOP, "int", 0, "int", 0)
    WinSetTitle($Main, "", "WebCam - Ready")
    EndFunc

    [/autoit]

    Einmal editiert, zuletzt von ip_trainer (9. Oktober 2011 um 23:04) aus folgendem Grund: Gelöst

  • Hi alpines,

    danke für den Tip, aber es lag daran, dass meine Cam nichts aufgenommen hat (wie ich eben herausgefunden habe), weil die Audioaufnahme nicht deaktiviert war.
    Mit Hilfe von BugFix`UDF kann man mein obiges Skript um folgendes ergänzen:

    Bei den Konstanten:

    Spoiler anzeigen
    [autoit]


    $tagCAPTUREPARMS = _
    'DWORD dwRequestMicroSecPerFrame;' & _
    'BOOLEAN fMakeUserHitOKToCapture;' & _
    'UINT wPercentDropForError;' & _
    'BOOLEAN fYield;' & _
    'DWORD dwIndexSize;' & _
    'UINT wChunkGranularity;' & _
    'BOOLEAN fUsingDOSMemory;' & _
    'UINT wNumVideoRequested;' & _
    'BOOLEAN fCaptureAudio;' & _
    'UINT wNumAudioRequested;' & _
    'UINT vKeyAbort;' & _
    'BOOLEAN fAbortLeftMouse;' & _
    'BOOLEAN fAbortRightMouse;' & _
    'BOOLEAN fLimitEnabled;' & _
    'UINT wTimeLimit;' & _
    'BOOLEAN fMCIControl;' & _
    'BOOLEAN fStepMCIDevice;' & _
    'DWORD dwMCIStartTime;' & _
    'DWORD dwMCIStopTime;' & _
    'BOOLEAN fStepCaptureAt2x;' & _
    'UINT wStepCaptureAverageFrames;' & _
    'DWORD dwAudioBufferSize;' & _
    'BOOLEAN fDisableWriteCache;' & _
    'UINT AVStreamMaster;'

    [/autoit]


    Und bei den Funktionen:

    Spoiler anzeigen
    [autoit]

    Func _WebcamAudioSet($sId, $iOn=1)
    If $iOn <> 1 Then $iOn = 0
    __CAP_SET_SEQUENCE_SETUP($sId, __CAP_GET_SEQUENCE_SETUP($sId), 'fCaptureAudio=' & $iOn)
    If @error Then Return 0
    Return 1
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func __CAP_GET_SEQUENCE_SETUP($sId)
    Local $aParamStruc[24] = [ _
    'dwRequestMicroSecPerFrame','fMakeUserHitOKToCapture','wPercentDropForError','fYield','dwIndexSize','wChunkGranularity','fUsingDOSMemory','wNumVideoRequested', _
    'fCaptureAudio','wNumAudioRequested','vKeyAbort','fAbortLeftMouse','fAbortRightMouse','fLimitEnabled','wTimeLimit','fMCIControl','fStepMCIDevice','dwMCIStartTime', _
    'dwMCIStopTime','fStepCaptureAt2x','wStepCaptureAverageFrames','dwAudioBufferSize','fDisableWriteCache','AVStreamMaster']
    Local $tCAPTUREPARMS = DllStructCreate($tagCAPTUREPARMS), $pCAPTUREPARMS = DllStructGetPtr($tCAPTUREPARMS)
    Local $ret = DllCall($user, "int", "SendMessage", "hWnd", $sId, "int", $WM_CAP_GET_SEQUENCE_SETUP, "WPARAM", DllStructGetSize($tCAPTUREPARMS), "LPARAM", $pCAPTUREPARMS)
    If @error Then
    Return SetError(1,0,0)
    Else
    ;~ For $i = 0 To 23
    ;~ ConsoleWrite($aParamStruc[$i] & @TAB & DllStructGetData($tCAPTUREPARMS, $aParamStruc[$i]) & @CRLF)
    ;~ Next
    Return $tCAPTUREPARMS
    EndIf
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func __CAP_SET_SEQUENCE_SETUP($sId, $tCAPTUREPARMS, $vParams=0) ; $vParams: Um nur einen Wert zu ändern "Parametername=Wert" übergeben, mehrere Werte mit "|" abtrennen
    Local $aParamStruc[24] = [ _
    'dwRequestMicroSecPerFrame','fMakeUserHitOKToCapture','wPercentDropForError','fYield','dwIndexSize','wChunkGranularity','fUsingDOSMemory','wNumVideoRequested', _
    'fCaptureAudio','wNumAudioRequested','vKeyAbort','fAbortLeftMouse','fAbortRightMouse','fLimitEnabled','wTimeLimit','fMCIControl','fStepMCIDevice','dwMCIStartTime', _
    'dwMCIStopTime','fStepCaptureAt2x','wStepCaptureAverageFrames','dwAudioBufferSize','fDisableWriteCache','AVStreamMaster']
    If $vParams == 0 Then
    Local $aParam2Set[1] = ['fYield=1'] ; == Default: Erlaubt Nutzereingaben während Capturing
    Else
    Local $aParam2Set = StringSplit($vParams, '|', 2)
    EndIf
    Local $aSplit
    For $i = 0 To UBound($aParam2Set) -1
    $aSplit = StringSplit($aParam2Set[$i], '=')
    If $aSplit[0] <> 2 Then ContinueLoop
    DllStructSetData($tCAPTUREPARMS, $aSplit[1], $aSplit[2])
    Next
    Local $pCAPTUREPARMS = DllStructGetPtr($tCAPTUREPARMS)
    Local $ret = DllCall($user, "int", "SendMessage", "hWnd", $sId, "int", $WM_CAP_SET_SEQUENCE_SETUP, "wparam", DllStructGetSize($tCAPTUREPARMS), "lparam", $pCAPTUREPARMS)
    If @error Then
    Return SetError(1,0,0)
    Else
    ;~ For $i = 0 To 23
    ;~ ConsoleWrite($aParamStruc[$i] & @TAB & DllStructGetData($tCAPTUREPARMS, $aParamStruc[$i]) & @CRLF)
    ;~ Next
    Return 1
    EndIf
    EndFunc

    [/autoit]


    Und dann die Audioaufnahme deaktivieren durch den Aufruf von:

    [autoit]

    _WebcamAudioSet($cap[0], 0)

    [/autoit]

    Das sieht dann insgesamt so aus:

    Spoiler anzeigen
    [autoit]

    #include-once
    #include <GUIConstants.au3>
    #include <WindowsConstants.au3>

    [/autoit] [autoit][/autoit] [autoit]

    ;Konstanten - START
    #Region
    $WM_CAP_START = 0x400
    $WM_CAP_UNICODE_START = $WM_CAP_START +100
    $WM_CAP_PAL_SAVEA = $WM_CAP_START + 81
    $WM_CAP_PAL_SAVEW = $WM_CAP_UNICODE_START + 81
    $WM_CAP_UNICODE_END = $WM_CAP_PAL_SAVEW
    $WM_CAP_ABORT = $WM_CAP_START + 69
    $WM_CAP_DLG_VIDEOCOMPRESSION = $WM_CAP_START + 46
    $WM_CAP_DLG_VIDEODISPLAY = $WM_CAP_START + 43
    $WM_CAP_DLG_VIDEOFORMAT = $WM_CAP_START + 41
    $WM_CAP_DLG_VIDEOSOURCE = $WM_CAP_START + 42
    $WM_CAP_DRIVER_CONNECT = $WM_CAP_START + 10
    $WM_CAP_DRIVER_DISCONNECT = $WM_CAP_START + 11
    $WM_CAP_DRIVER_GET_CAPS = $WM_CAP_START + 14
    $WM_CAP_DRIVER_GET_NAMEA = $WM_CAP_START + 12
    $WM_CAP_DRIVER_GET_NAMEW = $WM_CAP_UNICODE_START + 12
    $WM_CAP_DRIVER_GET_VERSIONA = $WM_CAP_START + 13
    $WM_CAP_DRIVER_GET_VERSIONW = $WM_CAP_UNICODE_START + 13
    $WM_CAP_EDIT_COPY = $WM_CAP_START + 30
    $WM_CAP_END = $WM_CAP_UNICODE_END
    $WM_CAP_FILE_ALLOCATE = $WM_CAP_START + 22
    $WM_CAP_FILE_GET_CAPTURE_FILEA = $WM_CAP_START + 21
    $WM_CAP_FILE_GET_CAPTURE_FILEW = $WM_CAP_UNICODE_START + 21
    $WM_CAP_FILE_SAVEASA = $WM_CAP_START + 23
    $WM_CAP_FILE_SAVEASW = $WM_CAP_UNICODE_START + 23
    $WM_CAP_FILE_SAVEDIBA = $WM_CAP_START + 25
    $WM_CAP_FILE_SAVEDIBW = $WM_CAP_UNICODE_START + 25
    $WM_CAP_FILE_SET_CAPTURE_FILEA = $WM_CAP_START + 20
    $WM_CAP_FILE_SET_CAPTURE_FILEW = $WM_CAP_UNICODE_START + 20
    $WM_CAP_FILE_SET_INFOCHUNK = $WM_CAP_START + 24
    $WM_CAP_GET_AUDIOFORMAT = $WM_CAP_START + 36
    $WM_CAP_GET_CAPSTREAMPTR = $WM_CAP_START + 1
    $WM_CAP_GET_MCI_DEVICEA = $WM_CAP_START + 67
    $WM_CAP_GET_MCI_DEVICEW = $WM_CAP_UNICODE_START + 67
    $WM_CAP_GET_SEQUENCE_SETUP = $WM_CAP_START + 65
    $WM_CAP_GET_STATUS = $WM_CAP_START + 54
    $WM_CAP_GET_USER_DATA = $WM_CAP_START + 8
    $WM_CAP_GET_VIDEOFORMAT = $WM_CAP_START + 44
    $WM_CAP_GRAB_FRAME = $WM_CAP_START + 60
    $WM_CAP_GRAB_FRAME_NOSTOP = $WM_CAP_START + 61
    $WM_CAP_PAL_AUTOCREATE = $WM_CAP_START + 83
    $WM_CAP_PAL_MANUALCREATE = $WM_CAP_START + 84
    $WM_CAP_PAL_OPENA = $WM_CAP_START + 80
    $WM_CAP_PAL_OPENW = $WM_CAP_UNICODE_START + 80
    $WM_CAP_PAL_PASTE = $WM_CAP_START + 82
    $WM_CAP_SEQUENCE = $WM_CAP_START + 62
    $WM_CAP_SEQUENCE_NOFILE = $WM_CAP_START + 63
    $WM_CAP_SET_AUDIOFORMAT = $WM_CAP_START + 35
    $WM_CAP_SET_CALLBACK_CAPCONTROL = $WM_CAP_START + 85
    $WM_CAP_SET_CALLBACK_ERRORA = $WM_CAP_START + 2
    $WM_CAP_SET_CALLBACK_ERRORW = $WM_CAP_UNICODE_START + 2
    $WM_CAP_SET_CALLBACK_FRAME = $WM_CAP_START + 5
    $WM_CAP_SET_CALLBACK_STATUSA = $WM_CAP_START + 3
    $WM_CAP_SET_CALLBACK_STATUSW = $WM_CAP_UNICODE_START + 3
    $WM_CAP_SET_CALLBACK_VIDEOSTREAM = $WM_CAP_START + 6
    $WM_CAP_SET_CALLBACK_WAVESTREAM = $WM_CAP_START + 7
    $WM_CAP_SET_CALLBACK_YIELD = $WM_CAP_START + 4
    $WM_CAP_SET_MCI_DEVICEA = $WM_CAP_START + 66
    $WM_CAP_SET_MCI_DEVICEW = $WM_CAP_UNICODE_START + 66
    $WM_CAP_SET_OVERLAY = $WM_CAP_START + 51
    $WM_CAP_SET_PREVIEW = $WM_CAP_START + 50
    $WM_CAP_SET_PREVIEWRATE = $WM_CAP_START + 52
    $WM_CAP_SET_SCALE = $WM_CAP_START + 53
    $WM_CAP_SET_SCROLL = $WM_CAP_START + 55
    $WM_CAP_SET_SEQUENCE_SETUP = $WM_CAP_START + 64
    $WM_CAP_SET_USER_DATA = $WM_CAP_START + 9
    $WM_CAP_SET_VIDEOFORMAT = $WM_CAP_START + 45
    $WM_CAP_SINGLE_FRAME = $WM_CAP_START + 72
    $WM_CAP_SINGLE_FRAME_CLOSE = $WM_CAP_START + 71
    $WM_CAP_SINGLE_FRAME_OPEN = $WM_CAP_START + 70
    $WM_CAP_STOP = $WM_CAP_START + 68

    [/autoit] [autoit][/autoit] [autoit]

    $tagCAPTUREPARMS = _
    'DWORD dwRequestMicroSecPerFrame;' & _
    'BOOLEAN fMakeUserHitOKToCapture;' & _
    'UINT wPercentDropForError;' & _
    'BOOLEAN fYield;' & _
    'DWORD dwIndexSize;' & _
    'UINT wChunkGranularity;' & _
    'BOOLEAN fUsingDOSMemory;' & _
    'UINT wNumVideoRequested;' & _
    'BOOLEAN fCaptureAudio;' & _
    'UINT wNumAudioRequested;' & _
    'UINT vKeyAbort;' & _
    'BOOLEAN fAbortLeftMouse;' & _
    'BOOLEAN fAbortRightMouse;' & _
    'BOOLEAN fLimitEnabled;' & _
    'UINT wTimeLimit;' & _
    'BOOLEAN fMCIControl;' & _
    'BOOLEAN fStepMCIDevice;' & _
    'DWORD dwMCIStartTime;' & _
    'DWORD dwMCIStopTime;' & _
    'BOOLEAN fStepCaptureAt2x;' & _
    'UINT wStepCaptureAverageFrames;' & _
    'DWORD dwAudioBufferSize;' & _
    'BOOLEAN fDisableWriteCache;' & _
    'UINT AVStreamMaster;'
    #EndRegion
    ; Konstanten - ENDE

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $avi = DllOpen("avicap32.dll")
    $user = DllOpen("user32.dll")

    [/autoit] [autoit][/autoit] [autoit]

    $snapfile = @ScriptDir & "\scrshot.bmp"
    $moviefile = @ScriptDir & "\record.avi"

    [/autoit] [autoit][/autoit] [autoit]

    $Main = GUICreate("Camera",350,270)
    $cap = DllCall($avi, "int", "capCreateCaptureWindow", "str", "cap", "int", BitOR($WS_CHILD,$WS_VISIBLE), "int", 15, "int", 15, "int", 320, "int", 240, "hwnd", $Main, "int", 1)

    [/autoit] [autoit][/autoit] [autoit]

    DllCall($user, "int", "SendMessage", "hWnd", $cap[0], "int", $WM_CAP_DRIVER_CONNECT, "int", 0, "int", 0)
    DllCall($user, "int", "SendMessage", "hWnd", $cap[0], "int", $WM_CAP_SET_SCALE, "int", 1, "int", 0)
    DllCall($user, "int", "SendMessage", "hWnd", $cap[0], "int", $WM_CAP_SET_OVERLAY, "int", 1, "int", 0)
    DllCall($user, "int", "SendMessage", "hWnd", $cap[0], "int", $WM_CAP_SET_PREVIEW, "int", 1, "int", 0)
    DllCall($user, "int", "SendMessage", "hWnd", $cap[0], "int", $WM_CAP_SET_PREVIEWRATE, "int", 1, "int", 0)

    [/autoit] [autoit][/autoit] [autoit]

    _WebcamAudioSet($cap[0], 0)

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState(@SW_SHOW)

    [/autoit] [autoit][/autoit] [autoit]

    HotKeySet("!1", "SnapShot") ;ALT+1 --> Snapshot
    HotKeySet("!2", "StartRecording") ;ALT+2 --> Aufnahme starten
    HotKeySet("!3", "StopRecording") ;ALT+3 --> Aufnahme beenden

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    While 1
    $msg = GUIGetMsg()
    If $msg = $GUI_EVENT_CLOSE Then
    DllCall($user, "int", "SendMessage", "hWnd", $cap[0], "int", $WM_CAP_SET_CALLBACK_FRAME, "int", 0, "int", 0)
    DllCall($user, "int", "SendMessage", "hWnd", $cap[0], "int", $WM_CAP_END, "int", 0, "int", 0)
    DllCall($user, "int", "SendMessage", "hWnd", $cap[0], "int", $WM_CAP_DRIVER_DISCONNECT, "int", 0, "int", 0)
    DllClose($avi)
    DllClose($user)
    Exit
    EndIf
    Sleep(1)
    Wend

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;--------------- Funktionen -----------------------
    Func SnapShot()
    DllCall($user, "int", "SendMessage", "hWnd", $cap[0], "int", $WM_CAP_GRAB_FRAME_NOSTOP, "int", 0, "int", 0)
    DllCall($user, "int", "SendMessage", "hWnd", $cap[0], "int", $WM_CAP_FILE_SAVEDIBA, "int", 0, "str", $snapfile)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func StartRecording()
    WinSetTitle($Main, "", "WebCam - Capturing...")
    DllCall($user, "int", "SendMessage", "hWnd", $cap[0], "int", $WM_CAP_FILE_SET_CAPTURE_FILEA, "int", 0, "str", $moviefile)
    DllCall($user, "int", "SendMessage", "hWnd", $cap[0], "int", $WM_CAP_SEQUENCE, "int", 0, "int", 0)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func StopRecording()
    DllCall($user, "int", "SendMessage", "hWnd", $cap[0], "int", $WM_CAP_STOP, "int", 0, "int", 0)
    WinSetTitle($Main, "", "WebCam - Ready")
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;===============================================================================
    ; Description: De/Activate audio capturing
    ; Syntax: _WebcamAudioSet($sId [, $iOn])
    ; Parameter(s): $sId - Id (returned from _WebcamOpen)
    ; $iOn - 0 or 1 (Default) to switch Off/On
    ; Requirement(s): A webcam
    ; Return Value(s): On Success - Returns 1
    ; On Failure - Returns 0
    ; Author(s): BugFix ( [email='bugfix@autoit.de'][/email] )
    ; Note(s): By default in SEQUENCE_SETUP is capturing active
    ;===============================================================================
    Func _WebcamAudioSet($sId, $iOn=1)
    If $iOn <> 1 Then $iOn = 0
    __CAP_SET_SEQUENCE_SETUP($sId, __CAP_GET_SEQUENCE_SETUP($sId), 'fCaptureAudio=' & $iOn)
    If @error Then Return 0
    Return 1
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    ;===============================================================================
    ; Description: Reads the values of current capture parameter
    ; Syntax: __CAP_GET_SEQUENCE_SETUP($sId)
    ; Return Value(s): On Success - Returns the CAPTUREPARMS-structure
    ; On Failure - Returns 0, set error
    ; Author(s): BugFix ( [email='bugfix@autoit.de'][/email] )
    ;===============================================================================
    Func __CAP_GET_SEQUENCE_SETUP($sId)
    Local $aParamStruc[24] = [ _
    'dwRequestMicroSecPerFrame','fMakeUserHitOKToCapture','wPercentDropForError','fYield','dwIndexSize','wChunkGranularity','fUsingDOSMemory','wNumVideoRequested', _
    'fCaptureAudio','wNumAudioRequested','vKeyAbort','fAbortLeftMouse','fAbortRightMouse','fLimitEnabled','wTimeLimit','fMCIControl','fStepMCIDevice','dwMCIStartTime', _
    'dwMCIStopTime','fStepCaptureAt2x','wStepCaptureAverageFrames','dwAudioBufferSize','fDisableWriteCache','AVStreamMaster']
    Local $tCAPTUREPARMS = DllStructCreate($tagCAPTUREPARMS), $pCAPTUREPARMS = DllStructGetPtr($tCAPTUREPARMS)
    Local $ret = DllCall($user, "int", "SendMessage", "hWnd", $sId, "int", $WM_CAP_GET_SEQUENCE_SETUP, "WPARAM", DllStructGetSize($tCAPTUREPARMS), "LPARAM", $pCAPTUREPARMS)
    If @error Then
    Return SetError(1,0,0)
    Else
    ;~ For $i = 0 To 23
    ;~ ConsoleWrite($aParamStruc[$i] & @TAB & DllStructGetData($tCAPTUREPARMS, $aParamStruc[$i]) & @CRLF)
    ;~ Next
    Return $tCAPTUREPARMS
    EndIf
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    ;===============================================================================
    ; Description: Sets one or more values in current capture parameter
    ; Syntax: __CAP_SET_SEQUENCE_SETUP($sId, $tCAPTUREPARMS [, $vParams=0])
    ; Parameter(s): $sId - Id (returned from _WebcamOpen)
    ; $tCAPTUREPARMS - structure from __CAP_GET_SEQUENCE_SETUP
    ; $vParams - string: "Param=value"; for more than one param use: "Param1=value|Param2=value|Param3=value|.."
    ; Return Value(s): On Success - Returns 1
    ; On Failure - Returns 0, set error
    ; Author(s): BugFix ( [email='bugfix@autoit.de'][/email] )
    ; Note(s): Meaning of all parameters: http://msdn.microsoft.com/en-us/library/…2(v=VS.85).aspx
    ;===============================================================================
    Func __CAP_SET_SEQUENCE_SETUP($sId, $tCAPTUREPARMS, $vParams=0) ; $vParams: Um nur einen Wert zu ändern "Parametername=Wert" übergeben, mehrere Werte mit "|" abtrennen
    Local $aParamStruc[24] = [ _
    'dwRequestMicroSecPerFrame','fMakeUserHitOKToCapture','wPercentDropForError','fYield','dwIndexSize','wChunkGranularity','fUsingDOSMemory','wNumVideoRequested', _
    'fCaptureAudio','wNumAudioRequested','vKeyAbort','fAbortLeftMouse','fAbortRightMouse','fLimitEnabled','wTimeLimit','fMCIControl','fStepMCIDevice','dwMCIStartTime', _
    'dwMCIStopTime','fStepCaptureAt2x','wStepCaptureAverageFrames','dwAudioBufferSize','fDisableWriteCache','AVStreamMaster']
    If $vParams == 0 Then
    Local $aParam2Set[1] = ['fYield=1'] ; == Default: Erlaubt Nutzereingaben während Capturing
    Else
    Local $aParam2Set = StringSplit($vParams, '|', 2)
    EndIf
    Local $aSplit
    For $i = 0 To UBound($aParam2Set) -1
    $aSplit = StringSplit($aParam2Set[$i], '=')
    If $aSplit[0] <> 2 Then ContinueLoop
    DllStructSetData($tCAPTUREPARMS, $aSplit[1], $aSplit[2])
    Next
    Local $pCAPTUREPARMS = DllStructGetPtr($tCAPTUREPARMS)
    Local $ret = DllCall($user, "int", "SendMessage", "hWnd", $sId, "int", $WM_CAP_SET_SEQUENCE_SETUP, "wparam", DllStructGetSize($tCAPTUREPARMS), "lparam", $pCAPTUREPARMS)
    If @error Then
    Return SetError(1,0,0)
    Else
    ;~ For $i = 0 To 23
    ;~ ConsoleWrite($aParamStruc[$i] & @TAB & DllStructGetData($tCAPTUREPARMS, $aParamStruc[$i]) & @CRLF)
    ;~ Next
    Return 1
    EndIf
    EndFunc

    [/autoit]


    Dann klappts auch mit der Aufnahme. Ich empfehle aber DEFINITIV die UDF von BugFix zu benutzen und obiges Skript nicht mit seiner UDF durcheinander zu würfeln (da ich z.B. die Variablennamen für die DLLs angepasst habe) - obiges sollte nur zeigen, dass es final an der Audio-Einstellung lag.

    Gruß
    Trainer

    Einmal editiert, zuletzt von ip_trainer (10. Oktober 2011 um 15:57)