Stai riproducendo .mp3 e .wav in Java?


105

Come posso giocare una .mp3e un .wavfile in mia applicazione Java? Sto usando Swing. Ho provato a cercare su Internet qualcosa come 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 .wavfile.

Lo stesso con:

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

Voglio essere in grado di riprodurre .mp3file e .wavfile con lo stesso metodo.


1
Sembra che tu abbia bisogno di un plugin di qualche tipo. JMF dovrebbe avere ciò di cui hai bisogno. oracle.com/technetwork/java/javase/tech/index-jsp-140239.html
Otra

Beh, non sono sicuro di come usare queste cose, non le ho mai usate prima. Come posso impiantarlo, come posso usarlo?
Stan

JFM è stato abbandonato nel 2003. Non è consigliabile utilizzarlo.
joshreesjones

3
Vale la pena notare che, in un mainmetodo, è necessario aggiungere Thread.sleepa per ascoltare il suono, altrimenti il ​​programma terminerà prima che ciò accada. Un modo utile per farlo è:Thread.sleep(clip.getMicrosecondLength() / 1000);
André Valenti

Risposte:


119

Java FX ha Mediae MediaPlayerclassi che riprodurranno file mp3.

Codice di esempio:

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

Avrai bisogno delle seguenti istruzioni di importazione:

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

5
risorsa URL finale = getClass (). getResource ("a.mp3");
Neil

44
questo non funziona affatto per me. dice che le importazioni non esistono. e sto eseguendo java 7 ...
PulsePanda

9
stackoverflow.com/questions/15149547/… Sembra che tu debba aggiungere manualmente la libreria javafx dall'interno della cartella Java 7 se usi Eclipse.
Gyurme

7
Tecnicamente, Mediae MediaPlayernon sono classi Java , ma classi JavaFX . Per aggiungere il supporto mp3 a Java su OS X o Windows, potresti voler esaminare SampledSP . E sì, ho scritto quelle librerie.
Hendrik

8
Non dimenticare che devi inizializzare anche javaFX affinché funzioni. stackoverflow.com/questions/14025718/...
user738048


18

puoi riprodurre .wav solo con l'API java:

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

codice:

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

E suona .mp3 con jLayer


4
Questo è sbagliato. Java riprodurrà altri formati contenitore oltre a wav. Inoltre, wav è un formato contenitore che può contenere anche mp3. Quindi Java non può riprodurre tutti i file wav.
Radiodef

15

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


Sì, è molto bello. Semplice e non sembra dipendente dalla piattaforma. Suona bene in sottofondo e devi solo capire come fermare un thread.
James P.

14

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

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:


Ricevo questo errore sia per mp3 che per ogg: UnsupportedAudioFileException: impossibile ottenere il flusso di input audio dal file di input
David Winiecki

Ho inserito il codice in un modulo Maven. Funziona sicuramente: search.maven.org/…
odoepner

potrei aggiornare i numeri di versione 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

solo verbisspi 1.0.3.3 che è l'ultimo non ha funzionato.
tibi

È fantastico, funziona per MP3 e WAV immediatamente!
Miles Henrichs,

13

Consiglierei di utilizzare BasicPlayerAPI. È open source, molto semplice e non richiede JavaFX. http://www.javazoom.net/jlgui/api.html

Dopo aver scaricato ed estratto il file zip si dovrebbero aggiungere i seguenti file jar al percorso di compilazione del progetto:

  • basicplayer3.0.jar
  • tutti i jar dalla directory lib (all'interno di BasicPlayer3.0)

Ecco un esempio di utilizzo 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();
}

Importazioni richieste:

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

È tutto ciò di cui hai bisogno per iniziare a riprodurre musica. Il lettore sta avviando e gestendo il proprio thread di riproduzione e fornisce funzionalità di riproduzione, pausa, ripresa, interruzione e ricerca .

Per un utilizzo più avanzato puoi dare un'occhiata a jlGui Music Player. È un clone di WinAmp open source: http://www.javazoom.net/jlgui/jlgui.html

