Reproducir ficheros mp3 con JLayer en Java

Hola a todos, hoy os explicare como podemos reproducir ficheros de audio como mp3 en Java.

Lo primero que necesitaremos es el siguiente jar. Pincha aquí para descargarlo.

Este jar lo guardaremos donde queramos, lo recomendable es guardarlo dentro del proyecto.

Ahora en Eclipse, hacemos lo siguiente:

  • Seleccionamos el proyecto que donde queramos usar este jar.
  • Pinchamos en Project -> Properties -> Java Build Path.
  • Pinchamos en el botón “Add External JARs”
  • Buscamos el fichero jar.
  • Aceptamos.

anadir JAR

Ahora, debemos importar dos clases, las siguientes:

  • javazoom.jl.decoder.JavaLayerException;
  • javazoom.jl.player.Player;

La clase que usaremos se llama Player, al que le pasaremos un FileInputStream como parámetro. También es necesario que controlemos las siguientes excepciones:

  • JavaLayerException
  • IOException

Aquí os dejo un ejemplo, hecho en netbeans:

package reproductor;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import javazoom.jl.decoder.JavaLayerException;
import javazoom.jl.player.Player;

/**
 * @author DiscoDurodeRoer
 */
public class Reproductor extends javax.swing.JFrame {

    /**
     * Creates new form Reproductor
     */
    public Reproductor() {
        initComponents();
    }

    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        btnReproducir = new javax.swing.JButton();
        lblReproductor = new javax.swing.JLabel();
        txtReproductor = new javax.swing.JTextField();
        btnElegir = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        btnReproducir.setText("Reproductor");
        btnReproducir.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnReproducirActionPerformed(evt);
            }
        });

        lblReproductor.setText("Reproductor");

        btnElegir.setText("jButton2");
        btnElegir.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnElegirActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap(46, Short.MAX_VALUE)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                        .addComponent(lblReproductor)
                        .addGap(18, 18, 18)
                        .addComponent(txtReproductor, javax.swing.GroupLayout.PREFERRED_SIZE, 331, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(18, 18, 18)
                        .addComponent(btnElegir, javax.swing.GroupLayout.PREFERRED_SIZE, 31, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(20, 20, 20))
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                        .addComponent(btnReproducir)
                        .addGap(200, 200, 200))))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap(77, Short.MAX_VALUE)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(lblReproductor)
                    .addComponent(txtReproductor, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(btnElegir))
                .addGap(30, 30, 30)
                .addComponent(btnReproducir)
                .addGap(53, 53, 53))
        );

        pack();
    }// </editor-fold>                        

    private void btnElegirActionPerformed(java.awt.event.ActionEvent evt) {                                          

        JFileChooser fc=new JFileChooser();
        int seleccion=fc.showOpenDialog(this);
        if(seleccion==JFileChooser.APPROVE_OPTION){
            File fichero=fc.getSelectedFile();
            txtReproductor.setText(fichero.getAbsolutePath());
        }

    }                                         

    private void btnReproducirActionPerformed(java.awt.event.ActionEvent evt) {                                              

        //Creamos el FileInputStream con la ruta del fichero de audio
        try(FileInputStream fis=new FileInputStream(txtReproductor.getText())){
            //Creamos el objeto Player
            Player player=new Player(fis);
            //Reproducimos el fichero, una vez lo haga no podremos hacer nada hasta que termine<br /><br />
            player.play();
        }catch (JavaLayerException e1) {
            JOptionPane.showMessageDialog(this, "No es un fichero de audio");
        }catch (IOException ex) {
            Logger.getLogger(Reproductor.class.getName()).log(Level.SEVERE, null, ex);
        }

    }                                             

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(Reproductor.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(Reproductor.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(Reproductor.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(Reproductor.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new Reproductor().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify
    private javax.swing.JButton btnElegir;
    private javax.swing.JButton btnReproducir;
    private javax.swing.JLabel lblReproductor;
    private javax.swing.JTextField txtReproductor;
    // End of variables declaration
}

Pincha aquí para descargar el ejemplo para importar a tu IDE. Si usas eclipse puedes copiar las partes del código.

Si pruebas el código anterior y seleccionas un fichero de audio, veras que se reproduce pero no podemos hacer nada hasta que acabe la canción. Esto se debe a que debemos programar hilos, que es lo que se conoce como programación multihilo, lo veremos mas adelante.

Espero que os sea de ayuda. Si tenéis dudas, preguntad. Estamos para ayudarte.

Etiquetas

2 comments

  1. No me funciona, :-(, estoy usando netbens y lo cierto es que soy muuuuy novato, acabo de arrancar :-).
    Me he descargado lo que indicas, supongo que tambien me tengo que descargar el jar que indicas al principio, pero donde lo pongo?
    los errores son en:
    import javazoom.jl.decoder.JavaLayerException;
    import javazoom.jl.player.Player;

  2. Solucionado, solo tenia que leer un poco mejor :-)
    Hay que añadir el jar al projecto, en netbean es:

    Boton derecho en libreria: Libraries>Add Jar/Folder

    Muchas gracias, es un muy buen comienzo, a ver si consigo lo que quiero

Deja un comentario

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