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:
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.
Excelente video, felicitaciones buen trabajo me ha servido de gran ayuda
Hola Hector! Me alegra que te ayudará la entrada, saludos! 🙂
Hola que tal,de casualidad no hay un fobs4jmf de 64 bits?, Muchas gracias
No tienes de pronto los archivos de archivo mediaplayer.jar, sound.jar y jmr.jar. no los encuentro en la pagina de java
Esta bueno pero el problema es el fobs4jmf.dll
podrias hacer un video tutorial de un reproductor a 64 bits?
Gracias por tu video y tu ejemplo, me ha sido muy útil. Esa es la actitud.
Hola Omar! Me alegra que te funcionara 🙂
Saludos!
Muy interesante post, pero no funciona en maquinas con arquitectura de 64 bits
BUEN TRABAJO..!! solo esta pequeña duda…
Fobs4JMF – Native shared library NOT found
me sale ese error..
Me sale este error me podrias ayudar
No se puede encontrar un reproductor para: archivo: / G: / Drive / Files / campaña / 19S Pattern Angel.mp4
Podrías subir el jar de los frameworks en MEGA O DRIVE? porfa
Esque no me permite descargarlos 🙁
Excelente aporte, muy útil.
Perro tengo una duda:
¿Cómo se puede utilizar esto para reproducir videos almacenados en un servidor en internet?