martes, 24 de agosto de 2010

Transmision de video usando sockets en Java

Este post será corto de palabras pero como siempre con mucho código fuente para descargar, analizar y reutilizar. Un amigo de guatemala me hizo una consulta acerca de la transmisión de video y bueno, Dos horas antes de escribir este post me propuse darle una mano. La idea era transmitir video pero sin usar R.T.P. sino transmitiendo uno a uno los frames provenientes de una fuente de video, que en este caso es una cámara web.

Anteriormente posteé la forma de cómo acceder a los frames de video usando el Java Media Framework, si no lo has leído aún te recomiendo lo hagas http://rolandopalermo.blogspot.com/2010/06/procesamiento-de-video-en-tiempo-real.html y en este post vamos a transmitir esos frames capturados. No explicaré el código porque en internet hay bastante información así como ejemplos de cómo usar sockets en java.

Fig. Servidor

Fig. Cliente

Aquí les dejo el proyecto desarrollado usando Netbeans.

Photobucket

Saludos y espero te sea de utilidad!... No olvides dejar tu comentario que motiva el seguir compartiendo el conocimiento y las experiencias.

50 comentarios:

Erick Arroyo dijo...

No se como agradecerte, era lo unico que me faltaba, y no tenia la mas remota idea de como hacerlo. Cualquier otra cosa te estare molestando. Muchisimas gracias.

Erick Arroyo dijo...

Rolando, estube probando pero no me funciona el transmisor de video, al ejecutarlo me salen 2 errores: Linea 58 y Linea 196. No se que sea.

Rolando dijo...

Es cuestion de que configures tu java media framework. Ejecuta el JMStudio y busca configura tu cámara web o lee la documentación de JMF.

Erick Arroyo dijo...

Probe un proyecto que solo captura una fotografia y si funciona la aplicacion, pero no funciona el Acceder2Frames.java. Ya vi el JMStudio pero no se que sea

Erick Arroyo dijo...

Problema resuelto, tenia una IP fija, por estar probando el proyecto en red, lo restaure y funciona de maravilla. Que tendria que agregarle para eviar sonido. Agradezco tu ayuda.

Rolando dijo...

Vas a tener que agregarle mucho empeño y ganas de investigar. ^^
Saludos.

Erick Arroyo dijo...

Ok, me has ayudado mucho y lo agradezco, me sacaste de un gran apuro. Te cuidas.

Anónimo dijo...

Amigos estoy tratando de mostrar el video capturado de la camara wep integrada de mi portatil en un frame, y que al hacer clicl muestre en otro frame la imagen o ofto de ese instante, par lograrlo intente poner a funcionar este programa pero me salen dos errores
at com.blogspot.rolandopalermo.sockets.Acceder2Frames.(Acceder2Frames.java:58)
at com.blogspot.rolandopalermo.sockets.Acceder2Frames.main(Acceder2Frames.java:196)

por favor si me puedes ayodar te lo agradeceria inmensamente.

Erick Arroyo dijo...

Ya instalaste el JMF, si ya lo hiciste, tienes que configurar la camara en el panel del JMF, saludos.

roberto dijo...

hola buenas tardes rolando lei tu publicacion y quiero q m ayudes me pidieron q transmitiera el video de una webbcam en tiempo real asi como tu lo haces pero de ahi insertarlo a una pagina web para q se vea me podras ayudar dame tu correo o algo para contactarte en verdad me urge para un proyecto espero y me contestes pronto
mi correo es roberto860205@hotmail.com

rvs dijo...

ava.lang.ExceptionInInitializerError
Caused by: java.lang.RuntimeException: Uncompilable source code - package javax.media does not exist
at com.blogspot.rolandopalermo.sockets.Acceder2Frames.(Acceder2Frames.java:25)
Could not find the main class: com.blogspot.rolandopalermo.sockets.Acceder2Frames. Program will exit.
Exception in thread "main" Java Result: 1 me marca ese errror ayuda

Rolando dijo...

Aprender a detectar el origen de una excepción es parte de aprender a programar en Java.

Saludos.

rvs dijo...

es que soy nuevo en esto por eso me atrevo a recurrir a tu ayuda y espero no te nolestes

Anónimo dijo...

LA APLICACIÓN ES UN MUY BUEN EJEMPLO... ME GUSTARÍA SABER COMO HACER PARA CAPTURAR EL SONIDO TAMBIÉN... GRACIAS

geank dijo...

Wenas está muy weno el programa, pero tengo un problema me tira un NullPointerException en la clase acceder2Frames y creo que es xq el dispositivo que esta escrito o al menos lo que se le envia en ese momento no existe esta es la linea dispositivo = CaptureDeviceManager.getDevice(source);, entonces investigué un poco y encontré el método CaptureDeviceManager.getDeviceList(); pero no me devuelve nada sabes si ese es el error o ando buscando el error por mal camino si puedes me respondes a zevox11@gmail.com

Anónimo dijo...

muchas gracias me ayudo mucho!!!

Anónimo dijo...

Gracias por el aporte.

Solo quiero mencionar a todas aquellas personas que apenas comienzan a emplear multimedia en java, que despues de instalar el JMF, ejecuten el archivo "jmfinit.exe" localizado en la carpeta bin del JMF. Lo que permitira reconocer los dispositivos, posteriormente abran la aplicacion "jmstudio.exe" localizada en la misma carpeta y en la opcion de File-Preferences-Capture devices, debe aparecer su camara algo como "vfw:Microsoft WDM Image...". En su momento si descargan alguna aplicacion y la ejecutan, les sugiero utilizar los JAR´s que se encuentran en la carpeta de lib. Ya que en muchos foros algunos compañeros tienen ese problema, pero si funciona con los JAR´s que se descargan con el proyecto, pues que mejor.

Hilario de la Cruz Hernandez dijo...

Oye Rolando primeramente te agradesco por tu aportacion, me ha ayudado de mucho, pero tengo un problema, al ejecutarlo me funciona bien, pero despues de unos 10 o 15 minutos la memoria del BufferedImage se desborda y me manda el siguiente mensaje:"java.lang.OutOfMemoryError" en la siguiente linea de codigo: "BufferedImage bufferedImage = (BufferedImage)buffer_image.createImage(buffer);"
Ya intente vaciar la memoria del BufferedImage despues de usarla, pero me sigue dando el mismo error, ¿Tienes alguna idea para solucionar este error?.

Anónimo dijo...

hola muy agradecido por tu tuto

juan carlos orozco navarro dijo...

hola muchas gracias por tu tuto
quiciera saber com puedo hacer para mostar en el servidor varios clientes es decir si tengo 6 equipos mas un servidor como hago para que desde el servidor pueda ver los 6 equipos al mismo tiempo ????

Anónimo dijo...

Disculpa la pregunta, pero ¿Como ejecuto el cliente? al momento de compilarlo solamente aparece el servidor, soy muy nuevo en java y debido a que sigo sin poder usar el JMF para guardar video me pareció mejor idea transmitirlo como imagenes.

Anónimo dijo...

Bien Hermano ya con esto me solucionado el proyecto final te agradesco mucho solo unos cuantos arreglos pero gracias hermano,saludos

Anónimo dijo...

hhoolllaa

tito dijo...

salu2 amigos muii bueno tu proyecto pero me salen erroes
import javax.media.Buffer;
import javax.media.CaptureDeviceInfo;
import javax.media.CaptureDeviceManager;
import javax.media.Manager;
import javax.media.MediaLocator;
import javax.media.Player;
import javax.media.Processor;
import javax.media.control.FrameGrabbingControl;
import javax.media.format.VideoFormat;
import javax.media.util.BufferToImage;

package javax.media doesnt exit como puedo solucionar este incoveniente..

Rolando dijo...

http://www.oracle.com/technetwork/java/javase/download-142937.html

Laura dijo...

Hola, soy nueva en esta página web.
Tengo que hacer un proyecto muy parecido, tengo que transmitir vídeo (capturado del display de mi ordenador) con UDP.
He escrito algo de código, pero estoy intentando que el cliente pueda ver en el display la imagen. Para ello estaba leyendo tus posts. ¿Me puedes ayudar a adaptar tus consejos a mi proyecto? En ese caso te proporcionaré mi dirección de email.
Muchísimas gracias.

Rolando dijo...

Hola amiga, a qué te refieres con display. Estoy seguro que podremos ayudarte con tu proyecto.

Laura dijo...

Con display me refiero al monitor de un PC. El proyecto se trata de con un frame grabber capturar la imagen del monitor, guardarla y transmitirla por multicast con UDP. He empezado a escribir el Cliente y el Servidor, y estoy intentando enviar una imagen .jpg al cliente pero no se como abrir un reproductor o ventana con la imagen que se está reciviendo. Si tienes tiempo, me gustaría enviarte por correo mi código (no es muy diferente a lo que se puede encontrar por internet). A ver si me puedes ayudar.
Gracias

Rolando dijo...

El código es casi el mismo que el que se ha publicado aquí amiga, solo tienes que cambiar la fuente que en tu caso sería un screenshot de tu pantalla, luego enviarlo a una dirección multicast. Saludos

Laura dijo...

De acuerdo, lo provaré, muchas gracias.

Boris dijo...

Hola amigo, me parece excelente el proyecto y me gustaría hacerle unas modificaciones para poder enviar un archivo de video que ya se encuentra en mi máquina. Cambié el MediaLocator para este fin pero no estoy seguro de como manipular los frames, ya que tal como está me saca errores (Failed to configure: com.sun.media.PlaybackEngine@1a643473).
Te agradecería mucho que pudieras colaborarme y nuevamente felicitaciones.

Anónimo dijo...

Excelente, funsiona sin problema!!

edgaring dijo...

Que tal rolando tengo un problemita mira necesito controlar una cámara ip con una interfaz hecha en java y no se por donde empezar el proyecto de antemano muchas gracias por tus sugerencias.

Rolando Palermo Rodríguez Cruz dijo...

Buen día Edgar, te recomiendo leer este post: http://rolandopalermo.blogspot.com/2012/03/camara-ip-cam-java.html
No te olvides de seguirnos a través de Facebook para enterarte de muchas novedades.

Saludos

Jair Alfonso Rios Carlys dijo...

Gracias Rolando por Tu post, esta muy bueno,,,,

Pero tengo una duda como seria la adaptacion para que el receptor del video, en este caso no sea quien abre el puerto osea el ServerSocket, sino que sea el cliente el socket que se conecta al servidor por asi decirlo...

Seria bueno que el video se transmitiera del ServerSocket a los Socket que se conectann,....

echame una mano, que estado intentando por no encuentro como...

jilmark dijo...
Este comentario ha sido eliminado por el autor.
jilmark dijo...

Gracias .
solo una pregunta puedo transmitir el audio de las misma manera sin utilizar R.T.P

Miguel Antonio Cardenas Sanchez dijo...

muy bueno el post amigo.. una pregunta.. para hacerlo con ipv6 como seria?

Zona Madridista dijo...

a mi no me sale no he podido configurar la camara integrada del portatil :( con el JMF ayudenme :( !!!! no he podido ver como funciona :(

Agustin Montero dijo...

public Acceder2Frames() {
initComponents();
dispositivo = CaptureDeviceManager.getDevice(source);
++++++ localizador = dispositivo.getLocator();+++++++
timer = new Timer (1, new ActionListener () { //Cada 1 milisegundo capturará el frame de video
public void actionPerformed(ActionEvent e) {
FrameGrabbingControl fgc = (FrameGrabbingControl)player.getControl("javax.media.control.FrameGrabbingControl");
buffer = fgc.grabFrame();
// Convert it to an image
buffer_image = new BufferToImage((VideoFormat)buffer.getFormat());
img = buffer_image.createImage(buffer);

panelCaptura.setImage(img);
}
});
iniciarCaptura();
}
en la parte k estan los signos +++ (mas) me da un error alguien podria ayudarme

Rolando Palermo Rodríguez Cruz dijo...

Coméntanos el error Agustin.

Noe Rojas Flores dijo...

Oye amigo tengo un problema en
localizador = dispositivo.getLocator();
espero tu ayuda
Grax

Anónimo dijo...

Al ejecutar el cliente da un error que tiene que ver la liena de codigo:

localizador = dispositivo.getLocator();

ayuda con esto porfavor necesito lo necesito de urgencia

Anónimo dijo...

hola cuando intento ejecutar el cliente me saltan estos errores:
Exception in thread "VFW Request Thread" java.lang.UnsatisfiedLinkError: JMFSecurityManager: java.lang.UnsatisfiedLinkError: no jmvfw in java.library.path
at com.sun.media.JMFSecurityManager.loadLibrary(JMFSecurityManager.java:206)
at com.sun.media.protocol.vfw.VFWCapture.(VFWCapture.java:19)
at com.sun.media.protocol.vfw.VFWSourceStream.doConnect(VFWSourceStream.java:241)
at com.sun.media.protocol.vfw.VFWSourceStream.run(VFWSourceStream.java:763)
at java.lang.Thread.run(Thread.java:722)

porfavor necesito ayuda para correr el programa

Kenny Trillo Paiva dijo...

Excelente, me gustaría saber como podría hacer lo mismo utilizando cámaras Ip. Gracias de antemano ;)

Rolando Palermo Rodríguez Cruz dijo...

Hola Kenny, te recomiendo revisar el siguiente enlace: http://blog.rolandopalermo.com/2012/03/camara-ip-cam-java.html

Denis Kiss dijo...

Download Java in http://java.joydownload.com/

KRISTOOF dijo...

Hola Rolando, JMF no detecta mi cam... :/

Anónimo dijo...

Hola, WVC80N, 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, alarma y acceso multiusuario. 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, ...

Raydel Piloto Quesada dijo...

Que tendría que hacer para reproducir un video local, Que no sea por una webcam o otro tipo de cámara.

Publicar un comentario