Capturar webcam con VB.NET

¿Que haremos? Crearemos una aplicación en Visual Studio, la cual hará uso de una webcam para capturar el video en frames independientes y depositarlos en memoria para despues mostralos al usuario a través de un picturebox y un Timer para crear la ilusión de movimiento. ¿Porque lo haremos? Porque es justo y necesario ¿Que necesitamos? [...]

Envío de correo con JavaMail/Netbeans

JavaMail es una expansión de Java que facilita el envío y recepción de e-mail desde código java. JavaMail implementa el protocolo SMTP (Simple Mail Transfer Protocol) así como los distintos tipos de conexión con servidores de correo -TLS, SSL, autentificación con usuario y password, etc [Según SantaWikipedia] ¿Qué necesitamos? JavaMail 1.4.5 Java y Netbeans 6.9 [...]

Proyecto de base de datos Firebird VB

En este proyecto realizaremos una aplicación de base de datos Firebird con el lenguaje de programación de Visual Basic de Microsoft, este proyecto tendrá las funciones básicas de gestión INSERT, DELETE, UPDATE y una interfaz de usuario para utilizarlas. ¿Que necesitamos? Visual Studio 2008 o superior Firebird última versión Firebird ADO.NET Data Provider. Conocimientos básicos [...]

Imprimir imagen con Print

La siguiente clase hace uso de PRINT para imprimir una imagen que se encuentra en un variable de tipo FileInputStream, esta clase a su vez es implementada desde una interfaz que hace fácil su uso, la clase así como todo el proyecto esta comentado. import java.io.File; import javax.print.Doc; import java.io.IOException; import javax.print.DocFlavor; import javax.print.SimpleDoc; import java.io.FileInputStream; [...]

Code Army Bolivia

5/3/11

Capturar video de una webcam con JMF

JAN29


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
IDE: Netbeans 6.9.1
Click para descargar
Recuerda si te bajas el Codigo Fuente, esta bien, aprenderas, pero si realizas el proyecto tu solo, aprenderas mucho mejor

32 comentarios:

Unknown dijo...

Hola
Oye 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

Mouse dijo...

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 :

http://jc-mouse.blogspot.com/2011/03/jmf-buscar-dispositivos.html

asi podras configurar tu camara con JMF

saludos

Pablo dijo...

hola amigo... tengo una consulta que hacerte y ojala puedas ayudarme

al 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

Anónimo dijo...

Tendras algo sobre system tray en netbeans?

Anónimo dijo...

Hol quiero felicitarte por tu excelente trabajo hasta ahora con tu blogger.
Hace 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. (=

RM dijo...

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:

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

Julio Quintana dijo...

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

Mouse dijo...

Varias personas ya me dijeron que winseven no es totalmente compatible con JMF, supongo que habra que esperar a que actualicen el API

RM: ese es un problema con el dispositivo, verifica que JFM reconoce tu camara

Julio: nuevos codigos desde la siguiente semana :)

Oscar Bermudez dijo...

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

Krïst007 dijo...

Pero 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.
thanx

PC SOLUCIONES Y TECNOLOGIAS dijo...

ola sera que jmf funcionan para tramitir tv en vivo por medio de una tarjeta de video

Cristhian Sanchez dijo...

Hola 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??.

Manfredo dijo...

Como podria implementarlo en un jsp ya q tengo un formulario donde capturo los datos del empleado y quiero tomarle la foto

Anónimo dijo...

Buena tarde mouse una pregunta,como podría grabar lo que se está capturado en el video,por ejemplo para que quedé grabado como. .avi

Iwan dijo...

Hola, 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:

La 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");

Anónimo dijo...

Creeme que cunado pruebo tu codigo, al compilarlo netbeans me vota una exepcion como esta:


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)

Aclaro uso netbeans 7

Mouse dijo...

JMF tiene errores con windows seven

Unknown dijo...

Hola Mouse!

Sabés qué dispositivo debo usar para MAC OS? O cómo configurar el jmfRegistry para que reconozca la cámara built-in iSight?
Gracias!

jc mouse dijo...

lo siento, ni idea de como usar en MAC

Anónimo dijo...

Muy buen post Mouse!!

Tengo 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!!!

gggg dijo...

Dejo una pequeña colección de videotutoriales sobre el uso de la webcam con el JMF para al que le pueda interesar.
Videotutoriales sobre la webcam en Java

jc mouse dijo...

a pillin te vi haciendo spam :)

buenos videos recomendado :)

Anónimo dijo...

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

Bayron Ortiz dijo...

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


Saudos desde Colombia!!

Anónimo dijo...

Existe una forma para que no aparezca el formulario windows pidiendo el origen de video

Unknown dijo...

Hola 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,
he 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

Unknown dijo...

a alguien le funciono despues de generar el .jar..???

Anónimo dijo...

Hola me podrías ayudar porfa, como hago para que me reconozca el tv tuner en vez de la cámara web?Graciasssssssssssssss

rodolfo dijo...

hola 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?

Anónimo dijo...

oye 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??

Roberto dijo...

Alguien sabe como implementarlo en mac os? para que reconozca la cámara??

Anónimo dijo...

muy buena ayuda para nosotros que estamos aprendiendo el mundo de la programacion gracias...!

Post recomendado