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:

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

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

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

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

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

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

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

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

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

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

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

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

    Saludos.

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

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

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

    ResponderEliminar
  16. muchas gracias me ayudo mucho!!!

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

    ResponderEliminar
  18. 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?.

    ResponderEliminar
  19. hola muy agradecido por tu tuto

    ResponderEliminar
  20. 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 ????

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

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

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

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

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

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

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

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

    ResponderEliminar
  29. De acuerdo, lo provaré, muchas gracias.

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

    ResponderEliminar
  31. Excelente, funsiona sin problema!!

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

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

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

    ResponderEliminar
  35. Este comentario ha sido eliminado por el autor.

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

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

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

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

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

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

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

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

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

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

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

    ResponderEliminar
  46. 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, ...

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

    ResponderEliminar