Riproduzione di .mp3 e .wav in Java?



5 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.




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



È 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.




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:




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à.






Related