Schnelle Webcam Verbindung

  • Hallo Community,

    ich sende momentan von einem PC im Netzwerk (USB Webcam) das Bild via TCP/IP ins Nezwerk und kann das Bild dann über den Browser per http://mein-rechner:6969/scrshot.bmp abrufen.
    Aber leider ist mir dass zu langsam. Vielleicht kann man ja die Bilder per UDP ins Netzwerk streamen? Ist UDP überhaupt schneller? Ich habe gesehen, dass das Programm WebcamXP sehr schbnell ist, aber nicht so programmiert ist wie ich es gerne hätte, deshalb versuche ich selbst eines zu bauen.

    Ich hoffe Ihr könnt mir helfen!

    Hier mein jetziges Skript:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    #include <WindowsConstants.au3>
    #include <String.au3>

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

    $WM_CAP_START = 1024
    $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]

    Global $REFRESH = 5
    Global $SESSION = 1
    Global $LISTEN
    Global $SOCK
    TCPStartup()
    HotKeySet("{ESC}", "ONAUTOITEXIT")
    Global $IP = @IPAddress1
    If @error Then Exit
    Global Const $PORT = 6969
    Global $RECV, $OUTPUT
    $LISTEN = TCPListen($IP, $PORT, 100)
    If $LISTEN = -1 Then
    MERROR("Unable to connect.")
    Exit
    EndIf
    $AVI = DllOpen("avicap32.dll")
    $USER = DllOpen("user32.dll")
    $SNAPFILE = @ScriptDir & "\scrshot.bmp"
    $MAIN = GUICreate("Camera", 350, 270)
    GUISetState(@SW_HIDE, $MAIN)
    $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)
    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)
    HotKeySet("{INSERT}", "SNAPSHOT")
    While 1
    $SOCK = TCPAccept($LISTEN)
    $MSG = GUIGetMsg()
    If $MSG = $GUI_EVENT_CLOSE Then
    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($USER)
    Exit
    ElseIf $SOCK >= 0 Then
    $RECV = _SOCKRECV($SOCK)
    SNAPSHOT()
    If StringInStr($RECV, "GET") Then $RECV = _STRINGBETWEEN($RECV, "GET /", " HTTP/1.1")
    ConsoleWrite($RECV)
    If $RECV <> "" Then
    $FILE = FileOpen($SNAPFILE, 0)
    If $FILE <> -1 Then
    $OUTPUT = FileRead($FILE)
    EndIf
    FileClose($FILE)
    Else
    $OUTPUT = '<html><meta http-equiv="refresh" content="' & $REFRESH & '"><center><img src="scrshot.bmp"/><BR>Time Stamp ' & @HOUR & ":" & @MIN & ":" & @SEC & "<BR></center></html>"
    EndIf
    $SEND = _SOCKSEND($SOCK, $OUTPUT)
    TCPCloseSocket($SOCK)
    EndIf
    Sleep(1)
    WEnd
    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
    Func MERROR($STEXT, $IFATAL = 0, $STITLE = "Error", $IOPT = 0)
    Local $RET = MsgBox(48 + 4096 + 262144 + $IOPT, $STITLE, $STEXT)
    If $IFATAL Then Exit
    Return $RET
    EndFunc
    Func _SOCKRECV($ISOCKET, $IBYTES = 2048)
    Local $SDATA = ""
    While $SDATA = ""
    $SDATA = TCPRecv($ISOCKET, $IBYTES)
    WEnd
    Return $SDATA
    EndFunc
    Func _SOCKSEND($ISOCKET, $SDATA)
    Return TCPSend($ISOCKET, $SDATA)
    EndFunc
    Func ONAUTOITEXIT()
    TCPCloseSocket($SOCK)
    TCPCloseSocket($LISTEN)
    TCPShutdown()
    Exit
    EndFunc

    [/autoit]

    Mfg
    Chris

  • Hi,
    was mir sofort auffällt ist die scrshot.bmp-Datei. Das Bitmapformat ist zwar relativ einfach, aber alles andere als klein.
    Wenn du die Datei in ein anderes (komprimiertes) Format bringst, ist die Übertragung vielfach schneller, da die Datei wesentlich kleiner ist!