¿Juega .mp3 y .wav en Java?


105

¿Cómo puedo reproducir un archivo .mp3y un .wavarchivo en mi aplicación Java? Estoy usando Swing. Intenté buscar en Internet algo como este ejemplo:

public void playSound() {
    try {
        AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(new File("D:/MusicPlayer/fml.mp3").getAbsoluteFile());
        Clip clip = AudioSystem.getClip();
        clip.open(audioInputStream);
        clip.start();
    } catch(Exception ex) {
        System.out.println("Error with playing sound.");
        ex.printStackTrace();
    }
}

Pero esto solo reproducirá .wavarchivos.

Lo mismo con:

http://www.javaworld.com/javaworld/javatips/jw-javatip24.html

Quiero poder reproducir .mp3archivos y .wavarchivos con el mismo método.


1
Parece que necesitará algún tipo de complemento. JMF debería tener lo que necesitas. oracle.com/technetwork/java/javase/tech/index-jsp-140239.html
Otra

Bueno, no estoy seguro de cómo usar estas cosas, nunca las había usado antes. ¿Cómo puedo implementarlo, cómo puedo usarlo?
Stan

JFM se abandonó en 2003. No se recomienda que lo utilice.
Joshreesjones

3
Vale la pena señalar que, en un mainmétodo, es necesario agregar un Thread.sleeppara escuchar el sonido, o de lo contrario el programa terminará antes de que eso suceda. Una forma útil de hacerlo es:Thread.sleep(clip.getMicrosecondLength() / 1000);
André Valenti

Respuestas:


119

Java FX tiene MediayMediaPlayer clases que reproducirán archivos mp3.

Código de ejemplo:

String bip = "bip.mp3";
Media hit = new Media(new File(bip).toURI().toString());
MediaPlayer mediaPlayer = new MediaPlayer(hit);
mediaPlayer.play();

Necesitará las siguientes declaraciones de importación:

import java.io.File;
import javafx.scene.media.Media;
import javafx.scene.media.MediaPlayer;

5
recurso URL final = getClass (). getResource ("a.mp3");
Neil

44
esto no me funciona en absoluto. dice que las importaciones no existen. y estoy ejecutando Java 7 ...
PulsePanda

9
stackoverflow.com/questions/15149547/… Parece que necesita agregar manualmente la biblioteca javafx desde dentro de la carpeta Java 7 si usa Eclipse.
Gyurme

7
Técnicamente, Mediay MediaPlayerno son clases de Java , sino clases de JavaFX . Para agregar soporte de mp3 a Java en OS X o Windows, es posible que desee buscar en SampledSP . Y sí, escribí esas bibliotecas.
Hendrik

8
No olvide que también debe inicializar javaFX para que esto funcione. stackoverflow.com/questions/14025718/…
user738048


18

puedes jugar .wav solo con java API:

import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;

código:

AudioInputStream audioIn = AudioSystem.getAudioInputStream(MyClazz.class.getResource("music.wav"));
Clip clip = AudioSystem.getClip();
clip.open(audioIn);
clip.start();

Y juega .mp3 con jLayer


4
Esto está mal. Java reproducirá otros formatos de contenedor además de wav. Además, wav es un formato contenedor que incluso puede contener mp3. Entonces Java no puede reproducir todos los archivos wav.
Radiodef

15

Ha pasado un tiempo desde que lo usé, pero JavaLayer es excelente para la reproducción de MP3


Sí, es genial. Simple y no parece depender de la plataforma. Se reproduce bien en segundo plano y solo necesita descubrir cómo detener un hilo.
James P.

14

Usando la API javax.sound estándar, una única dependencia de Maven, completamente de código abierto ( Java 7 requiere ):

pom.xml

 <!-- 
    We have to explicitly instruct Maven to use tritonus-share 0.3.7-2 
    and NOT 0.3.7-1, otherwise vorbisspi won't work.
   -->
<dependency>
  <groupId>com.googlecode.soundlibs</groupId>
  <artifactId>tritonus-share</artifactId>
  <version>0.3.7-2</version>
</dependency>
<dependency>
  <groupId>com.googlecode.soundlibs</groupId>
  <artifactId>mp3spi</artifactId>
  <version>1.9.5-1</version>
</dependency>
<dependency>
  <groupId>com.googlecode.soundlibs</groupId>
  <artifactId>vorbisspi</artifactId>
  <version>1.0.3-1</version>
</dependency>

Código

import java.io.File;
import java.io.IOException;

import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine.Info;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.SourceDataLine;
import javax.sound.sampled.UnsupportedAudioFileException;

import static javax.sound.sampled.AudioSystem.getAudioInputStream;
import static javax.sound.sampled.AudioFormat.Encoding.PCM_SIGNED;

public class AudioFilePlayer {

    public static void main(String[] args) {
        final AudioFilePlayer player = new AudioFilePlayer ();
        player.play("something.mp3");
        player.play("something.ogg");
    }

