Conectándose a una cámara IP con Java
La tecnología IP aplicada a la vigilancia de recintos ha proliferado en los últimos años en gran medida debido a los incrementos de ancho de banda en las redes ip actuales y al bajo costo de los equipos que la soportan. La gran mayoría de cámaras IP traen consigo Applets y Controles ActiveX para poder conectarnos a estas, sin embargo un gran problema es que este tipo de controles no soportan trabajar fuera del contexto de algún navegador web. Otro problema es cuando queremos acceder a los frames o imágenes adquiridas por estos dispositivos para realizar algún tipo de procesamiento. Las cámaras IP se caracterizan por la movilidad (Sobre todo las cámaras IP con soporte para la tecnología 802.11x) e independencia de funcionamiento pues solo será necesario de un dispositivo de capa de red para operar. Por otro lado las cámaras web siempre dependerán de la existencia de un computador así como los escasos 5 metros que nos proporcionan los estándares USB.
Todos lo descrito anteriormente ha representado siempre una dificultad cuando se quiere interactuar con estos dispositivos ya no a nivel de un simple usuario sino que queremos acceder a la información que nos proporcionan e ir un poco más allá. Java nos permite conectárnos al módulo CGI que poseen estas cámaras y obtener las imágenes de forma continua para realizar el procesamiento necesario sobre estas. Lo único que tenemos que hacer es acceder a este módulo cgi de forma continua e ir mostrando las imágenes a modo de secuencia lo cuál dará una apariencia de ser el video en sí.
Lo primero que tenemos que hacer es sobreescribir el método paintComponent de un JPanel del siguiente modo:
public class PanelVideo extends javax.swing.JPanel { private boolean hayConexion = false; private String direccionIP = ""; public BufferedImage frame = null; /** Creates new form PanelVideo */ public PanelVideo() { initComponents(); } public boolean isHayConexion() { return hayConexion; } public void setHayConexion(boolean hayConexion) { this.hayConexion = hayConexion; } public String getDireccionIP() { return direccionIP; } public void setDireccionIP(String direccionIP) { this.direccionIP = direccionIP; } @Override public void paintComponent(Graphics g) { Graphics2D g2 = (Graphics2D) g; g2.setColor(Color.white); g2.fillRect(0, 0, getWidth(), getHeight()); if (hayConexion) { try { URL nUrl = new URL(direccionIP); frame = ImageIO.read(nUrl); if (frame != null) { g2.drawImage(frame, 0, 0, this); repaint(); } } catch (MalformedURLException ex) { hayConexion = false; g2.drawString(ex.toString(), 5, 15); } catch (IOException ex) { hayConexion = false; g2.drawString(ex.toString(), 5, 15); } } else { g2.setColor(Color.black); g2.drawString("No se ha establecido conexión con el dispositivo.", 5, 15); } } }
Luego agregamos este panel a un JFrame y voilà, tenemos nuestra aplicación funcionando, podemos acceder a la secuencia de imágenes cuando se quiera, procesarlas, enviarlas por correo con información adicional, almacenarlas en una base de datos... en fin, un sinnúmero de posibilidades!!!
Aquí tenemos un screenshot de la aplicación ejecutándose:
Y como siempre el código fuente listo para descargar, reutilizar, mejorar, compartir!
Es importante saber la dirección correcta del módulo cgi de nuestras cámaras ip para lo cuál debemos acceder a su página de configuración. En mi caso la dirección es la siguiente: http://192.168.1.150/image/jpeg.cgi. De todos modos cualquier duda, la comentan.
Además si han tenido problemas con la ventana de autenticación de usuario aquí les dejo una solución:
URL nurl = null; try { nurl = new URL("http://169.254.1.240/cgi/jpg/image.cgi"); } catch (MalformedURLException e) { e.printStackTrace(); } Authenticator au = new Authenticator() { @Override protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication ("user", "pass".toCharArray()); } }; Authenticator.setDefault(au);
Saludos, hasta un próximo post.
falta algo no??? el initComponents()
ResponderBorrarHay un link de descarga para el código fuente amigo.
ResponderBorrarSaludos.
Che amigo donde esta el link del codigo fuente? nose vos, pero yo no lo veo
ResponderBorrarEl botón Download amigo =). Saludos!
ResponderBorrarLa verdad es que no esta el boton Download
ResponderBorrarPerdona que te moleste pero podrías poner el link aca porfavor?
ResponderBorrarClaro amigo, https://sites.google.com/site/tecnologiaenperu/home/CamaraIP.rar?attredirects=0&d=1
ResponderBorrarSr. Rolando puede usted, colocar el modelo de camara que utilizó para poder almenos probar con una similar, me gustara que hablara sobre los tipos de camaras usadas.
ResponderBorrarClaro, el modelo de cámara es una D-Link DCS-920. Para más información te dejo el siguiente enlace: http://www.dlinkla.com/home/productos/producto.jsp?idp=1108
ResponderBorrarHola leandro, intento hacer lo mismo con una camara syscom uv5805, pero no encuentro el modulo que necesito para conectarme, podria ayudarme a encontrarlo?
ResponderBorrarSin la cámara a la mano no te puedo ayudar. Tienes que revisar la página de adminisración.
ResponderBorrarSaludos.
Pero como se supone que entro a la pagina, mi camara ya esta conectada a la red y si funciona, si en un navegador escribo la direccion de mi camara puedo entrar logeandome con el usuario y contrasenia, ahi me aparece un panel de configuracion pero no encuentro nada de algun modulo..
ResponderBorrarHola amigo Rolando:
ResponderBorrarsabes si en vez de usar una cámara web integrada como traen las laptop o una externa como se le puede poner a una PC de escritorio , se pudiera poner por el puerto USB (como las externas) una cámara de vigilancia y el controlador universal de Windows (vfw:Microsoft WDM Image Capture (Win32)0 ) lo reconocería como una variante de Webcam, es que estoy haciendo una aplicación para un sistema de vigilancia y necesito controlar el video que me generan estas cámaras, y ya he visto todo el procedimiento engorroso que conlleva trabajar con la API de java para trabajar con multimedia la JFM 2.1.1e pero necesito saber si esto que pretendo hacer se pudiera hacer, o estas cámaras tienen algo en el hardware que las hacen diferentes a la webcam ,pues se que estas cámaras normalmente se ponen a través de una tarjeta PCI previamente instalada con unos drivers que produce el fabricante de la tarjeta, y con un software se puede acceder a ver el video que ellas producen.
Ante todo muchas gracias por la ayuda
Robert
Nunca he trabajado con ese tipo de cámaras de videovigilancia, pero la API que brinda java proporciona una capa que hace que el medio de donde se origina el video sea transparente para el programador. Si instalas los drivers correctamente no deberías tener problemas amigo.
ResponderBorrarCualquier consulta no dudes en postearla aquí. Te dejo también algunos enlaces que podrían ser de tu interés:
http://rolandopalermo.blogspot.com/2010/08/transmision-de-video-usando-sockets-en.html
Y no te olvides de seguir este blog en facebook para enterarte de más novedades.
Saludos.
Hola,muy buen material e informacion,muchas gracias,pero tengo una duda,tengo la siguiente direccion http://xxx.xxx.x.x:99/snapshot.cgi necesito que para un software que estoy haciendo la parte de snapshot.cgi sea snapshot.jpg la pregunta es hay alguna forma de cambiarlo?
ResponderBorrareso gracias.
Amigo, es posible llevar esta aplicacion y subirla a una pagina web?
ResponderBorrarEs decir, que pueda visualizar mi camara mediante
un website?
Espero tu respuesta, y de antemano gracias!
Andreita :)
Si lo que quieres es que se muestre en una página web no habría la necesidad de usar la forma que muestro aquí amiga.
ResponderBorrarBuenas, disculpa la molestia pero tengo una duda... con este codigo no hace falta logearse para acceder a las imagenes??? pq en la q yo poseo cuando intento acceder a ellas via web me pide q lo haga...
ResponderBorrarun saludo, gracias
Exacto Rolando pero te explico, el dvr te genera una ip y a traves de ftp puedo ver las imagenes.
ResponderBorrarEl caso es que yo quiero programar mi pagina web, establecer roles y perfiles para que solo pueda accesar a la camara la persona autorizada por el login y pass, entonces quisiera saber si esto es posible por favor! y si no es muy complicado.
Muchas gracias de antemano!
Andreita :)
Para Anónimo:
ResponderBorrarAmigo, tienes que deshabilitar la autenticación de usuario en tu cámara IP, de esa manera podrás conectarte a la cámara IP sin la necesidad de usuario y contraseña.
Para Andrea:
Ummm, realmente no se ve muy complejo, pero entrarían en juego otros componentes de Java como los servlets por ejemplo. El servlet se encargaría de gestionar la adquisición de las imágenes.
Espero les sirva de ayuda y no se olviden de seguirnos en Facebook.
Saludos.
ese es el problema amigo... q no puedo desactivarlo. estoy viendo el manual y solo puedo agregar usuarios.... hace tiempo habia investigado un poco y parece q habia q colocar esto http://{USER_ID}:{PASSWORD}@{CAMERA_IP}/cgi/jpg/image.cgi pero no lograba nada poniendo la cuenta de administrador... pero ahora estoy pensando en crear un usuario normal y ver si asi puedo captar las imagenes...
ResponderBorrargracias por la ayuda
Excelente amigo, cualquier avance te agradecería lo comentes para poder compartirla con el resto. No olvides seguirnos en nuestra página de facebook.
ResponderBorrarSaludos.
hola amigo... al final si q me funciona agregandole un usuario nuevo.... pero hay q agregarle la autentificacion... te agrego el codigo por si lo quieres agregar de alguna marera a tu programa...
ResponderBorrarURL nurl = null;
try {
nurl = new URL("http://169.254.1.240/cgi/jpg/image.cgi");
} catch (MalformedURLException e) {
e.printStackTrace();
}
Authenticator au = new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication ("user", "pass".toCharArray());
}
};
Authenticator.setDefault(au);
y ahora puedes empezar a captar las imagenes....
cualquier duda avisa.... jajaj
un saludo
Excelente amigo, se te agradece por el aporte. También sería bueno que nos comentes el modelo de cámara IP que usaste.
ResponderBorrarSaludos.
es una marmitek ip robocam 11... pero supongo q este codigo funcionaria para cualquiera... mientras se sepa la ruta de acceso a la captura de imagen y tengas un usuario y un password para poder hacer a autentificacion no deberia haber ningun problema... :P
ResponderBorrarHola amigo Rolando:
ResponderBorrardescargue su ejemplo CamaraIP.rar pero a la hora de ejecutarlo me sale un detalle que en la linea panelVideo.repaint(); sale un error que no se encientra el simbolo, y luego entonces si lo cambio a PanelVideo.repaint(); o sea le cambio la letra inicial para igualarlo al nombre de la otra clase entonces dice el error que no se puede referenciar el metodo repaint que es no estatico desde un contexto estatico.
sabe usted como se puede corregir este problema pues me interesaria ver el funcionamiento de esto , pues estoy haciendo una aplicacion que necesito ver el videl de una camara de seguridad IP y poder grabarlo en la computadora.
gracias por su tiempo y deseos de compartir sus conocimientos.
Robert
robert en teoria no te deberia dar ningun problema al ejecutarlo con el eclipse.... aunque tienes q mirar si tienes q pasarle algun tipo de autentificacionen cuyo caso debes añadir el codigo q puse en un comentario mas arriba...
ResponderBorrarEstoy tratando de implementar tu código para una cámara IP cam F-Series. En el campo dirección IP escribo http://192.168.30.127:8168/videostream.cgi?user=admin&pwd=, sin embargo no se despliega ninguna imagen. Tampoco el programa envía ningún error.
ResponderBorrarDespués de recorrer el código he encontrado que en la línea frame = ImageIO.read(nUrl);, frame tiene el valor "null".
Tendrás alguna idea de que es lo que estoy haciendo mal.
P.D.: Si escribo la dirección anterior (http://192.168.30.127:8168/videostream.cgi?user=admin&pwd=) en el explorador (Firefox) el video se despliega correctamente.
¿Cuando escribes la dirección en el navegador se despliega el video o la imágen? Te pregunto esto porque lo que el programa de Java necesita es la imágen mas no el video. Actualmente estoy teniendo el mismo problema con una cámara IP de fabricación china. Cualquier avance que logres agradecería lo comentes aquí.
ResponderBorrarSaludos.
En el explorador se despliega el video.
ResponderBorrarTambién mi cámara es de fabricación china.
No entiendo muy bien cuando señalas "el video o la imagen". Yo supongo que el video se crea cuando se despliegan secuencialmente una serie de imágenes.
El post muestra como capturar la imágen, no el video. Tienes que buscar la url del módulo cgi que en el explorador te muestre una imagen, no un video.
ResponderBorrarHola Rolando,
ResponderBorrarYo tengo una Cámara Ip Easy N de exteriores.
Probé tu código y son varios los errores.
Quisiera saber si es posible crear un Applet que establezca el contacto con la cámara Ip y le permita a mis clientes monitorear sus intereses.
Agradezco de antemano tu ayuda.
Saludos-.
Sería bueno que postees los errores, de esa manera será más fácil poder depurar la aplicación. Por otro lado, crear un Applet y darle la funcionalidad que deseas dependerá mucho del fabricante de tu cámara pues he visto cámaras IP chinas que no traen ningún applet embebido ni mucho menos un control ActiveX sino solo envía imágenes usando Javascript.
ResponderBorrarHola Rolando:
ResponderBorrartengo una camara IPC-818 y desdel el internet explorer puedo ver el video con la direccion http://192.168.0.101/cgi-bin/display.cgi lo cual es muy parecido al suyo, o sea el modulo de video en este caso termina en extension .cgi al igual que el modulo de imagen suyo que termina en ../image/jpeg.cgi, me pregunto que ideas tiene usted de por que no veo una imagen al menos luego de implementar lo que usted hizo pues aca lo que puedo ver es desde el internet explorer veo bien el video, pero desde el software suyo que esta muy bueno, me da error al tratar de leer de la url especificada.....me estoy imaginando que los modulos de video y de imagenes son diferentes, tal vez en su camara hay otra forma de accesar al video y otra a las imagenes, y desde la mia solo al video y no tiene acceso a las imagenes, supongo que si tomo una camara con acceso a las imagenes del modulo cgi entonces con su programa pueda entonces ver las imagenes,
aunque tengo la idea de que el video no es mas qeu la secuencia de frames(imagenes) por segundo , lo cual he corroborado, pues logro extraer los frames de cualquier video y veo que son imagenes, no se porque razon que esta haciendo el software de mi camara que solo me da acceso al video y no a yo tomar del modulo cgi las imagenes para procesarlas, como yo quiera, por lo tanto se me hace imposible poder tomar imagenes de mi camara con su programa de java.
tiene usted idea si todas las camaras tienen acceso o deberian tenerlo al modulo cgi para poder tomar las imagenes(frames) segun las necesidades de los usuarios?
ante todo muchas gracias por su blog y el tiempo que le dedica a atenderlo....
atentamente
Robert
Hola Robert, verifica que desde el navegador puedes acceder mediante el módulo cgi a una imágen y no video sin ningún tipo de autenticación previa. De darse el caso no deberías tener ningún problema para utilizar esta aplicación. Recuerda: acceder a imagen, no video. Espero compartas tu experiencia.
ResponderBorrarSaludos.
Hello Rolando
ResponderBorrarI can't download your code, is it working ?
Thanks a lot.
Renan
Try this: https://sites.google.com/site/tecnologiaenperu/home/CamaraIP.rar?attredirects=0&d=1.
ResponderBorrarRegards.
Rolando estoy probando tu proyecto con una camara de marca trendnet y no me funciona, quizas podrías probar..
ResponderBorrarcorreo:logica_razon@hotmail.com
Amigo yo instalo y configuro las camaras ip..pero no entiendo nada de programacion,,, usted me podria colaborar con un paso paso para el uso de su programa.. yo tengo las ip ,los puertos y los usuarios y contraseña.
ResponderBorrardisculpeme la molestia y la ignorancia.
te dejo mi otromovil@hotmail.com
Rolando crees q esto funcione con una camara IP china la cual se conecta con IP y numero de puerto, o que parte del codigo podria cambiar para hacer posible esto
ResponderBorrarMientras la cámara IP te pueda dar acceso a las imagenes mediante una url, el programa funcionará sin ningún inconveniente amigo.
ResponderBorrarSaludos
hola es que tengo una camara ip axis m1013-w y no que muestra imagen y no se como poner desde el programa la autentificación a ver si me podrias ayudar. gracias
ResponderBorrarte dejo mi correo yamto.elsuperior@gmail.com
He visto varias de tus publicaciones y cada una es mas interesante que las otras...
ResponderBorrar/o aún estoy en segundo grado de bachillerato tecnológico, pero en mi escuela tienen instaladas un par de camaras ip y me preguntan a mi!!! xq saben que soy medio traumado con java si se puede hacer un programa de gestión de los datos recibidos (grabar, borrar, visualizar mas tarde).
No se necesita ninguina librería externa verdad?
Rolando si tienes un tiempo te agradeceria una respuesta a mi mail:
jorge_dan03@hotmail.
Yo por las dudas me vuelvo a pasar x aquí luego, gracias!!!
Hola Jorge, gracias por tus comentarios.
BorrarTe cuento que sí es posible hacer eso que me comentas. En primer lugar tendrías que guardar en alguna carpeta todas la secuencia de imágenes cada cierto intervalo de tiempo (que lo determinarías tú) y luego utilizando ffmpeg.exe (una solución multiplataforma para el streaming de audio y video) generar una video en un formato estándar.
Exelente información, gracias por compartir lo q sabes pana
ResponderBorrarhola mira he tratado de ejecutar el proyecto en netbeans y mmm no me deja me manda errores y he acomodado tu codigo en forma lineal y tratar de ejecutarlo por el simbolo del sistema y bueno el unico error que me corre es el de
ResponderBorrarError: no se ha encontrado el método principal en la clase PanelVideo, defina el método principal del siguiente modo:
public static void main(String[] args)
posiblemente sea por que el metodo este en alguna clase del proyecto o bueno crees poder ayudarme
Y como hago para grabar en un archivo un video (o un conjunto de imagenes) ? tienes alguna referencia ?
ResponderBorrarHola Kenny, lo que tienes que hacer es ir guardando las imágenes en disco duro y luego utilizando algún utilitario como los del proyecto FFMPEG crear archivos de vídeo desde la secuencia de imágenes capturadas. Te comparto el siguiente enlace: https://code.google.com/p/jjmpeg/
BorrarTe comento que esto funciona pues un amigo del trabajo logró implementarlo en unas horas. Espero nos puedas compartir tu experiencia.
Saludos.
Rolando que estés bien, tendrás ya disponible un ejemplo del código que comenta Kenny sobre almacenar video y de paso tengo una consulta mas , haz trabajado la captura del audio también, si tienes un ejemplo que mostrar.
ResponderBorrarGracias!. saludos
hola, disculpa las molestias, pero he implementado el código que has proporcionado y no me despliega nada en la aplicación, la url que uso es similar a la siguiente:
ResponderBorrarhttp://[direccionhost]:[puerto]/cgi-bin/CGIProxy.fcgi?usr=[usuario]&pwd=[contraseña]&cmd=snapPicture
Cuando meto esta url al navegador me despliega la imagen y si refresco, tambien cambia la imagen. No se si tenga algo que ver pero al copiar la URL de la imagen me muestra algo similar a esto:
http://[direccionhost]:[puerto]/snapPic/Snap_20131010-230907.jpg
y si vuelvo a ingresar a la primer url y regreso a la segunda ya no encuentra la imagen, supongo que la primera url guarda una imagen en la segunda url, solo que cambia el nombre de la imagen por el día y hora que se tomó.
:( el programa no me marca error, pero deja el jpanel en blanco, tienes alguna idea de como recuperar la imagen, empiezo a creer que no se puede
hola, sopy nuevo en esto, tengo una camara IP Vivotek, pero no tengo la menor idea en donde agregar el codigo para modificarlo...
ResponderBorrarpor favor pudieran orientarme.
Gracias
exactamente quiero saber donde y como genero la URL para mi camara.
ResponderBorrarmil gracias.
Hola Rolando, muy interesante, yo tengo el siguiente problema, tengo una camara ip, pero mi proveedor de internet no puede otorgarme una ip publica, entonces pensé en convertir la camara i en una tipo camara web, es decir cuando esté fuera de mi casa, dejo prendida la compu y en cuanto detecte movimiento que me mande una señal a twitt, puedo hacer eso supongo con algun codigo similar cierto? Salduos
ResponderBorrarHola Rolando, muy útil tu aporte.
ResponderBorrarRolando como seria la forma de recepción de la información si el formato no fuera jpg si no mjpg?
ResponderBorrarhola amigo
ResponderBorraryo tengo una camara ip, la wue me gustaria poder visualizar desde mi blogspot.
tienes a mano el codigo?... gracias
Saludos, que tipos de cámara ip recomiendas? con tu programa en teoría obtendría un streaming de vídeo? seria posible ajustar los fps de las imágenes estáticas?
ResponderBorrargracias !
No funciona!!! Alguna otra alternativa? Mi ip cam es una TP-Link TL-SC2020N, y según el archivo donde de va mostrando la imagen es video.mjpg, y ya lo especifiqué en la url. Alguna sugerencia al respecto?
ResponderBorrarrolando buena tarde, disculpa, sabes si se puede guardar un jpg de lo que estoy viendo en la dirección ip para después que queden las fotos, haces mención en uno de los comentarios que se puede pero no encontre como se puede hacer?
ResponderBorrarHola rolando.
ResponderBorrarEstoy desarrollando una aplicacion de vigilancia y el cliente quiere poder obtener acceso (con usuario y contraseña) desde cualquier lugar con internet. se necesitan varios niveles de usuario y bueno, por eso no usamos el applet de las cámaras
Quisiera saber si me podria dar alguna idea de como realizarlo. estaria realmente agradecido.
Gracias por compartir el conocimiento. saludos desde Colombia
The all new done as long as enhanced range of CCTV cameras :-
ResponderBorrarThe empresas de seguridad other points are eagles not serious done as long as good enough for any way of work. From every use of the oral camaras ip value sphere are definite areas where the work will work. The biometrico correct thing is very important to make etch system work in the selected cctv level for action. The article is correct in terms of great point intended for use.
Hola, estamos trabajando en equipo para desarrollar una aplicación de este tipo, me parecen muy interesantes los conceptos que manejan y agradezco el aporte, solamente tenemos unas dudas:
ResponderBorrarEn qué parte del código va el arreglo de la url que aportó Anónimo? Muchas gracias por sus comentarios y respuesta. Reciban saludos cordiales.
Excelente!! muchas gracias!! Felicitaciones!!
ResponderBorrarnunca que me conecta ni me manda erro ni señal se queda en blanco
ResponderBorrarhi ev1 hotmail or live are conecting last year where i can found the last cfg? gmail, motion detection need it etc.
ResponderBorrarHola, sorprendente equipo, le acabo de descubrir visión nocturna ajustándole los codecs, bueno los parámetros de los codecs, no es gran cosa pero consigue tonos blancos de tonos a un 80 % o 90 % oscuros en photoshop x ejemplo. La seguridad es excelente tiene audio, compatible con gran cantidad de equipos con navegación rtsp. Diferenciación espacial hace saltar una alarma con movimiento en un recuadro, la wifi necesita ampliar sus configuraciones al igual que muchos teléfonos móviles pero va. Graba en dispositivos remotos, configurable, etc, reset, luz azul: de cámara azul, modos de luz azul, etc. Supongo que no tardaran en hacer otro firmware con control por aplicacion o un modelo fisheye nuevo, aplicativos dns, twitter, ...
ResponderBorrarHola ! Excelente post! Una consulta, es posible visualizar de manera similar pero a partir de un DVR??? Necesito visualizar en mi sistema java 4 camaras , y para evitar quitarle velocidad de procesamientoa mi sistema, quisiera procesar a través del DVR y después verlo, es posible?
ResponderBorrarQue buen post!
ResponderBorrarLo importante es hacer que las Cámaras de seguridad sean cada vez más seguras. Muchas gracias!