18/12/09

Reproducir video en java y netbeans con Java Media Framework

Reproducir un video en java no es imposible menos tan complicado como parece, ademas java nos proporciona herramientas para desarrollar nuestras aplicaciones. Basta de charla y vamos a lo que interesa.

¿que necesitamos?

  • Necesitamos el API multimedia de java llamado Java Media Framework, descargate la ultima version de su pagina, instalalo y reinicia la pc.
  • Netbeans claro, sera nuestra herramienta para desarrollar la aplicacion de prueba.
  • Un archivo de video con extension MPG, segun lei, la api de java JMF es capaz de reproducir varios tipos de formatos, en mi caso solo reprodujo MPG y MP3, las causas no lo se aun.
El reproductor

El reproductor consta de una clase videopanel,java encargada de crear el objeto reproductor y de una clase reproductor,java, nuestra interfaz.

Codigo fuente

Clase videopanel.java


package videojava;
import java.awt.Component;
import java.awt.Dimension;
import java.io.IOException;
import java.net.URL;
import javax.media.CannotRealizeException;
import javax.media.Manager;
import javax.media.NoPlayerException;
import javax.media.Player;
/**
 * @web http://jc-mouse.blogspot.com/
 * @author mouse
 */
public class videopanel extends javax.swing.JPanel {
private Player mediaPlayer;
private Component controls;        
    
    public videopanel(URL mediaURL, Dimension d){
        Manager.setHint( Manager.LIGHTWEIGHT_RENDERER, true );
         try
            {
         // crea un reproductor especificando la direccion del archivo
         mediaPlayer = Manager.createRealizedPlayer( mediaURL );         
         // optiene los componentes del video
         Component video2 = mediaPlayer.getVisualComponent();
         video2.setSize(d.width, d.height);         
         video2.setVisible(true);
         //optiene los componentes de control del reproductor
         controls = mediaPlayer.getControlPanelComponent();
         controls.setSize(d.width, 24);
         
         if ( video2 != null )            
            add( video2 ); //agrega el componente del reproductor al panel 
         
         mediaPlayer.start(); // comienza la reproduccion
      } // fin try
      catch ( NoPlayerException noPlayerException )
      {
         System.err.println( "No se encontro medio disponible, osea no se reproduce archivo" );
      } // fin catch
      catch ( CannotRealizeException cannotRealizeException )
      {
         System.err.println( "no se pudo realizar el reproductor" );
      } // fin catch
      catch ( IOException iOException )
      {
         System.err.println( "Error de lectura del archivo" );
      } // fin catch
    }
    
    public Component controles (){     
        return controls;        
    }
    
    public Component controles(Dimension d){
        controls.setSize(d);
        return controls;
    } 
}

Esta clase hace uso del API JMF y la extiende hasta un objeto, en este caso un jPanel, pasando como referencias la URL del video en cuestion, tratando de capturar los errores que se pudieran encontrar en el proceso, el codigo esta por demas comentado y creo que se entiende.

La interfaz
La interfaz del reproductor es sencilla, consta de un jpanel pantalla, lugar donde insertaremos el video, un jpanel control donde se localizara los controles del reproductor, jButton abrir y jTextfiel txturl

Las partes mas importantes del codigo son:

Este codigo debe añadirse en el objeto jButton "abrir" con el evento ActionPerformed, lo que hace es llamar a una ventana de dialogo para buscar el archivo y luego inicializar los objetos reproductor y controles

URL mediaURL = null;
videopanel mediaPanel;

private void abrirActionPerformed(java.awt.event.ActionEvent evt) {                                      
       JFileChooser fileChooser = new JFileChooser();
       int result = fileChooser.showOpenDialog(null);  
        if ( result == JFileChooser.APPROVE_OPTION ){
            try {           
                //se asigna a mediaURL el archivo de video seleccionado
                mediaURL = fileChooser.getSelectedFile().toURL();
                txturl.setText("" + mediaURL); 
                //se obtiene el tamaño del panel de video
                Dimension dp = new Dimension(pantalla.getWidth(), pantalla.getHeight());
                //se crea el reproductor pasando como parametros
                // el archivo y dimensiones
                mediaPanel = new videopanel( mediaURL ,dp );           
                pantalla.add(mediaPanel);            
                pantalla.setVisible(true);
                //se obtiene dimensiones del contenedor de los controles
                // y se pasa como parametro para crear los controles de reproduccion
                Dimension d = new Dimension(control.getWidth(),control.getHeight());
                control.add(mediaPanel.controles(d));            
                control.setVisible(true);            
            } 
            catch (IOException ex) {
                Logger.getLogger(reproductor.class.getName()).log(Level.SEVERE, null, ex);
            } 
        }
    }                



