Java Media Framework permite la reproduccion de archivos multimedia (video, musica), pero tambien permite capturar desde dispositivos externos (una webcam por ejemplo) video y audio, eso es lo que haremos hoy.
En un tutorial pasado se vio la manera de detectar los dispositivos que se encuentren actualmente en nuestro sistema, si no lo viste, date una vuela por aqui "Buscar Dispositivos".
Para este ejemplo, se utilizara como dispositivo de captura, "vfw:Microsoft WDM Image Capture (Win32):0" que es el Controlador Universal de Windows para las camaras de video.
Que necesitamos:
- IDE Netbeans 6.9
- Libreria JMF (Java Media Framework) instalada y configurada en el sistema
- Una WebCam, celular con camara tambien sirve
Proyecto:
1. crea un nuevo proyecto en Netbeans, llamalo "jmfvideosimple", crea una clase "jmfVideo.java" y una clase mas de tipo JFrame, llamalo "video.java", debes tener algo como esto:
Debes añadir la libreria JMF al proyecto, para esto clic derecho donde dice "Bibliotecas" y clic en "Agregar Biblioteca", si no sabes como agregar una libreria a Netbeans, busca en el blog que hay un tuto que indica como.
2. A nuestra clase "jmfVideo.java" añade el siguiente codigo:
import java.util.logging.Level; import java.util.logging.Logger; import javax.media.*; import javax.media.cdm.CaptureDeviceManager; import java.io.*; import java.awt.*; import javax.swing.JOptionPane; /** * @web http://jc-mouse.blogspot.com/ * @author Mouse */ public class jmfVideo { //Controlador universal de windows private String dispositivo = "vfw:Microsoft WDM Image Capture (Win32):0"; private Player player = null; public Component Componente(){ Component componente_video; try { // Se obtiene el dispositivo CaptureDeviceInfo device = CaptureDeviceManager.getDevice(dispositivo); //se obtiene la fuente de datos de captura MediaLocator localizador = device.getLocator(); //El localizador es del tipo "vfw://0" video para windows //se crea el PLAYER y se ejecuta player = Manager.createRealizedPlayer(localizador); player.start(); } catch (IOException ex) { Logger.getLogger(jmfVideo.class.getName()).log(Level.SEVERE, null, ex); } catch (NoPlayerException ex) { Logger.getLogger(jmfVideo.class.getName()).log(Level.SEVERE, null, ex); } catch (CannotRealizeException ex) { Logger.getLogger(jmfVideo.class.getName()).log(Level.SEVERE, null, ex); } //Si se pudo crear el PLAYER, se obtiene el componente de video if ((componente_video = player.getVisualComponent()) != null) { //se da un tamaño al componente componente_video.setSize(320, 240); return componente_video; } else { JOptionPane.showMessageDialog(null,"No se pudo crear el video..."); return null; } } }
Esta clase utiliza el dispositivo vfw:Microsoft WDM Image Capture (Win32):0, para crear un Player y devolver un componente de VIDEO.
3. Ahora, en la clase interfaz "video.java", debemos implementar la clase anterior, para ello,solo trabajaermos en el Constructor de la clase.
public class video extends javax.swing.JFrame { jmfVideo b = new jmfVideo(); /** Creates new form video */ public video() { initComponents(); this.setTitle("WebCam - by Mouse"); //formulario al centro de la pantalla this.setLocationRelativeTo(null); //se da un tamaño al jFrame this.setSize(320, 240); //se coloca un layout tipo CAJA getContentPane().setLayout(new javax.swing.BoxLayout(getContentPane(), javax.swing.BoxLayout.LINE_AXIS)); //se añade el componente de video this.add( b.Componente()); }
Como se ve en el ejemplo, se crea una instancia a nuestra clase "jmfVideo.java" y esta se añade al JFrame , el resto del codigo, solo es para dar un tamaño inicial al JFrame y una alineacion tipo CAJA (BOX) utilizando Layout.
4. Eso es todo, solo queda ejecutar el proyecto, teniendo la webcam ya conectada claro :), (creame, pasa hasta en las mejores familias)
Y Si hicimos todo bien, ya podremos ver el video dede nuestra webcam
Como modelo en el video podemos ver a mi perro haciendo lo que mejor sabe hacer, "dormir", hubiera querido filmar otra cosa, pero un cementerio tiene mas vida que el lugar donde vivo asi que toco grabar al perro :)Proyecto
Recuerda si te bajas el Codigo Fuente, esta bien, aprenderas, pero si realizas el proyecto tu solo, aprenderas mucho mejor
Hola
ResponderEliminarOye y si quiero que me detecte la camara integrada de un portatil, se odria asi tambien en general como el controlador de windows que pusiste ahi, estoy intentando porbar el que tu hiciste pero no funciona
yo probe el codigo con dos webcam, camara de celular, una camara de video SIPIX y camara integrada de portatil en sistema operativo windows XP y vista sin problemas, talvez debas darte una vuelta por :
ResponderEliminarhttp://jc-mouse.blogspot.com/2011/03/jmf-buscar-dispositivos.html
asi podras configurar tu camara con JMF
saludos
hola amigo... tengo una consulta que hacerte y ojala puedas ayudarme
ResponderEliminaral iniciar jmStudio y capturar imagen me sale la pantalla color rosa y no se ve nada pero la luz de la cam se enciende... la cam esta en buen estado ya ke funciona en msn y otros programas... espero tu respuesta y gracias de antemano
Tendras algo sobre system tray en netbeans?
ResponderEliminarHol quiero felicitarte por tu excelente trabajo hasta ahora con tu blogger.
ResponderEliminarHace varios dias vengo buscando este tema de web cam y java. Pues tu proyecto lo he podido ejecutar con éxito asi como muchos anteriores pero el unico problema que me causa es que al parecer no es totalmente compatible con windows 7 x64 porque me camba el tema a BASICO.
Espero me puedas ayudar muchas gracias. (=
Boa tarde estou com pequeno problema compilo o codigo em minha maquina mas ela aparece a seguinte mensagem mesmo apos ter instalado tudo corretamente aparece essa msn de Erro:
ResponderEliminarException in thread "main" java.lang.NullPointerException
at jmfvideosimple.jmfVideo.Componente(jmfVideo.java:24)
at jmfvideosimple.video.(video.java:18)
at jmfvideosimple.Main.main(Main.java:7)
da diferenca uma maquina 32 bits e uma de 64 para utilizar o JMF ?se poder me ajuda Obrigado.
buen dia, llevo dias buscando esto pero en Vb2008, no encuentro como hacerlo, no tendras este codigo en vb2008???? o 2005 gracias por tu respuesta
ResponderEliminarVarias personas ya me dijeron que winseven no es totalmente compatible con JMF, supongo que habra que esperar a que actualicen el API
ResponderEliminarRM: ese es un problema con el dispositivo, verifica que JFM reconoce tu camara
Julio: nuevos codigos desde la siguiente semana :)
Hola amigo que bueno blog el tuyo te felicito hay muchas cosas interesantes tengo una inquietud lo que pasa es que cuando ejecuto la aplicacion me sale una ventana preguntando por el video source en el video veo que la aplicacion no lo hace y carga de una vez el video
ResponderEliminarPero esto solo funca en window$, nada de linux, por que al parecer usas librerías propias de windows, y la clase debería ser transparente al SO pues esa es la gracia de programar en Java, sino pues mejor lo hago en algún lenguaje de Microshit.
ResponderEliminarthanx
ola sera que jmf funcionan para tramitir tv en vivo por medio de una tarjeta de video
ResponderEliminarHola tengo win7..instale el jmf, por este mismo proyecto de querer transmitir video para una videoconferencia, y al intentar ejecutar las clases, ni siquiera se inicializa el FRAME.. cual seria el problema??.
ResponderEliminarComo podria implementarlo en un jsp ya q tengo un formulario donde capturo los datos del empleado y quiero tomarle la foto
ResponderEliminarBuena tarde mouse una pregunta,como podría grabar lo que se está capturado en el video,por ejemplo para que quedé grabado como. .avi
ResponderEliminarHola, muy bueno el post, te he copiado la clase para capturar el video de la web cam pero con una pequeña modificación ya que el método getDevice no reconoce me webCam. Sin embargo, a la hora de añadir el componet debe haber algún problema que no consigo solucionar, el Jpanel que contiene el video aparece en rosa y cuando minimizo el Jframe que lo contiene aparece sobre cualquier elemento que hubiese debajo de la parte rosa una captura de pantalla. Es muy extraño, te pongo el código para ver si se te ocurre algo. Un saludo y Gracias por adelantado:
ResponderEliminarLa action performance que inicia el Jframe:
private void VideoCamActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
//Se pide el nombre del nuevo directorio. Y se crean los directorios de las
//distintas emociones en él.
IODialog entradaSalida = new IODialog();
String pathBaseDD;
String directorioFuente = entradaSalida.readLine("Introduce el \n"
+ "nombre de la nueva base de datos");
pathBaseDD = CreaDirectoriosBaseDatos(directorioFuente);
// Se crea el objeto
VentanaWebCam h1 = new VentanaWebCam();
// se añade al jDesktopPane
jDesktopPane1.add(h1);
h1.SetPath(pathBaseDD);
//se muestra en pantalla
h1.setVisible(true);
}
la ventana h1:
public VentanaWebCam() {
initComponents();
VideoPanel.add(video.Componente());
}
la modificacion de tu código
// // Se obtiene el dispositivo
// CaptureDeviceInfo device = CaptureDeviceManager.getDevice(dispositivo);
// //se obtiene la fuente de datos de captura
// MediaLocator localizador = device.getLocator();
MediaLocator localizador = new MediaLocator("vfw:\\Device\\0000008b");
Creeme que cunado pruebo tu codigo, al compilarlo netbeans me vota una exepcion como esta:
ResponderEliminarException 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)
Aclaro uso netbeans 7
JMF tiene errores con windows seven
ResponderEliminarHola Mouse!
ResponderEliminarSabés qué dispositivo debo usar para MAC OS? O cómo configurar el jmfRegistry para que reconozca la cámara built-in iSight?
Gracias!
lo siento, ni idea de como usar en MAC
ResponderEliminarMuy buen post Mouse!!
ResponderEliminarTengo una duda, se puede tomar video en un formato mayor a 640x480, tengo una camara en la que la máxima resolución de video es de 1280x720 pixeles, pero el formato de video mas grande que he podido tomar es solo el de 640x480, ayuda x favoooor!!!
Dejo una pequeña colección de videotutoriales sobre el uso de la webcam con el JMF para al que le pueda interesar.
ResponderEliminarVideotutoriales sobre la webcam en Java
a pillin te vi haciendo spam :)
ResponderEliminarbuenos videos recomendado :)
Hola mouse me encanta tu forma de enseñar la cosas .,.,,. sacas 10 ,,. oye como le ago para que en lugar de que capture video con la cam sea con la mi telefono es un android
ResponderEliminarHola mouse, esta página es excelente. Me gustan mucho tus tutoriales. Oye quisiera saber que tal esta la compatibilidad del JMF en linux. Supongo que por ser java es totalmente portable entre sistemas operativos.
ResponderEliminarSaudos desde Colombia!!
Existe una forma para que no aparezca el formulario windows pidiendo el origen de video
ResponderEliminarHola Gracias Mouse he Hecho todo y me funciona perfecto, tengo un problema cuando me genera el jar no me reconoce nada de jmf no me sale para seleccionar la camara,
ResponderEliminarhe hecho de todo he copiado las librerias a la carpeta dist/lib y aun sigue el error , no se porque no me muestra la camara, pero desde netbeans si lo muestra todo, el problema es cuando genero el jar de la aplicacion, espero me ayudes, gracias
a alguien le funciono despues de generar el .jar..???
ResponderEliminarHola me podrías ayudar porfa, como hago para que me reconozca el tv tuner en vez de la cámara web?Graciasssssssssssssss
ResponderEliminarhola amigo, es posble ayudarme con algo de codigo de como puedo enviar el video en un correo atraves de php? es posible que me ayudes?
ResponderEliminaroye amigo, al ejecutar el proyecto no me sale ningún error, pero cuando ya me muestra la ventana en donde se supone tiene que verse la captura de la cámara, a mi me aparece esa ventana pero mostrándome un color fiusha, no se a que se deba o puede que sea a la versión del jdk??
ResponderEliminarAlguien sabe como implementarlo en mac os? para que reconozca la cámara??
ResponderEliminarmuy buena ayuda para nosotros que estamos aprendiendo el mundo de la programacion gracias...!
ResponderEliminar