Riproduzione di .mp3 e .wav in Java?


Answers

Ho scritto un lettore mp3 java puro: mp3transform .

Question

Come posso riprodurre un file .mp3 e .wav nella mia applicazione Java? Sto usando Swing. Ho provato a cercare su internet, per qualcosa di simile a questo esempio:

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();
    }
}

Ma questo riprodurrà solo i file .wav .

Lo stesso con:

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

Voglio essere in grado di riprodurre entrambi i file .mp3 e .wav con lo stesso metodo.




È passato un po 'di tempo da quando l'ho usato, ma JavaLayer è ottimo per la riproduzione di MP3




Per dare ai lettori un'altra alternativa, suggerisco la libreria di JACo MP3 Player, un java mp3 multipiattaforma.

Caratteristiche:

  • utilizzo della CPU molto basso (~ 2%)
  • incredibile piccola biblioteca (~ 90KB)
  • non ha bisogno di JMF (Java Media Framework)
  • facile da integrare in qualsiasi applicazione
  • facile da integrare in qualsiasi pagina web (come applet).

Per un elenco completo dei suoi metodi e attributi è possibile controllare la sua documentazione here .

Codice d'esempio:

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();
  }
}

Per maggiori dettagli, ho creato here un semplice tutorial che include un codice sorgente scaricabile.




Usa questa libreria: 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){}
}



Per aggiungere il supporto per la lettura di MP3 a Java Sound, aggiungi il file mp3plugin.jar di JMF al percorso classe run-time dell'applicazione.

Si noti che la classe Clip ha limitazioni di memoria che la rendono inadatta per più di qualche secondo di suono di alta qualità.




Utilizzando l'API standard javax.sound, una singola dipendenza Maven, completamente Open Source (richiesto Java 7 ):

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>

Codice

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);
        }
    }
}

Riferimenti: