WEBCAM?
- PureBasic4.0
- Beiträge: 785
- Registriert: 29.10.2006 17:26
- Wohnort: 127.0.0.1
WEBCAM?
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
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
PB 4.50 RC1 + Ubuntu 10.04 LTS + Windows 7 x64
- Falko
- Admin
- Beiträge: 3535
- Registriert: 29.08.2004 11:27
- Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit) - Kontaktdaten:
Naja, wegen der AVICap, probier die doch vom Originalautor Andreas
aus
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
aus

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
- PureBasic4.0
- Beiträge: 785
- Registriert: 29.10.2006 17:26
- Wohnort: 127.0.0.1
- PureBasic4.0
- Beiträge: 785
- Registriert: 29.10.2006 17:26
- Wohnort: 127.0.0.1
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.


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.



Kinder an die Macht http://scratch.mit.edu/
- Falko
- Admin
- Beiträge: 3535
- Registriert: 29.08.2004 11:27
- Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit) - Kontaktdaten:
Du meinst bestimmt diesen Source, wofür man die avicap32.dll braucht.
http://www.purebasic.fr/english/viewtop ... 1499#61499
Gruß Falko
http://www.purebasic.fr/english/viewtop ... 1499#61499
Gruß Falko
Ja, ... genauso war es damals
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()
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

>>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.


Kinder an die Macht http://scratch.mit.edu/
- Falko
- Admin
- Beiträge: 3535
- Registriert: 29.08.2004 11:27
- Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit) - Kontaktdaten:
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.
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
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

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


Kinder an die Macht http://scratch.mit.edu/
- PureBasic4.0
- Beiträge: 785
- Registriert: 29.10.2006 17:26
- Wohnort: 127.0.0.1
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?

>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?
PB 4.50 RC1 + Ubuntu 10.04 LTS + Windows 7 x64