Como hacer un reproductor de vídeo en java

reproductor de video en java

Hoy aprenderemos como hacer un reproductor de vídeo en java utilizando las librerías JMF y fobs4jmf, te explico el código necesario para el desarrollo de este reproductor, también aprenderemos como ir agregando vídeos a una lista de reproducción y poder desplazarnos entre ellos por medio de un par de teclas asignadas.

Previamente habíamos visto como empezar a programar en java, puedes revisar primero esta entrada si eres nuevo en este lenguaje de programación.

Lo que haremos el día de hoy es crear un reproductor de vídeo en java con el que podremos ir agregando vídeos a una lista de reproducción y fácilmente pasar al anterior o siguiente vídeo con ayuda de un par de teclas, el reproductor será a pantalla completa por lo cual podremos ocultar o mostrar el menú en cualquier momento con ayuda de una tecla asignada, también programaremos la funcionalidad de que al terminar de reproducirse un vídeo este vuelva a iniciar desde cero.

Te incluyo un vídeo para que visualices el funcionamiento final del reproductor de vídeo que aprenderemos a programar el día de hoy.

Como observación este ejemplo lo realice utilizando el IDE NetBeans 8.2 y el  jdk 1.8.0 de 32 bits.

Para iniciar es necesario que descargues un par de librerías que ocuparemos para el desarrollo del reproductor de vídeo en java, JMF (Java Media Framework ) y FOBS4JMF para soportar más formatos de audio y vídeo.

De la librería JMF necesitamos agregar a nuestro proyecto el archivo mediaplayer.jar,  sound.jar y jmr.jar.

De la librería fobs4jmf ocupamos únicamente incluir el archivo fobs4jmf y el dll con el mismo nombre, este último en la raíz de nuestro proyecto o en la carpeta de dlls del sistema.

Código para hacer un reproductor de vídeo en java

Antes que nada necesitamos una clase que herede de JFrame y que implemente KeyListener para la detección de teclas.

public class Reproductor extends JFrame implements KeyListener

Inicializamos las variables que ocuparemos a lo largo de este ejemplo, la variable Player será nuestro reproductor y necesitaremos 2 variables de tipo Component  para el vídeo y los controles, las variables de tipo char las utilizaremos para poder navegar entre vídeos y mostrar u ocultar el menú.

//PANEL
JPanel panel;
//REPRODUCTOR
Player mediaPlayer;
//COMPONENTE DE VIDEO
Component video;
//COMPONENTE DE CONTROLES
Component controles;

// INICIALIZAMOS VARIABLES NECESARIAS PARA CONSTRUIR EL MENU
JMenuBar jmb_barra;
JMenu jm_menu;
JMenuItem jmi_abrir;
JMenuItem jmi_salir;

//INICIALIZAMOS VARIABLES DE FILECHOOSER
JFileChooser fileChooser = new JFileChooser();
ArrayList<String> lista = new ArrayList();
int index = 0;

//INICIALIAMOS VARIABLES DE CONTROL
char anterior = 'a';
char siguiente = 'd';
char showMenu = 'w';

El constructor quedaría de la siguiente manera:

public Reproductor(){
        initMenu();
        init();
        //ESTABLECEMOS RUTA POR DEFECTO FILECHOOSER
        fileChooser.setCurrentDirectory(new File(System.getProperty("user.dir")));
    }

En el método initMenu  construimos nuestro menú y programamos los eventos para los elementos Abrir y Salir.

