Más de JMF: reproduciendo vídeo
Hace unos días recibí un mensaje de alguien que había leído mi post anterior sobre JMF y las capturas de imágenes a través de la webcam y me exponía que tenía problemas para reproducir unos ficheros de vídeo en formato AVI dentro de una aplicación, mensaje que leí ayer y que despertó mi curiosidad.
Sé que no debería hacerlo, que debería dedicarme sólo a estudiar, pero esta tarde tenía "mono" de escribir algo de código, así que aproveché para hacer un descanso en mis estudios y ponerme manos a la obra. La vez anterior no me había parado en el tema de la reproducción de vídeo, únicamente había mirado cosas sobre la captura de imágenes, así que me puse a investigar y en unas horas conseguí finalizar un pequeño programilla similar al anterior que permite seleccionar un fichero de vídeo y reproducirlo. Lo más destacable es la facilidad con la que JMF permite hacer este tipo de cosas, creo que la cantidad de código específico del framework necesaria para visualizar el vídeo son unas cinco o seis líneas !! el resto lo utilizo como siempre para hacer un programa algo presentable (dentro de lo que me permite mi pésimo sentido de la estética) y listo para copiar-pegar-ejecutar. Básicamente lo que hago es hacer uso del java bean MediaPlayer, ponerlo en un marco y pasarle el fichero que quiero reproducir.
Aunque el hecho de pegar el código hace que el post quede excesivamente extenso y "feo", creo que es algo conveniente porque permite a la gente llegar a él a través de google (como ha pasado con el anterior programa). Me he decidido por adjuntar la aplicación "completa" y no sólo fragmentos de código para permitir que el que esté interesado pueda probar el programa fácilmente y luego examinarlo si lo desea. Así que ya sabeis, los interesados en añadir vídeo a vuestras aplicaciones java y queréis probar el código solo tenéis que instalar el JMF, copiar, pegar y a trastear (Ojo, yo he utilizado el jdk 1.4.1).
Aquí está el código:
import javax.swing.*;
import javax.swing.event.*;
import javax.media.*;
import javax.media.bean.playerbean.*;
import java.io.*;
import java.awt.*;
import java.awt.event.*;
public class reproductorVideo extends JFrame implements ActionListener,ControllerListener {
MediaPlayer mp1 = null;
String archivo = null; //nombre del archivo a reproducir
JButton botonReproducir = null;
JButton botonSeleccionar = null;
JLabel seleccion = null;
JPanel panelVisor = null;
JPanel panelBotones = null;
JPanel panelEtiqueta = null;
public static void main(String[] args) throws Exception{
reproductorVideo rep = new reproductorVideo();
rep.marco();
}
public synchronized void controllerUpdate(ControllerEvent event) {
if (event instanceof RealizeCompleteEvent) {
// de esta manera nos aseguramos que el panel se actualice cuando comienza la reproduccion
panelVisor.revalidate();
}
}
public void marco() throws Exception{
botonReproducir = new JButton();
botonReproducir.setText("reproducir");
botonReproducir.setSize(100,40);
botonReproducir.addActionListener(this);
botonSeleccionar = new JButton();
botonSeleccionar.setText("seleccionar fichero");
botonSeleccionar.setSize(100,40);
botonSeleccionar.addActionListener(this);
seleccion = new JLabel();
seleccion.setText("Fichero seleccionado: "+archivo);
panelBotones = new JPanel();
panelBotones.add(botonReproducir,BorderLayout.EAST);
panelBotones.add(botonSeleccionar,BorderLayout.WEST);
panelEtiqueta = new JPanel();
panelEtiqueta.add(seleccion,BorderLayout.NORTH);
//creamos el reproductor
mp1 = new javax.media.bean.playerbean.MediaPlayer();
mp1.addControllerListener(this);
panelVisor = new JPanel();
panelVisor.add(mp1,BorderLayout.NORTH);
this.getContentPane().add(panelVisor,BorderLayout.NORTH);
this.getContentPane().add(panelEtiqueta,BorderLayout.CENTER);
this.getContentPane().add(panelBotones,BorderLayout.SOUTH);
this.setSize(600,500);
this.setVisible(true);
panelVisor.revalidate();
this.getContentPane().validate();
}
public void actionPerformed(ActionEvent e) {
String ac = e.getActionCommand();
if (ac.equals("reproducir")){
if (archivo != null){
// le decimos que archivo tiene que reproducir
mp1.setMediaLocation(archivo);
mp1.start();
}
else{
seleccion.setText("Debe seleccionar un fichero para poder reproducirlo");
panelEtiqueta.revalidate();
}
}
if (ac.equals("seleccionar fichero")){
JFileChooser chooser = new JFileChooser();
chooser.setCurrentDirectory(new File("."));
int result = chooser.showOpenDialog(null);
Integer i = new Integer(chooser.APPROVE_OPTION);
if (i != null) {
archivo = "file://"+chooser.getSelectedFile().getAbsolutePath();
seleccion.setText("Fichero seleccionado: "+archivo);
panelEtiqueta.revalidate();
}
}
}
}


