Ya saben a que me refiero.. una aplicacion cliente-servidor.
Pero en particular me gustaria que postearan algunas teorias sobre como transmitir especificamente video de la webcam al cliente remoto, digamos que en tiempo real.
Existe una librería que se llama AVICAP32.DLL que contiene las funciones de multimedia del sistema y que, entre otras cosas, te permite controlar la webcam.
Esta librería tiene la función capCreateCaptureWindow (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/multimed/htm/_win32_capcreatecapturewindow.asp) que crea una ventana dentro de otra (ventana padre) para enviar las imágenes tomadas por la webcam y devuelve el controlador de ventana (hWnd).
Para implementarla es muy sencillo, se crea un PictureBox y luego se llama a esta función pasandole como argumento hWndParent (ventana padre) en controlador de ventana del PictureBox. Por ej:
Const RES_X = 680 'Resolución horizontal
Const RES_Y = 480 'Resolución vertical
Private Declare Function capCreateCaptureWindow Lib "avicap32.dll" Alias "capCreateCaptureWindowA" (ByVal lpszWindowName As String, ByVal dwStyle As Long, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hwndParent As Long, ByVal nID As Long) As Long
Private hWndCap As Long
Private Sub Form_Load()
'NOTA: picCapFrame es el nombre de un control PictureBox.
'
'Crea la ventana a la que se enviarán las imágenes de la cam.
'
hWndCap = capCreateCaptureWindow(vbNullString,0,0,0, RES_X, RES_Y, picCapFrame.hWnd, 0)
End Sub
Luego queda utilizar la función SendMessage (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/messagesandmessagequeues/messagesandmessagequeuesreference/messagesandmessagequeuesfunctions/sendmessage.asp) para enviarle los mensajes a la ventana que creamos (hWndCap ). Hay varios mensajes predefinidos que controlan las acciones de la webcam:
Const WM_CAP_CONNECT = 1034 'Conecta el dispositivo de captura.
Const WM_CAP_DISCONNECT = 1035 'Desconecta el dispositivo de captura.
Const WM_CAP_GET_FRAME = 1084 'Obtiene un frame desde el dispositivo.
Const WM_CAP_COPY = 1054 'Copia el frame capturado con WM_CAP_GET_FRAME al portapapeles.
Sabiendo esto se puede ir obteniendo frame por frame y enviando los datos en tiempo real con el control WinSock o usando la API de winsock, pero claro esto conlleva un consumo muy grande de ancho de banda y si el programa se ejecuta en una pc con conexión de 56k va a ser muy alevoso :P.
Por último, antes de descargar el programa debe llamarse a DestroyWindow (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/windows/windowreference/windowfunctions/destroywindow.asp) para liberar el controlador de ventana.
Con esos datos creo que ya se puede empezar a probar, de lo contrario remitirse a google ;D. Igualmente dejo el link de MSDN que es de donde saqué toda la referencia de las funciones.
Windows Multimedia (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/multimed/htm/_win32_windows_multimedia_start_page.asp)
Saludos.
He usando un Timer, un Picture y dos Button para este ejemplo.
Nota: No lo documento suficientemente porque no se podría redundar en una exposición tan magistral como la anterior.
Cualquier sugerencia que optimize este code es bienvenida.
Private Declare Function capCreateCaptureWindow Lib "avicap32.dll" Alias "capCreateCaptureWindowA" (ByVal lpszWindowName As String, ByVal dwStyle As Long, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hwndParent As Long, ByVal nID As Long) As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Declare Function DestroyWindow Lib "user32" (ByVal hndw As Long) As Boolean
Private Const CONNECT As Long = 1034
Private Const DISCONNECT As Long = 1035
Private Const GET_FRAME As Long = 1084
Private Const COPY As Long = 1054
Private hWndCap As Long
Private Sub START_WEBCAM_Button1_Click()
hWndCap = capCreateCaptureWindow("WebcamCapture", 0, 0, 0, 160, 120, Me.hwnd, 0)
DoEvents
SendMessage hWndCap, CONNECT, 0, 0
Timer1.Enabled = True
End Sub
Private Sub STOP_WEBCAM_Button2_Click()
DoEvents: SendMessage hWndCap, DISCONNECT, 0, 0
Timer1.Enabled = False
End Sub
Private Sub Timer1_Timer()
'Obtiene frames para Picture1
SendMessage hWndCap, GET_FRAME, 0, 0
SendMessage hWndCap, COPY, 0, 0
Picture1.Picture = Clipboard.GetData
Clipboard.Clear
End Sub
Private Sub Form_Load()
Timer1.Enabled = False
Timer1.Interval = 1
End Sub
Private Sub Form_Unload(Cancel As Integer)
DestroyWindow hWndCap
End Sub
A los interesandos en este hilo:
Publiquen code para transmitir los frames capturados de una forma óptima aunque se tratase de conexiones de 56Kb ;)
Genial, esto me interesa bastante pero nunca me había puesto ha buscarlo... jeje, ya lo probaré y os cuento... Gracias.
Salu2.
ah, se me olvidaba, yo para transmitir imágenes utilizo un módulo que comprime en jpg, es lo que utilizaba para hacer un escritorio remoto y bueno, si le bajas la calidad a la imágen... puedes conseguir archivos de entre 10 y 20 kb con una calidad...... en fín... algo pobre, pero aceptable... pero al ser para una webcam el tamaño es mucho más pequeño (más pequeño que la resolución de la pantalla, que era lo que capturaba yo...) y podrías darle más calidad y conservarías el tamaño, eso intentaré hacer yo, ahora mismo no se de donde saqué el código pero si buscas por google Module JPEG Compressor visual basic, o algo así, seguro que lo encuentras (así lo encontré yo...)
Salu2
yo lo que ando buscando es meter la webcam en el usb y ver lo que la camara ve desde un programa en VB. sirve?
yo no consigo que me funcione ni un código ni otro. hay que hacer algo más? yo tengo una cam "easy point & click" de "best buy". tmb sirve como cámara digital, es de esas baratas de hace 3 años, pero no veo xk no va.
la libreria que tengo en c: \windows es de mayor tamaño que la de dll-files.com
Esos códigos trabajan a nivel de aplicación, es decir que lo que el sistema operativo haga internamente es ajeno a estas funciones. Por lo tanto si no funcionan es problema no del programa sino de la configuración del SO, quizá los drivers de la cam no están instalados correctamente o el sistema tiene algún conflicto con dicho hardware-
En cuanto a tu pregunta de si el código sirve o no, sí sirve.
Saludos.
oks gracias :)
al final he conseguido que la webcam funcionase jejej han sido unos dias probando códigos de google y ha habido suerte. ya lo he adaptado a mi programa :D
Mientras se esta haciendo la captura de la imagen de la cam los demas programas no pueden aceder a la cam, por ejemplo el msn si k te permite verla con otros programas al mismo tempo, se os ocurre alguna solucion?
No se puede, el dispositivo de captura sólo puede ser abierto por una aplicación a la vez.
Saludos.
Cita de: .PoluX. en 15 Septiembre 2005, 01:47 AM
No se puede, el dispositivo de captura sólo puede ser abierto por una aplicación a la vez.
Saludos.
>:( >:( >:( :( :(
pues mientras estan enviado imagenes de la cam con el msn puedes verte en la pantalla con otros programas, se tiene que poder en vb alomejor no, pero en otros lenguakes sip
Hola. El código va a las mil maravillas, pero ahora tengo una duda: ¿como puedo capturar el frame y guardarlo en un fichero? Gracias.
Un botón que diga "Guardar imagen" y luego usas SavePicture.
Call SavePicture(picVideo.Image, "C:\image.bmp")
picVideo es el PictureBox que muestra las imágenes de la cam.
Saludos.
No me anda esto
Código:
Call SavePicture(picVideo.Image, "C:\image.bmp")
q otra manera de guardar imagenes durante un intervalo de tiempo existen. Ponga el codigo claramente porque soy muy novato en el tema. Gracias
hola te paso un ejemplo que hice de enviar las tomas de la webcam al servidor
http://ar.geocities.com/leandroascierto/Camarawinsock.zip
Saludos
hola me olvidaba una pregunta para p0w3r f1y no encontre dicho modulo, yo hasta ahora estuve utilizando uno que funciona bien pero requiere GDI+ y las verciones de windows inferiores a xp no posen GDI+ ,por las duadas si es que aun tienes el modulo lo podrias poner aqui para ver si es diferente al que uso yo
Gracias y espero tu respuesta o si alguien mas tiene un modulo para comprimir a jpg (no ocx)
No entendi bien esta duda, pero creo q es ver a alguien por su webcam sin q se entere?no???
Bueno, tons consiganse el RemoteWebcam,consigan la IP del otro y ponganla en el....
Ya hice andar para poder capturar una imagen. Ahora nesecitaria q en vez de una me capture unas 30 imagenes en forma secuencial. Osea como hacer un video pero en imagenes y q esto sea automatico obvio
Tienen alguna web donde encuentren las apis que utiliza las web CAM¿
Cita de: renga73 en 18 Marzo 2006, 11:22 AM
Ya hice andar para poder capturar una imagen. Ahora nesecitaria q en vez de una me capture unas 30 imagenes en forma secuencial. Osea como hacer un video pero en imagenes y q esto sea automatico obvio
aprovechando lo código de goobye lo puedes hacer de la seguinte forma :
adicionas 3 variables :
- Indice As Integer
- Indice2 As Integer
- Full as Boolean
en seguida modificas el código en "Private Sub Timer1_Timer" :
SendMessage hWndCap, GET_FRAME, 0, 0
SendMessage hWndCap, COPY, 0, 0
Picture1.Picture = Clipboard.GetData
If Full = False Then
Call SavePicture(Clipboard.GetData, "Directorio\Nombre Imagen" & Indice2 + Indice & ".jpg") ' el directorio y el nombre de la imagen que quieres ir a poner
DoEvents
End If
Clipboard.Clear
'esto código sirve para la imagen guardada no tener siempre lo mismo nombre Ex: img0.jpg...img1.jpg...img2.jpg....img40.jpg...
If Indice < 32500 Then
Indice = Indice + 1
ElseIf Indice = 32500 And Indice2 < 32500 Then
Indice2 = Indice2 + 1
ElseIf Indice = 32500 And Indice2 = 32500 Then
Full = True
End If
Cita de: Garopa en 19 Marzo 2006, 21:59 PM
Tienen alguna web donde encuentren las apis que utiliza las web CAM¿
http://foro.elhacker.net/index.php/topic,75096.msg345302.html#msg345302
Cita de: renga73 en 17 Marzo 2006, 19:23 PM
No me anda esto
Código:
Call SavePicture(picVideo.Image, "C:\image.bmp")
q otra manera de guardar imagenes durante un intervalo de tiempo existen. Ponga el codigo claramente porque soy muy novato en el tema. Gracias
No te anda porque no abras cambiado al picVideo por el nombre del Picture box :)
creo que es eso...
Salu2
Ranslsad
Saludos muy buen idea tenia tiempo buscando esta informacion en referencia a controlar la webcam remotamente, pero tengo varias incognitas, y es la siguiente...!!!
¿Como saber que la pc a controlar tiene webcam....!!! ?
¿En caso de que la pc la tenga, como saber si esta en pleno uso..!!! ?
¿Si esta en uso como se puede utilizar en nuestro proceso para transmitirla a nuestro cliente sin tener que matar el primer proceso (perteneciente a la pc en cuestion), es decir, si ya esta utilizada, ¿como la podemos utilizar...!!!, si ya esta siendo utilizada...?
Creo que me di a entender...!!!
Si no es asi me disculpan por ser innorante...!!! :-X
:rolleyes: :rolleyes: :rolleyes: :rolleyes: :rolleyes: :rolleyes:
¿Alguien sabe cómo hacer para controlar más de una cámara a la vez? O sea: 2 PictureBox distintos que muestren cada uno las capturas de 2 cámaras distintas.
Cita de: gtrifoglio en 15 Enero 2007, 16:11 PM
¿Alguien sabe cómo hacer para controlar más de una cámara a la vez? O sea: 2 PictureBox distintos que muestren cada uno las capturas de 2 cámaras distintas.
saludos....!!!
a ver creo que esto te puede servir..!!!
http://www.Planet-Source-Code.com/vb/scripts/ShowCode.asp?txtCodeId=65603&lngWId=1
hace tiempo esto me sirvio de mucho...!!!
despues me cuentas como te fue..!!!
Antes que nada muchas gracias por responder.
Lo estuve viendo y anda bien. El problema que tengo es que al momento de abrir la segunda ventana llama al cuadro de diálogo para elegir a qué dispositivo conectarme.
Lo que yo en realidad quiero es acceder a esa lista de dispositivos sin llamar al cuadro de diálogo. Hace unos días que busco eso pero no hay caso. Lo único que he logrado es acceder a la lista de drivers (Yo tengo 1 driver y 2 cámaras).
Encontré un OCX (Icimagingcontrol) que tiene una coleccion "Devices" que es justo lo que necesito, pero es un trial. Supongo que tiene que haber una API para lo que ando buscando. Ya estuve revisando avicap32.dll pero parece que por ahí no es.
Nuevamente gracias y si se te ocurre algo por favor no dejes de avisarme.
Saludos
Cita de: gtrifoglio en 18 Enero 2007, 18:26 PM
Encontré un OCX (Icimagingcontrol) que tiene una coleccion "Devices" que es justo lo que necesito, pero es un trial.
Si posteas el proyecto con la OCX, te puedo colaborar con el crakeo de esa OCX. O intentalo tu mismo (Si abres la OCX desde Visual Studio .net 2005). Aqui explico como hacerlo.
CRackeando OCX's con Visual Studio .NET 2003/2005 (http://foro.elhacker.net/index.php/topic,131528.0.html)
Saludos.
Graphixx
CRackeando OCX''s con Visual Studio .NET 20032005 by Graphixx
hola la verdad es que esto me gusto mucho, Gracias Graphixx
bueno aqui les dejo el manual compilado en un chm
Descargar: http://www.zshare.net/download/26781892b35fdc/
Saludos...bye...
Que bueno que has vuelto Slasher-K hacia mucho que no se te veia por aca, y con el tema de la webcam, hay 2 ocx que conozco y que lo facilitan mucho la IC.ocx y la pegasus.ocx, IC es trial y pegasus es free, en este momento no dispongo de ninguna.
Sancho.Mazorka :¬¬
eaeaeaea JMF (Java media Frame) mejor y es multiplataforma no te limita nada :P
Estas reviviendo un thread de hace 3 años............y encima no aportas nada.
Sancho.Mazorka :¬¬