public final void initMenu(){
        // INICIALIZAMOS VARIABLES DE MENU
        jmi_abrir = new JMenuItem("Agregar video");
        jmi_abrir.setIcon(new ImageIcon(getClass().getResource("/resources/abrir.png")));
        jmi_salir = new JMenuItem("Salir");
        jmi_salir.setIcon(new ImageIcon(getClass().getResource("/resources/cerrar.png")));
        // INICIALIZAMOS NUESTRO MENU
        jm_menu = new JMenu("Menu");
        jm_menu.setIcon(new ImageIcon(getClass().getResource("/resources/menu.png")));
        // INICIALIZAMOS NUESTRA BARRA DE MENU
        jmb_barra = new JMenuBar();
        // AGREGAMOS NUESTROS ITEMS DE MENU A NUESTRO MENU
        jm_menu.add(jmi_abrir);
        jm_menu.addSeparator();
        jm_menu.add(jmi_salir);
        // AGREGAMOS NUESTRO MENU A NUESTRA BARRA DE MENU
        jmb_barra.add(jm_menu);
        // AGREGAMOS NUESTRA BARRA DE MENU A NUESTRO PROYECTO
        setJMenuBar(jmb_barra);
        jmb_barra.setVisible(false);
        
        // EVENTOS DE MENU
        jmi_salir.addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent evt){
                //TERMINAMOS EL SISTEMA
                System.exit(0);
            }
        });
        jmi_abrir.addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent evt){
                int resultado = fileChooser.showOpenDialog(Reproductor.this);
                //SI EL USUARIO SELECCIONO UN ARCHIVO
                if (resultado == JFileChooser.APPROVE_OPTION) {
                    File archivoSeleccionado = fileChooser.getSelectedFile();
                    lista.add(archivoSeleccionado.getAbsolutePath());
                    //SI ES EL PRIMER ARCHIVO SE COMIENZA A REPRODUCIR
                    if(lista.size() == 1){
                        reproducir();
                    }
                }
            }
        });
    }

En el método init  realizamos algunos ajustes más destacando el addKeyListener donde indicamos que nuestra misma clase se encargará de gestionar los eventos de tecla.

public final void init(){
       //CREAMOS UN CONTENEDOR
       panel = new JPanel();
       //DEFINIMOS LA FORMA EN QUE VA A CONTENER ELEMENTOS EL CONTENEDOR
       panel.setLayout(new BorderLayout());
       //AGREGAMOS EL CONTENEDOR A NUESTRA VENTANA
       add(panel); 
       //EVENTOS
       //AGREGAMOS EL EVENTO QUE DETECTA CUANDO PRESIONAMOS UNA TECLA - MAS ADELANTE LO IMPLEMENTAMOS CON KEYTYPED
       addKeyListener(Reproductor.this);
   }

El método reproducir  es donde se encuentra la funcionalidad principal de nuestro reproductor de vídeo en java, lo primero que hacemos es obtener la url del vídeo que deseamos reproducir y convertirla a un recurso MediaLocator, enseguida inicializamos nuestro reproductor en la variable mediaPlayer y obtenemos los componentes de vídeo y controles, posteriormente los agregaremos a nuestro panel principal al centro y sur respectivamente.

Es necesario que actualicemos la interfaz de nuestro panel y damos start para comenzar la reproducción de nuestro vídeo.

Mediante un evento de reproductor EndOfMediaEvent indicamos lo que se va a hacer cuando un vídeo llegue a su final, esto es, volver a reproducir el mismo vídeo regresando su tiempo de reproducción a cero.

public void reproducir(){
        try {
            //COMPROBAMOS SI NO HABIA INSTANACIAS DE PLAYER REPRODUCIENDO
            if(mediaPlayer!=null){
                mediaPlayer.stop();
            }
            // OBTENEMOS LA RUTA DE LA LISTA DE ARCHIVOS EN BASE A LA POSICION ACTUAL
            URL url = new URL("file:///"+lista.get(index));
            // CONVERTIMOS LA RUTA A RECURSO MEDIALOCATOR
            MediaLocator ml = new MediaLocator(url);
            //CREAMOS EL PLAYER Y LE ASIGNAMOS EL MEDIA LOCATOR
            mediaPlayer = Manager.createRealizedPlayer( ml );
            // OBTENEMOS LOS COMPONENTES DE VIDEO Y CONTROLES DEL REPRODUCTOR
            video = mediaPlayer.getVisualComponent();
            controles = mediaPlayer.getControlPanelComponent();
            //ELIMINAMOS CUALQUIER COMPONENTE QUE EXISTA EN EL CONTENDOR
            panel.removeAll();
            //AGREGAMOS LOS COMPONENTES DE VIDEO Y CONTROLES AL CONTENEDOR
            if ( video != null )
                panel.add("Center", video ); 
            if ( controles != null )
                panel.add( "South", controles ); 
            // DAMOS PLAY AL REPRODUCTOR
            mediaPlayer.start();
            // ACTUALIZAMOS LA INTERFAZ DEL CONTENEDOR PARA ACTUALIZAR CAMBIOS
            panel.updateUI();
            
            // EVENTOS DEL REPRODUCTOR
            mediaPlayer.addControllerListener(new ControllerListener(){
                @Override
                public void controllerUpdate(ControllerEvent ce) {
                    // SI EL EVENTO ES UNA INSTANCIA DE ENDOFMEDIA ES QUE TERMINO DE REPRODUCIR
                    if(ce instanceof EndOfMediaEvent) {
                        // REINICIAMOS EL VIDEO QUE SE REPRODUCIA
                        mediaPlayer.setMediaTime(new Time(0));
                        mediaPlayer.start();
                    }
                }                
            });
        } catch (Exception ex) {
            System.out.println(ex.getLocalizedMessage());
            JOptionPane.showMessageDialog(Reproductor.this, "Ocurrio un error al reproducir el archivo "+new File(lista.get(index)).getName(), "Atención", JOptionPane.ERROR_MESSAGE);
        }
    }

