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
#include <GUIConstants.au3>
#include <WindowsConstants.au3>
#include <String.au3>
$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
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
Mfg
Chris