Para descargarte el proyecto de ejemplo
Click para descargar

43 comentarios:

  1. Gracias...lo pruebo y comento!!

    Salu2!

    ResponderEliminar
  2. Funciona de maravilla como aplicación...lastimosamente no sirve como applet...me tire un buen tiempo convirtiendolo...y al final el JFileChooser no se carga en el navegador por ende nunca reproduce.

    pero creo que creando un metodo como el getURL y pasandole la dirección directamente sin tener que abrir el dialogo para escoger el archivo debe funcionar en el navegador.

    Salu2!

    ResponderEliminar
  3. Que tal buen día: Me pareció un excelente aporte, realice mi aplicación con las instrucciones indicadas, al momento de ejecutar la aplicación y cargar el archivo me marca un error, no entiendo porque ya que lo hice tal y como dicen las indicaciones, por lo tanto descargue el proyecto y ohhhh sorpresa sale el mismo error en el mismo lugar, les pido de su apoyo el error me sale en la línea de código de la clase videopanel la línea 27: video2.setSize(d.width, d.height);


    Atte: SUSY

    ResponderEliminar
  4. Sergio no hice la prueba en un applet pero yo creo que si puede funcionar como dices, haber si tengo tiempo lo intento

    Susy dime cual es el error que te sale y con gusto te ayudo

    ResponderEliminar
  5. Hola mouse:

    El error que me genera es:
    Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException

    Gracias por la ayuda

    Atte:
    SUSY

    ResponderEliminar
  6. gracias por toda la ayuda que tienes
    Att.
    Didi

    ResponderEliminar
  7. excelente tutorial muchas gracias, ahora quisiera saber cómo hago para poder agregar varios videos al playlist y otra pregunta en la documentación del JMF he leido que soporta el formato .avi pero he tratado de reproducir videos con este formato y me sale error... qué puede estar pasando....

    ResponderEliminar
  8. A mi me escupe el mismo error que a susi, eso si, lo estoy ejecutando en eclipse. gracias por adelñantado, si consigo hacerlo funcionar te lo paso dentro de un applet.

    ResponderEliminar
  9. Gracias por el aporte, tengo una pregunta: solo funciona para mpg? he probado con otros formatos y no puedo reproducir el video. Gracias nuevamente.

    ResponderEliminar
  10. el API dice que si se puede, habria que experimentar

    ResponderEliminar
  11. Ke tal use estos pasos para armar un karaoke ... el problema que tengo es que el media player solo me permite ejecutarlo 10 veces ... en la 11 al parecer lo reproduce pero no se ve en el panel "pantalla" ... algo para poder reparar esto y pueda reproducir indefinidamente ?

    ResponderEliminar
  12. como van mi inconveniente es el siguiente cuando compilo en netbeans el video con los controles salen bien pero en el momento de crear el .jar la ventana sale vacía y no he dado con el problema, por favor alguien tiene alguna idea?
    gracias

    ResponderEliminar
  13. hola ta muy bueno el tuto pero tengoun problema sale error en javax.import.media.Manager; y en import javax.media.player; bueno si me puedes echar la mano por que sale eso xf

    ResponderEliminar
  14. REQUIEM: no entiendo eso de que solo te permite ejecutarlo 10 veces, yo me hice un reproductor de mp3 y lo uso casi todo el dia y ningun problema de limites

    anonimo1: si lo compilas como esta en el ejemplo, no hay problemas, fijate en los repaint()

    anonimo2: ese error se debe a que no encuentra las APIS, fijate que los hayas instalado correctamente

    ResponderEliminar
  15. Le daré una revisada a tu código me gusta buscarle fallos a todo jeje no te ofendas si encuentro algunos y los corrija te dejo mi web http://jonathan-palomino.blogspot.com/ ahi tengo temas orientados a java

    ResponderEliminar
  16. hola mouse ...
    me podrías ayudar en instalar el jmf en fedora 14 ....
    e podido en ubuntu y en windows pero en fedora no puedo....

    ResponderEliminar
  17. A MI NO ME SALE ERROR!!! PORQUE YO SI SE DOND ESTA EL ERROR.!!! PERO LO MALO ESTA EN KE NO VISUALIZO NADA...!!!! SOLO ESCUCHO LO KE DICEN NOMAS...!!! PON EL METODO PARA VISUALIZARLO ..T_T

    ResponderEliminar
  18. hola amigo tengo un problema medio raro. Utilicé tu código para cargar un vídeo.

    Mi aplicación tiene un panel donde reproduce este vídeo y en otro panel muestra unos números de la bdd, pues bien cuando agregan un nuevo número a la bdd este cambia y cambia en el panel, el problema se da en el vídeo parece como que se descuadra, como que se va a la mitad y se hace más pequeño, porque es este problema???

    Espero tu valiosa ayuda.

    dejo un video para ser mas explicito.

    http://www.youtube.com/watch?v=rIxdnEsIRE8&feature=player_embedded

    ResponderEliminar
  19. ivlecamo84 aqui tienes la respuesta a tu error:

    http://jc-mouse.blogspot.com/2010/03/respuesta-redimensionar-el-video-en-jmf.html

    espero te sirve, sino avisas

    ResponderEliminar
  20. hola!! sq tengo un problema con esto:
    import javax.media.CannotRealizeException;
    import javax.media.Manager;
    import javax.media.NoPlayerException;
    import javax.media.Player;
    como lo puedo corregir?
    gracias

    ResponderEliminar
  21. Pues parece que no se manejar java
    intente con el codigo ya no salen errores pero no me reconoce la camara pues ejecuta y no hace nada me podrias ayudar

    ResponderEliminar
  22. Richard: cual es el error que te sale ?

    mmmmmmmmm medio raro tu problema, talvez sea algo externo a java, prueba con otro sistema operativo,. otra camara , talvez ese sea el error

    ResponderEliminar
  23. Excelente aporte..funcionó
    totalmente y esta bastante claro..
    mil gracias

    ResponderEliminar
  24. buenas

    como se puede hacer el auto loop

    gracias

    ResponderEliminar
  25. BIEN FUNCIONA , EN EL APPLET BASTA CON FIRMARLO Y A DISFRUTAR: =)

    ResponderEliminar
  26. hola que al amigo..cheque tu aplicacion de video..e intente realizarlo...pero me arroja este error:
    Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at videopanel.Videopanel.(Videopanel.java:37)
    at videopanel.reproductor.abrirActionPerformed(reproductor.java:140..etc...
    podrias decirme como solucionarlo...de antemano gracias...

    ResponderEliminar
  27. gracias x compartir tus conocimientos :D

    ResponderEliminar
  28. que tal?.....al realizar el proeycto del reproductor de video...arroja el siguiente error:

    Unable to handle format: MPEG, 352x288, FrameRate=25.0, Length=152064

    a que se debe?..como corregirlo?..basicamente...la imagen es la que no ve...pero si tiene sonido...espero puedas ayudarme..de antemano gracias..

    ResponderEliminar
  29. si la imagen no se ve pero si el sonido, prueba con videos diferentes, el error te dice que no puede leer el formato de video que quieres reproducir

    ResponderEliminar
  30. Como hago para que al abrir otro video lo reproduzca (no solo el audio) sino que si habia algo reproduciendose lo detenga y reproduzca el nuevo video que se selecciono, gracias

    ResponderEliminar
  31. necesito que el video sea uno de internet. que la url sea de un video de internet como de youtube o algo asi. se puede hacer??

    ResponderEliminar
  32. Agradeceria que subas el tuto del reproductor Mp3

    ResponderEliminar
  33. Tengo un problema, cuando me genero un loop de videos llega al 9 o 10 y la pantalla se queda en negro y el componente de reproducción avanza, pero no muestra ninguna imagen ni sonido.
    No estoy usando el JChose, sino que le mando las ubicaciones de los videos.

    cualquier ayuda les agradecería mucho.

    ResponderEliminar
  34. antes de reproducir un archivo, debes verificar que no exista otro video en reproudccion, si existiera, antes debes detenerlo y reproducir el siguiente

    ResponderEliminar
  35. Estimado JC mouse, muchas gracias por tu aporte, tu siempre nos ayudas...

    Quiero consultarte una cosa...
    Talvez el disco duro o la mainboard influyen en la libreria Java Media Framework te comento mi problema:

    Tengo un maquina Gygabyte Atom 1.6, Disco de segate 500gb, ram de 2gb y so Win 7 de 4bits.

    Instalo la librería JMF en el pc y se instala correctamente, pero al ejecutar me da un erro de Exception, que no existe la libreria, etc... este error me da en la gygabyte porque en otra compu funciona la aplicación correctamente... solo en esta maquina me da este error, cambie de sistema operativo a win 7 32 bits, win xp y nada, este error es raro (No te pongo el error porque estoy formateando nuevamente la máquina), entonces investigando y probando en otras maquinas llegué a la conclusión que es la maindboar o el disco... En fin, tu crees que esto puede ser posible?

    ResponderEliminar
  36. Este es el error que me da, a pesar que está correctamente instalado el JMF:

    C:\Users\Jhona>java -jar "C:\SEAP_DISPLAY\BCE-SEAPDisplay.jar"
    Conexi¾n a BDD (localhost) jdbc:mysql://localhost/seap ... Ok
    Conexi¾n BDD con DISPLAY ABIERTA
    Contados Timer: 1
    Exception in thread "AWT-EventQueue-0" java.lang.NoClassDefFoundError: javax/med
    ia/NoPlayerException
    at display.display.reproducirvideo(display.java:844)
    at display.display.(display.java:48)
    at display.display$19.run(display.java:1521)
    at java.awt.event.InvocationEvent.dispatch(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access$200(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Sour
    ce)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)
    Caused by: java.lang.ClassNotFoundException: javax.media.NoPlayerException
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    ... 17 more
    Exception in thread "Timer-0" java.lang.NullPointerException
    at display.display$18.run(display.java:1189)
    at java.util.TimerThread.mainLoop(Unknown Source)
    at java.util.TimerThread.run(Unknown Source)

    ResponderEliminar
  37. Buenas!! :D

    Al compilar el código que esta para descargar me salen los siguientes errores y de verdad no se como corregirlo!

    Si alguien me puede ayudar se los agradecería muchísimo.

    Gracias

    Unable to handle format: MPEG, 320x240, FrameRate=25.0, Length=115200
    Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at videojava.videopanel.(videopanel.java:27)
    at videojava.reproductor.abrirActionPerformed(reproductor.java:140)
    at videojava.reproductor.access$100(reproductor.java:12)
    at videojava.reproductor$2.actionPerformed(reproductor.java:59)
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
    at java.awt.Component.processMouseEvent(Component.java:6290)
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
    at java.awt.Component.processEvent(Component.java:6055)
    at java.awt.Container.processEvent(Container.java:2039)
    at java.awt.Component.dispatchEventImpl(Component.java:4653)
    at java.awt.Container.dispatchEventImpl(Container.java:2097)
    at java.awt.Component.dispatchEvent(Component.java:4481)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4575)
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4236)
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4166)
    at java.awt.Container.dispatchEventImpl(Container.java:2083)
    at java.awt.Window.dispatchEventImpl(Window.java:2482)
    at java.awt.Component.dispatchEvent(Component.java:4481)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:648)
    at java.awt.EventQueue.access$000(EventQueue.java:84)
    at java.awt.EventQueue$1.run(EventQueue.java:607)
    at java.awt.EventQueue$1.run(EventQueue.java:605)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:98)
    at java.awt.EventQueue$2.run(EventQueue.java:621)
    at java.awt.EventQueue$2.run(EventQueue.java:619)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:618)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

    ResponderEliminar
  38. ya intentaste con otros formatos de videos

    ResponderEliminar
  39. Amigo Mouse, Tengo un error no encuentra la clase Manager, en si el paquete Javax.media y he intentado conseguirlo pero no lo encuentro en ningun jdk utilizo neat beans 7.3

    ResponderEliminar
  40. ¿tienes el JMF instalado?

    ResponderEliminar
  41. me funciona de maravilla pero kiero reproducir otros formatos de video se podra?? si es haci me gustaria q me diga el codigo para poder hacer esto....

    ResponderEliminar
  42. Hola JC-MOUSE he intentado realizar la aplicación e incluso descargue la que tu realizaste y aún no logro que me funcione, descargué e instalé el JMF 2.1.1e y ya agregué los .jar de ese framework y ya he intentado con formatos mpg, avi y mov y ninguno me ha funcionado y en el error me sale lo siguiente:

    Unable to handle format: MPEG, 640x360, FrameRate=25.0, Length=345600
    Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at videojava.videopanel.(videopanel.java:27)

    espero puedas ayudarme, gracias

    ResponderEliminar
  43. men quisiera saber como reproducir vídeos pero sin necesidad de buscarlos manual mente osea que envés de abrir esas sub ventanas solo fuera colocando la ubicacion del video por ejemplo algo asi " C:\Users\HP\Desktop\video.mpg" men porfa contesteme es que lo nesecito urgente

    ResponderEliminar