    public void play(String filePath) {
        final File file = new File(filePath);

        try (final AudioInputStream in = getAudioInputStream(file)) {

            final AudioFormat outFormat = getOutFormat(in.getFormat());
            final Info info = new Info(SourceDataLine.class, outFormat);

            try (final SourceDataLine line =
                     (SourceDataLine) AudioSystem.getLine(info)) {

                if (line != null) {
                    line.open(outFormat);
                    line.start();
                    stream(getAudioInputStream(outFormat, in), line);
                    line.drain();
                    line.stop();
                }
            }

        } catch (UnsupportedAudioFileException 
               | LineUnavailableException 
               | IOException e) {
            throw new IllegalStateException(e);
        }
    }

    private AudioFormat getOutFormat(AudioFormat inFormat) {
        final int ch = inFormat.getChannels();

        final float rate = inFormat.getSampleRate();
        return new AudioFormat(PCM_SIGNED, rate, 16, ch, ch * 2, rate, false);
    }

    private void stream(AudioInputStream in, SourceDataLine line) 
        throws IOException {
        final byte[] buffer = new byte[4096];
        for (int n = 0; n != -1; n = in.read(buffer, 0, buffer.length)) {
            line.write(buffer, 0, n);
        }
    }
}

Referencias:


Recibo este error tanto para mp3 como para ogg: UnsupportedAudioFileException: no se pudo obtener el flujo de entrada de audio del archivo de entrada
David Winiecki

Pongo el código en un módulo de Maven. Definitivamente funciona: search.maven.org/…
odoepner

Podría actualizar los números de versión a: <dependency> <groupId> com.googlecode.soundlibs </groupId> <artifactId> tritonus-share </artifactId> <version> 0.3.7.4 </version> </dependency> <dependency> <groupId> com.googlecode.soundlibs </groupId> <artifactId> mp3spi </artifactId> <version> 1.9.5.4 </version> </dependency> <dependency> <groupId> com.googlecode.soundlibs </groupId> < artifactId> vorbisspi </artifactId> <version> 1.0.3-2 </version> </dependency>
tibi

sólo verbisspi 1.0.3.3 que es el último no funcionó.
tibi

¡Esto es genial, funciona para MP3 y WAV desde el primer momento!
Miles Henrichs

13

Recomendaría usar BasicPlayerAPI. Es de código abierto, muy simple y no requiere JavaFX. http://www.javazoom.net/jlgui/api.html

Después de descargar y extraer el archivo zip, se deben agregar los siguientes archivos jar a la ruta de compilación del proyecto:

  • basicplayer3.0.jar
  • todos los frascos del directorio lib (dentro de BasicPlayer3.0)

Aquí hay un ejemplo de uso minimalista:

String songName = "HungryKidsofHungary-ScatteredDiamonds.mp3";
String pathToMp3 = System.getProperty("user.dir") +"/"+ songName;
BasicPlayer player = new BasicPlayer();
try {
    player.open(new URL("file:///" + pathToMp3));
    player.play();
} catch (BasicPlayerException | MalformedURLException e) {
    e.printStackTrace();
}

Importaciones requeridas:

import java.net.MalformedURLException;
import java.net.URL;
import javazoom.jlgui.basicplayer.BasicPlayer;
import javazoom.jlgui.basicplayer.BasicPlayerException;

Eso es todo lo que necesitas para empezar a reproducir música. El jugador está iniciando y administrando su propio hilo de reproducción y proporciona funciones de reproducción, pausa, reanudación, detención y búsqueda .

Para un uso más avanzado, puede echar un vistazo al reproductor de música jlGui. Es un clon de WinAmp de código abierto: http://www.javazoom.net/jlgui/jlgui.html

La primera clase a considerar sería PlayerUI (dentro del paquete javazoom.jlgui.player.amp). Demuestra bastante bien las funciones avanzadas de BasicPlayer.


Gracias, esta es la forma más sencilla que he intentado de agregar compatibilidad con mp3 a una aplicación actual. mp3spi1.9.4.jarSin mp3spi1.9.5.jarembargo, debería reemplazarse con desde el sitio de zoom de Java.
Old Badman Gray

No olvides dormir tu hilo principal después player.play()o es posible que no escuches ningún sonido.
jeremyjjbrown

7

La forma más fácil que encontré fue descargar el archivo jar de JLayer desde http://www.javazoom.net/javalayer/sources.html y agregarlo a la biblioteca Jar http://www.wikihow.com/Add-JARs- to-Project-Build-Paths-in-Eclipse-% 28Java% 29

Aquí está el código de la clase.

public class SimplePlayer {

    public SimplePlayer(){

        try{

             FileInputStream fis = new FileInputStream("File location.");
             Player playMP3 = new Player(fis);

             playMP3.play();

        }  catch(Exception e){
             System.out.println(e);
           }
    } 
}

y aquí están las importaciones

import javazoom.jl.player.*;
import java.io.FileInputStream;

1
Sí, mira este video [ youtube.com/ ... pasa por todas las funciones como detener y pausar.
Vlad

1
Creo que ya debería contener esas funciones, ya que parecen bastante básicas. De todos modos, encontré otra solución con otra biblioteca, gracias por la respuesta :)
N3sh

5

Para darles a los lectores otra alternativa, sugiero la biblioteca JACo MP3 Player, un reproductor de mp3 Java multiplataforma.