Como dijimos al comienzo nuestro reproductor de vídeo en java podrá irse al anterior vídeo con la tecla a  y al siguiente con la tecla d,  así como ocultar o mostrar el menú con la tecla w.

Para hacer esto comparamos la tecla presionada por el usuario con las teclas definidas por nosotros, en caso de que se presione la tecla w comprobamos si la barra de menú esta visible para hacerla invisible y viceversa.

Para el caso de vídeo anterior y vídeo siguiente ocupamos una variable llamada index, que también utilizamos para la lista de reproducción, misma que vamos aumentando o decrementando según la tecla pulsada.

public void keyTyped(KeyEvent e) {
        // SOLO HACEMOS ALGO SI LA LISTA DE REPRODUCCION TIENE ELEMNTOS
        System.out.println(e.getKeyChar());
        //SI SE PRESIONA LA TECLA ALT MUESTRA MENU O LO OCULTA
        if(e.getKeyChar() == showMenu){
            if(jmb_barra.isVisible()){
                jmb_barra.setVisible(false);
            }else{
                jmb_barra.setVisible(true);
            }                
        }else if(lista.size() > 0){
            //SI SE PRESIONA LA TECLA ANTERIOR SI MODIFICA EL INDEX Y SE MANDA A REPRODUCIR DE NUEVO
            if(e.getKeyChar() == anterior){
                if(index==0)
                    index = 0;
                else
                    index--;
                reproducir();
            }
            //SI LA SE PRESIONA LA TECLA SIGUIENTE SI MODIFICA EL INDEX Y SE MANDA A REPRODUCIR DE NUEVO
            if(e.getKeyChar() == siguiente){
                if((index+1) < lista.size())
                    index++;
                reproducir();
            }
        }else{
            //SINO HAY ELEMENTOS EN LA LISTA NOTIFICA AL USUARIO
            JOptionPane.showMessageDialog(Reproductor.this,"No hay elementos en la lista de reproducción.","Atención",JOptionPane.INFORMATION_MESSAGE);
        }
    }

Puedes descargar el código completo de este ejemplo en el siguiente enlace:

¡Comparte para acceder al contenido!image/svg+xml
Gracias por compartir este post en tu red social favorita.

Hoy aprendimos como hacer un reproductor de vídeo en java, ¿Que te pareció? ¿Esta increíble no?, déjame saber tus comentarios y no olvides compartirlo con tus amigos, conocidos o cualquier persona a la que creas que le puede ser de utilidad esta entrada.

12 thoughts on “Como hacer un reproductor de vídeo en java

  1. Me sale este error me podrias ayudar
    No se puede encontrar un reproductor para: archivo: / G: / Drive / Files / campaña / 19S Pattern Angel.mp4

  2. Excelente aporte, muy útil.
    Perro tengo una duda:
    ¿Cómo se puede utilizar esto para reproducir videos almacenados en un servidor en internet?

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *