@cxAlex:
Unter Win-XP mit Logitech USB-WebCam funktioniert's hier einwandfrei.
Echt 'ne nette und hilfreiche Include - Thx (auch an Jilocasin).
Auf meinem Notebook mit Win7-64Bit und build-in WebCam (standard Windows-Treiber) funnzt es jedoch nicht.
@Thomas:
Wie oben beschrieben funnzt es bei mir mit einer buid-in WebCam auf'm Notebook auch nicht.
Auch bei mir poppte nur das Fenster kurz auf und das wars.
Um zu sehen wo's genau hakt, hab ich die Capture_Init() mal mit ein paar Debugs und Infos zu den verfügbaren Treibern ausgestattet.
Mit der build-in Cam bekomme ich schon beim connect zum Treiber einen Fehler.
(Den gleichen Fehler bekomme ich allerdings auch unter WinXP, wenn die Logitech-Cam nicht angeschlossen ist.)
Kannst ja mal schauen wo's bei Dir hakt:
Code: Alles auswählen
Procedure Capture_Init(WindowID, view_x = #Null, view_y = #Null, view_width = #Null, view_height = #Null, Resolution$ = "640x480")
Protected RtVar
Shared WCCapture
Protected Result
Protected wDriverIndex.w
Protected cbName.l = 256
Protected cbVer.l = 256
Protected *lpszName = AllocateMemory(cbName)
Protected *lpszVer = AllocateMemory(cbVer)
With WCCapture
\avicap32 = OpenLibrary(#PB_Any, "avicap32.dll")
If Not \avicap32
Debug "Could not open Library: avicap32.dll"
EndIf
If \avicap32
*lpszName = AllocateMemory(256)
*lpszVer = AllocateMemory(256)
For wDriverIndex = 0 To 9
Result = CallFunction(\avicap32, "capGetDriverDescriptionA", wDriverIndex, *lpszName, cbName, *lpszVer, cbVer)
If Result
Debug "Driver Nr."+Str(wDriverIndex)+" :"
Debug PeekS(*lpszName, cbName)
Debug PeekS(*lpszVer, cbVer)
Else
Break
EndIf
Next
Debug ""
\hWndC = CallFunction(\avicap32, "capCreateCaptureWindowA", #Null, #WS_CHILD|#WS_VISIBLE, view_x, view_y, view_width, view_height, WindowID, 1)
If Not \hwndC
Debug "Could not create CaptureWindowA."
EndIf
If \hWndC
If Not SendMessage_(\hWndC, #WM_CAP_DRIVER_CONNECT, 0, 0) : Debug "Could not connect to Driver." : EndIf
If Not SendMessage_(\hWndC, #WM_CAP_SET_PREVIEW, #True, 0) : Debug "Could not set Preview." : EndIf
If Not SendMessage_(\hWndC, #WM_CAP_SET_PREVIEWRATE, 2, 0) : Debug "Could not set PreviewRate." : EndIf
If Not SendMessage_(\hWndC, #WM_CAP_SET_SCALE, #True, 0) : Debug "Could not set Scale." : EndIf
If Not SendMessage_(\hWndC, #WM_CAP_SET_OVERLAY, #True, 0) : Debug "Could not set Overlay." : EndIf
If Not SendMessage_(\hWndC, #WM_CAP_GET_VIDEOFORMAT, SizeOf(VIDEOHDR), @\psVideoFormat) : Debug "Could not receive VideoFormat." : EndIf
; Standard - Auflösung
Resolution$ = LCase(Resolution$)
\psVideoFormat\bmiHeader\biWidth = Val(Trim(StringField(Resolution$, 1, "x")))
\psVideoFormat\bmiHeader\biHeight = Val(Trim(StringField(Resolution$, 2, "x")))
If (Not view_width) Or (Not view_height)
\ViewData\right = \psVideoFormat\bmiHeader\biWidth
\ViewData\bottom = \psVideoFormat\bmiHeader\biHeight
EndIf
; Wir ändern hier also mal hübsch das Format, in dem wir das Bild gerne hätten.
; Standardmäßig ist es oft bei Webcams nur in 16 Bit, dann müssten wir soviel herumrechnen und könnten es uns nicht mit SetDIBits einfach machen.
; Das gesetzte Videoformat wird auch nach Programmende beibehalten, d.h. beim nächsten Start wird die Vorschau von avicap32 bereits hier oben ein 24-Bit Bild liefern!
\psVideoFormat\bmiHeader\biBitCount = 24
\psVideoFormat\bmiHeader\biCompression = #BI_RGB
\psVideoFormat\bmiHeader\biSizeImage = #False
\psVideoFormat\bmiHeader\biClrUsed = #False
\psVideoFormat\bmiHeader\biClrImportant = #False
Result = SendMessage_(\hWndC, #WM_CAP_SET_VIDEOFORMAT, SizeOf(VIDEOHDR), @\psVideoFormat) ; Videoformat setzen
If Not Result
Debug "Could not set VideoFormat."
EndIf
If Result
\ViewData\top = view_y
\ViewData\bottom = view_height
\ViewData\left = view_x
\ViewData\right = view_width
\WinID = WindowID
RtVar = #True
Else
SendMessage_(\hWndC, #WM_CAP_STOP, 0, 0)
SendMessage_(\hWndC, #WM_CAP_DRIVER_DISCONNECT, 0, 0)
DestroyWindow_(\hWndC)
CloseLibrary(\avicap32)
EndIf
Else
CloseLibrary(\avicap32)
EndIf
EndIf
If Not RtVar
\avicap32 = #Null
EndIf
EndWith
ProcedureReturn RtVar
EndProcedure
Treiber unter WinXP-32Bit, bei dem es funktioniert:
. . => Microsoft WDM Image Capture (Win32)
. . => Version: 5.1.2600.5512
Treiber unter Win7-64Bit, bei dem es nicht funktioniert:
. . => Microsoft WDM Image Capture (Win32)
. . => Version: 6.1.7600.16385
Gruß, PL.