La prima classe da guardare sarebbe PlayerUI (all'interno del pacchetto javazoom.jlgui.player.amp). Dimostra abbastanza bene le funzionalità avanzate di BasicPlayer.


Grazie, questo è il modo più semplice in cui ho provato ad aggiungere il supporto mp3 a un'applicazione corrente. mp3spi1.9.4.jardovrebbe essere sostituito con mp3spi1.9.5.jardal sito java zoom.
Old Badman Grey

Non dimenticare di dormire il tuo thread principale dopo player.play()o potresti non sentire alcun suono.
jeremyjjbrown

7

Il modo più semplice che ho trovato è stato scaricare il file jar JLayer da http://www.javazoom.net/javalayer/sources.html e aggiungerlo alla libreria Jar http://www.wikihow.com/Add-JARs- to-Project-build-percorsi-in-Eclipse-% 28Java% 29

Ecco il codice per la classe

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

ed ecco le importazioni

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

1
Sì, guarda questo video [ youtube.com/… passa attraverso tutte le funzioni come interrompi e metti in pausa.
Vlad

1
Penso che dovrebbe già contenere quelle funzioni, dal momento che sembrano piuttosto basilari. Comunque, ho trovato un'altra soluzione con un'altra libreria, grazie per la risposta :)
N3sh

5

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

Caratteristiche:

  • utilizzo della CPU molto basso (~ 2%)
  • incredibile piccola libreria (~ 90 KB)
  • non necessita 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 puoi controllare la sua documentazione qui .

Codice di 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 un semplice tutorial qui che include un codice sorgente scaricabile.


WOW, è stato incredibilmente semplice.
Wesos de Queso

il download del codice sorgente non fornisce il codice sorgente effettivo alla libreria?
a8_

4

Utilizzo del decodificatore / lettore / convertitore MP3 Maven Dependency.

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

Devi prima installare JMF ( scarica usando questo link )

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

non dimenticare di aggiungere file jar JMF


5
Notare che JMF è stato abbandonato da Sun / Oracle molto tempo fa.
Hendrik

1

Fai una ricerca su freshmeat.net per JAVE (sta per Java Audio Video Encoder) Library (link qui ). È una libreria per questo genere di cose. Non so se Java abbia una funzione mp3 nativa.

Probabilmente sarà necessario riunire la funzione mp3 e la funzione wav, usando l'ereditarietà e una semplice funzione wrapper, se si desidera che un metodo esegua entrambi i tipi di file.


Non ho davvero idea di come usare le librerie personalizzate, qualche aiuto con esso?
Stan

Scarica la libreria e scrivi un'istruzione include nel codice. Dovrebbero essere incluse le istruzioni sull'uso della libreria. Di solito, è sufficiente una chiamata di funzione, anche se potrebbe essere necessario dichiarare prima un oggetto. Quindi, crea una funzione che controlla l'estensione del file del suo input e chiama la funzione di libreria che desideri.
Spencer Rathbun

0

Per aggiungere il supporto per la lettura di MP3 a Java Sound, aggiungere mp3plugin.jaril JMF al percorso di classe di runtime dell'applicazione.

Si noti che la Clipclasse ha limitazioni di memoria che la rendono inadatta per più di pochi secondi di suono di alta qualità.


2
JMF è stato abbandonato nel 2003. Non è consigliabile utilizzarlo.
joshreesjones

@ mathguy54 Quando consiglio alle persone di non usarlo, è perché non supporta abbastanza diversi tipi di media. Tuttavia, è ancora del tutto adeguato per la decodifica di MP3.
Andrew Thompson

0

Ho altri metodi per questo, il primo è:

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

E il secondo è:

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

E se vogliamo creare un loop su questo audio usiamo questo metodo.

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

se vogliamo fermare questo ciclo aggiungiamo queste librerie nel tentativo:

AudioPlayer.player.stop(s);

per questo terzo metodo aggiungiamo le seguenti importazioni:

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

-2

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

2
Questo non è stato il modo corretto di riprodurre il suono per molto tempo. Vedere anche È una cattiva pratica utilizzare le classi Java proprietarie di Sun? Anche il tuo codice con un blocco catch vuoto è un pessimo esempio.
Radiodef
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.