caracteristicas:

  • uso de CPU muy bajo (~ 2%)
  • pequeña biblioteca increíble (~ 90KB)
  • no necesita JMF (Java Media Framework)
  • fácil de integrar en cualquier aplicación
  • fácil de integrar en cualquier página web (como applet).

Para obtener una lista completa de sus métodos y atributos, puede consultar su documentación aquí .

Código de muestra:

import jaco.mp3.player.MP3Player;
import java.io.File;

public class Example1 {
  public static void main(String[] args) {
    new MP3Player(new File("test.mp3")).play();
  }
}

Para obtener más detalles, creé un tutorial simple aquí que incluye un código fuente descargable.


WOW, eso fue increíblemente simple.
Wesos de Queso

la descarga del código fuente no proporciona el código fuente real a la biblioteca?
a8_

4

Usando el decodificador / reproductor / convertidor MP3 Dependencia de Maven.

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

import java.io.FileInputStream;
import java.io.FileNotFoundException;

public class PlayAudio{

public static void main(String[] args) throws FileNotFoundException {

    try {
        FileInputStream fileInputStream = new FileInputStream("mp.mp3");
        Player player = new Player((fileInputStream));
        player.play();
        System.out.println("Song is playing");
        while(true){
            System.out.println(player.getPosition());
        }
    }catch (Exception e){
        System.out.println(e);
    }

  }

}

2

Primero debe instalar JMF ( descargar usando este enlace )

File f = new File("D:/Songs/preview.mp3");
MediaLocator ml = new MediaLocator(f.toURL());
Player p = Manager.createPlayer(ml);
p.start();

no olvide agregar archivos jar JMF


5
Tenga en cuenta que JMF ha sido abandonado por Sun / Oracle hace mucho tiempo.
Hendrik

1

Haga una búsqueda de freshmeat.net para la biblioteca JAVE (siglas de Java Audio Video Encoder) (enlace aquí ). Es una biblioteca para este tipo de cosas. No sé si Java tiene una función mp3 nativa.

Probablemente necesitará unir la función mp3 y la función wav, usando la herencia y una función contenedora simple, si desea que un método ejecute ambos tipos de archivos.


Realmente no tengo idea de cómo usar bibliotecas personalizadas, ¿alguna ayuda con eso?
Stan

Descargue la biblioteca y escriba una declaración de inclusión en su código. Debe haber instrucciones sobre el uso de la biblioteca incluidas. Por lo general, una llamada a función es suficiente, aunque es posible que primero deba declarar un objeto. Luego, cree una función que verifique la extensión de archivo de su entrada y llame a la función de biblioteca que desee.
Spencer Rathbun

0

Para agregar soporte de lectura MP3 a Java Sound, agregue mp3plugin.jarel JMF a la ruta de clase en tiempo de ejecución de la aplicación.

Tenga en cuenta que la Clipclase tiene limitaciones de memoria que la hacen inadecuada para más de unos segundos de sonido de alta calidad.


2
JMF se abandonó en 2003. No se recomienda que lo utilice.
Joshreesjones

@ mathguy54 Cuando recomiendo a las personas que no lo utilicen, es porque no admite suficientes tipos de medios diferentes. Sin embargo, sigue siendo totalmente adecuado para decodificar MP3.
Andrew Thompson

0

Tengo otros métodos para eso, el primero es:

public static void playAudio(String filePath){

    try{
        InputStream mus = new FileInputStream(new File(filePath));
        AudioStream aud = new AudioStream(mus);
    }catch(Exception e){
        JOptionPane.showMessageDialig(null, "You have an Error");
    }

Y el segundo es:

try{
    JFXPanel x = JFXPanel();
    String u = new File("021.mp3").toURI().toString();
    new MediaPlayer(new Media(u)).play();
} catch(Exception e){
    JOPtionPane.showMessageDialog(null, e);
}

Y si queremos hacer un bucle a este audio usamos este método.

try{
    AudioData d = new AudioStream(new FileInputStream(filePath)).getData();
    ContinuousAudioDataStream s = new ContinuousAudioDataStream(d);
    AudioPlayer.player.start(s);
} catch(Exception ex){
    JOPtionPane.showMessageDialog(null, ex);
}

si queremos detener este bucle, agregamos estas librerías en el intento:

AudioPlayer.player.stop(s);

para este tercer método agregamos las siguientes importaciones:

import java.io.FileInputStream;
import sun.audio.AudioData;
import sun.audio.AudioStream;
import sun.audio.ContinuousAudioDataStream;

-2

Utilice esta biblioteca: import sun.audio. *;

public void Sound(String Path){
    try{
        InputStream in = new FileInputStream(new File(Path));
        AudioStream audios = new AudioStream(in);
        AudioPlayer.player.start(audios);
    }
    catch(Exception e){}
}

2
Esta no ha sido la forma correcta de reproducir sonido durante mucho tiempo. Consulte también ¿ Es una mala práctica utilizar las clases Java patentadas de Sun? Su código con un bloque de captura vacío también es un ejemplo terrible.
Radiodef
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.