Seite 1 von 4

WEBCAM?

Verfasst: 08.05.2007 17:12
von PureBasic4.0
Hi, Leute

1. Möchte mit PB auf eine Webcam zugreifen. Allerdings sollen die Daten in einen Buffer geschrieben werden können (ich möchte die per Network im Intranet versenden und auf der Gegenseite anzeigen lassen). Wie geht das? Habe schonmal was von der Avicap-Lib und der WebcamLib (die zurzeit leider nicht herunterladbar ist) gehört, aber ich dachte, ich frage hier nochmal nach.

2. Wie bekomme ich eine Liste der am PC installierten Webcams? Ich möchte KEINEN Windows-Dialog anzeigen lassen, in dem die Webcams stehen, sondern möchte diese in ein paar Variablen haben (Möchte die auch über's Intranet versenden)

3. Es soll möglichst auch ein Audiostream übertragen werden können. Geht das irgendwie?

Danke,

PureBasic4.0

Verfasst: 08.05.2007 23:21
von Falko
Naja, wegen der AVICap, probier die doch vom Originalautor Andreas
aus :lol:

http://www.ampsoft.eu/purebasic/userlibs.php

Siehe AVICAP.zip oder hier gleich der Direktlink:

http://www.ampsoft.eu/purebasic/data/Avicap.zip

Gruß Falko

Verfasst: 09.05.2007 17:58
von PureBasic4.0
danke, aber die kannte ich schon. ich möchte in den BUFFER Streamen und aus Performancegründen nicht den Umweg über die Festplatte machen. Gibt's dafür ne Lib, die sowas auch unterstützt?

Verfasst: 14.05.2007 18:19
von PureBasic4.0
Na Klasse. Keiner hat ne Ahnung davon :o
Es gibt doch so viele Webcam-Tools hier, da wird doch eins dabei sein, das Bufferstreaming unterstützt, oder?

Verfasst: 14.05.2007 19:51
von Xaby
Ich hab auch schon lange nach sowas gesucht.

Hatte mal einen PB-Code, der mit einer Webcam ging.

Konnte da auch gut die Bilder als Images speichern oder was auch immer mit machen.

Wie allerdings das Interface genau funktioniert hatte, wusste ich nicht.

Nun hab ich keine Webcam mehr, bzw. ich habe eine echte Kamera an meinem Rechner angeschlossen. WDM-Kompatibel.

Die meisten Webcam-Tools erkennen sie als Device. Aber der Code von damals mit PB hat einfach nur ein schwarzes Bild gezeigt.

Der Code war noch PB 3.94, hab es deshalb nicht weiter verfolgt.

Auch wenn es sicherlich schon oft im Forum erwähnt worden ist und auch irgendwas im Codearchive steht, aber wie funktioniert das mit der Webcam?

Kann sich nicht noch mal einer erbarmen und es hier schreiben.

Als ich damals mein Videoanalyse-Thread gestartet hatte, hatte ich auch schon das Problem. Keiner weiß was genaues. Oder ist das Wissen um die Webcam so wertvoll, dass jeder, der sich mit auskennt, es nicht weitergeben mag.

Zurzeit muss ich immer über Nero-DV-Aufnahme Fernsehen. Das ist etwas doof. Und auf meinem Notebook bei einem Bildverhältnis von 16:10 und Filmen, die 4:3 mit 16:9 Streifen sind, kann man das nicht Zoomen.

Wollte mir dafür was schreiben, aber ich komm nicht an das Interface.

Hat jemand einen Beispielcode, wo man vielleicht sowas hat:

Ergebnis=ExamineVideoDevices()
Ergebnis ist Anzahl der webcams.

GetNumberOfResolutions(CamNummer)

GetVideoDeviceHigh(#Cam, #Res)
GetVideoDeviceWidth(#Cam, #Res)


SetVideoDeviceResulotion(#Cam, #Res)
GetVideoDeviceImage(#Cam)

...

Meine Lego-Webcam hatte sogar einen Knopf, den man drücken konnte, und dann wurde automatisch von Windows aus ein Bild gespeichert.
Micro war auch eingebaut.

Nicht meine, meine war komplett blau mit rotem Knopf.
Bild

:? :shock: :allright:

Verfasst: 14.05.2007 20:04
von Falko
Du meinst bestimmt diesen Source, wofür man die avicap32.dll braucht.

http://www.purebasic.fr/english/viewtop ... 1499#61499

Gruß Falko

Ja, ... genauso war es damals

Verfasst: 14.05.2007 20:28
von Xaby

Code: Alles auswählen

#WM_CAP_START = #WM_USER 
#WM_CAP_DRIVER_CONNECT = #WM_CAP_START + 10 
#WM_CAP_DRIVER_DISCONNECT = #WM_CAP_START + 11 
#WM_CAP_FILE_SAVEDIBA = #WM_CAP_START + 25 
#WM_CAP_GRAB_FRAME = #WM_CAP_START + 60 
#WM_CAP_STOP = #WM_CAP_START + 68 
#WM_CAP_SET_CALLBACK_ERRORA = #WM_CAP_START + 2 ; define your callback constant 
#IDS_CAP_DRIVER_ERROR = 418  ; Driver specific error message 


Global hWndC 

Procedure myWindowCallback(hwnd, msg, wParam, lParam) 
  Shared dlgClosed 
  result = #PB_ProcessPureBasicEvents 
  
  ; handle video source dialog (here we close it by sending Escape key) 
  ; kind of messy right now but it seems to work 
  
  If hwnd = WindowID(0) And msg = #WM_KILLFOCUS And driverConnected = #False 
    hDlg = FindWindowEx_(0, 0, "#32770", "Video Source") ; get the handle to the dialog 
  EndIf 
  
  If hDlg <> 0 And driverConnected = #False 
    If dlgClosed = #False 
      dlgClosed = #True ; this ensures we send Escape key one time only 
      keybd_event_(#VK_ESCAPE, 0, 0, 0) 
      keybd_event_(#VK_ESCAPE, 0, #KEYEVENTF_KEYUP, 0) 
    EndIf 
  EndIf 
  
  ProcedureReturn result 
EndProcedure 


Procedure MyCapErrorCallback(hwnd.l, nId.l, lpsz.l) 
  If nId = #IDS_CAP_DRIVER_ERROR 
    MessageRequester("Error", "Error connecting to capture device." + Chr(10)+Chr(13) + "Application will now close", #MB_ICONERROR) 
    CloseWindow(0) 
  Else 
    MessageRequester("Error", "Unspecified capture device error (" + Str(nId) + ")", #MB_ICONERROR) 
  EndIf 
EndProcedure 



Procedure SnapShot() 
  If OpenWindow(0,0,0,0,0,"test",#PB_Window_SystemMenu) 
    
    If OpenLibrary(0, "avicap32.dll") 
      *capAddress = GetFunction(0, "capCreateCaptureWindowA") 
      hWndC = CallFunctionFast(*capAddress, "", #WS_CHILD, 10, 10, 320, 240, WindowID(0),1) 
      SendMessage_(hWndC, #WM_CAP_SET_CALLBACK_ERRORA, 0, @MyCapErrorCallback())    
      SendMessage_(hWndC, #WM_CAP_DRIVER_CONNECT, 0, 0) 
      SendMessage_(hWndC, #WM_CAP_GRAB_FRAME, 0, 0) 
      SendMessage_(hWndC, #WM_CAP_FILE_SAVEDIBA, 0, "test.bmp") 
      SendMessage_(hWndC, #WM_CAP_STOP, 0, 0) 
      SendMessage_(hWndC, #WM_CAP_DRIVER_DISCONNECT, 0, 0) 
      DestroyWindow_(hWndC) 
      CloseLibrary(0) 
    EndIf 
    
  EndIf 
  
EndProcedure 

  
SnapShot()
Nun pass auf.
Wenn ich meine Kamera benutze und Nero schon drauf zugreift, kommt erst ein Device-Auswahl-Fenster, danach die Meldung, dass die Kamera schon verwendet wird.
Videoquelle : Auswahl
Error
Error connecting to capture device.
Application will now close

Jetzt hab ich Nero ausgemacht, damit die Kamera nicht verwendet wird.

Und das Programm erneut gestartet und da kamen 4 Fehlermeldungen:
Error
Unspecified capture device error (439)
Error
Unspecified capture device error (0)
Error
Unspecified capture device error (406)
Error
Unspecified capture device error (0)

Hast eine Ahnung, wie ich das umstellen kann, dass es für Webcams und DV-Kameras funktioniert?

Könnte mir auch vorstellen, mehrere Videoquellen gleichzeitig über USB und FireWire (IEEE1394) anzusteuern. (Stereo-Sehen oder Überwachungssoftware)

Gruppenkonferenz im selben Zimmer :mrgreen:


>>Nachtrag
Hab meine Lego-Cam rausgekramt und da ist folgendes Problem:
Die Legowebcam kann an und ausgeschaltet werden.
Das geschiet jedoch software-mäßig irgendwie.

Im Arbeitsplatz habe ich zwei neue Symbole.
Eins für meine USB-Webcam (Lego) und eins für meine DV-Kamera.

Klicke ich auf die LegoCam leuchtet eine rote Lampe an der Kamera.

Starte ich nur die PB-Software, knipst diese ein schwarzes Bild, weil sie wohl die Kamera vorher nicht richtig anschaltet.

Ganz klar, wenn die rote Lampe leuchtet und die Sache vom Arbeitsplatz ausgeht, dann kann ich wieder vom PB-Programm nicht drauf zugreifen. /:->

:roll:

Verfasst: 14.05.2007 22:00
von Falko
Hab mal was getestet. Wenn man z.b. den Videosource auswählen kann, müsste man über Structure diese auch direkt setzen können. Somit wäre ein
Wechsel zwischen DV und Webcam auf zwei verschiedenen Windows
vielleicht möglich.


Code: Alles auswählen

#WM_CAP_START = #WM_USER
#WM_CAP_UNICODE_START = #WM_USER +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

#AVSTREAMMASTER_AUDIO = 0
#AVSTREAMMASTER_NONE = 1


If OpenWindow(0, 0, 0, 340, 260, "Video capture", #PB_Window_ScreenCentered | #PB_Window_SystemMenu)
  If OpenLibrary(0, "avicap32.dll")
    *capAddress = GetFunction(0, "capCreateCaptureWindowA")
    hWndC = CallFunctionFast(*capAddress, "My Capture Window", #WS_CHILD | #WS_VISIBLE, 10, 10, 320, 240, WindowID(0),1)
    SendMessage_(hWndC, #WM_CAP_DRIVER_CONNECT, 0, 0)
    SendMessage_(hWndC, #WM_CAP_DLG_VIDEOSOURCE, 0, 0)
    SendMessage_(hWndC, #WM_CAP_SET_PREVIEW, #True, 0)
    SendMessage_(hWndC, #WM_CAP_SET_PREVIEWRATE, 15, 0)
  EndIf
EndIf

Repeat
  Event = WaitWindowEvent()
Until Event = #PB_Event_CloseWindow

SendMessage_(hWndC, #WM_CAP_STOP, 0, 0)
SendMessage_(hWndC, #WM_CAP_DRIVER_DISCONNECT, 0, 0)
DestroyWindow_(hWndC)
CloseLibrary(0)

End

Verfasst: 14.05.2007 22:33
von Xaby
Soweit ganz gut.

Leider keine Reaktion, wenn ich als Device meine Videokamera (DV über FireWire) einstelle.

Mit der Lego-Cam geht es.


>>Noch eine Frage
Und wie kann man nun ganz leicht in deinem Code die Bildausgabe manipulieren?

Ich glaube, der Volker Schmidt hatte doch mal sowas gemacht, wo das alles so verzerrt wird. Viel mehr will ich ja auch nicht.
Naja, das wäre der Grundstein für Eye-Toy-Spiele oder so :D


:allright:

Verfasst: 15.05.2007 15:06
von PureBasic4.0
Der Code von Falko funktioniert, ich sehe mich auch (Webcam, nicht spiegel ;-)), aber wie kann ich damit in den Buffer streamen? Möchte ja, wie oben erwähnt, die Daten über's Netzwerk verschicken.

>Mal noch eine Frage:
Wie kann ich eine Liste der vorhandenen Webcams bekommen? Der Benutzer soll sie nicht sehen, ich möchte sie aber in einer LinkedList oder einem Array haben, damit ich die Daten auch über's Netzwerk verschicken kann. Der Benutzer am anderen Ende (der, bei dem keine Webcam angeschlossen ist) soll dann die gewünschte Webcam auswählen und die Daten zugeschickt bekommen.

Ist das irgendwie möglich?