.Mp3 und .wav in Java spielen?


105

Wie kann ich eine .mp3und eine .wavDatei in meiner Java-Anwendung abspielen ? Ich benutze Swing. Ich habe versucht, im Internet nach so etwas wie diesem Beispiel zu suchen:

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

Dies spielt jedoch nur .wavDateien ab.

Das selbe mit:

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

Ich möchte in der Lage sein, sowohl .mp3Dateien als auch .wavDateien mit derselben Methode abzuspielen.


1
Sieht so aus, als ob Sie eine Art Plugin benötigen. JMF sollte das haben, was Sie brauchen. oracle.com/technetwork/java/javase/tech/index-jsp-140239.html
Otra

Nun, ich bin mir nicht sicher, wie ich diese Dinge benutzen soll, ich habe sie noch nie benutzt. Wie kann ich es implementieren, wie kann ich es verwenden?
Stan

JFM wurde 2003 aufgegeben. Es wird nicht empfohlen, es zu verwenden.
Joshreesjones

3
Es ist erwähnenswert, dass bei einer mainMethode ein hinzugefügt werden Thread.sleepmuss, um den Ton zu hören. Andernfalls wird das Programm beendet, bevor dies geschieht. Ein nützlicher Weg, dies zu tun, ist:Thread.sleep(clip.getMicrosecondLength() / 1000);
André Valenti

Antworten:


118

Java FX hat Mediaund MediaPlayerKlassen, die MP3-Dateien abspielen.

Beispielcode:

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

Sie benötigen die folgenden Importanweisungen:

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

5
endgültige URL resource = getClass (). getResource ("a.mp3");
Neil

44
Das funktioniert bei mir überhaupt nicht. es heißt, dass die Importe nicht existieren. und ich
laufe

9
stackoverflow.com/questions/15149547/… Wenn Sie Eclipse verwenden, müssen Sie die Javafx-Bibliothek anscheinend manuell aus dem Java 7-Ordner hinzufügen.
Gyurme

7
Technisch MediaundMediaPlayer sind nicht Java - Klassen, aber JavaFX Klassen. Um Java unter OS X oder Windows MP3-Unterstützung hinzuzufügen, sollten Sie sich SampledSP ansehen . Und ja - ich habe diese Bibliotheken geschrieben.
Hendrik

8
Vergessen Sie nicht, dass Sie auch javaFX initialisieren müssen, damit dies funktioniert. stackoverflow.com/questions/14025718/…
user738048


18

Sie können .wav nur mit der Java-API spielen:

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

Code:

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

Und spielen Sie .mp3 mit jLayer


4
Das ist falsch. Java spielt neben wav auch andere Containerformate ab. Darüber hinaus ist wav ein Containerformat, das sogar MP3 enthalten kann. Java kann also nicht alle WAV-Dateien abspielen.
Radiodef

15

Es ist schon eine Weile her, seit ich es benutzt habe, aber JavaLayer eignet sich hervorragend für die MP3-Wiedergabe


Ja, es ist sehr cool. Einfach und scheint nicht plattformabhängig zu sein. Spielt sich gut im Hintergrund und muss nur herausfinden, wie ein Thread gestoppt werden kann.
James P.

14

Unter Verwendung der Standard-API javax.sound, einer einzelnen Maven-Abhängigkeit, vollständig Open Source ( Java 7 erforderlich):

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>

Code

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

Verweise:


Ich erhalte diesen Fehler sowohl für mp3 als auch für ogg: UnsupportedAudioFileException: Audioeingabestream konnte nicht aus der Eingabedatei
abgerufen

Ich habe den Code in ein Maven-Modul eingefügt. Es funktioniert definitiv: search.maven.org/…
Odoepner

Ich könnte die Versionsnummern aktualisieren auf: <dependency> <groupId> com.googlecode.soundlibs </ groupId> <artifactId> tritonus-share </ifactId> <version> 0.3.7.4 </ version> </ dependency> <dependency> <groupId> com.googlecode.soundlibs </ groupId> <artifactId> mp3spi </ifactId> <version> 1.9.5.4 </ version> </ dependency> <dependency> <groupId> com.googlecode.soundlibs </ groupId> < Artefakt-ID> Vorbisspi </ Artefakt-ID> <Version> 1.0.3-2 </ Version> </ Abhängigkeit>
Tibi

nur verbisspi 1.0.3.3, das neueste, hat nicht funktioniert.
Tibi

Das ist großartig, es funktioniert sofort für MP3 und WAV!
Miles Henrichs

13

Ich würde empfehlen, die BasicPlayerAPI zu verwenden. Es ist Open Source, sehr einfach und erfordert kein JavaFX. http://www.javazoom.net/jlgui/api.html

Nach dem Herunterladen und Extrahieren der Zip-Datei sollten die folgenden JAR-Dateien zum Erstellungspfad des Projekts hinzugefügt werden:

  • basicplayer3.0.jar
  • alle Gläser aus dem lib- Verzeichnis (in BasicPlayer3.0)

Hier ist ein minimalistisches Anwendungsbeispiel:

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

Erforderliche Importe:

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

Das ist alles, was Sie brauchen, um Musik zu spielen. Der Player startet und verwaltet seinen eigenen Wiedergabethread und bietet Wiedergabe, Pause, Wiederaufnahme, Stopp und Suche .

Für eine erweiterte Verwendung können Sie sich den jlGui Music Player ansehen. Es ist ein Open Source WinAmp-Klon: http://www.javazoom.net/jlgui/jlgui.html

Die erste Klasse, die man sich ansieht , ist PlayerUI (im Paket javazoom.jlgui.player.amp). Es zeigt die erweiterten Funktionen des BasicPlayer ziemlich gut.


Vielen Dank, dies ist der einfachste Weg, wie ich versucht habe, einer aktuellen Anwendung MP3-Unterstützung hinzuzufügen. mp3spi1.9.4.jarsollte jedoch durch mp3spi1.9.5.jarvon der Java-Zoom-Site ersetzt werden.
Alter Badman Gray

Vergessen Sie nicht, Ihren Hauptfaden danach zu schlafen, da Sie sonst player.play()möglicherweise keinen Ton hören.
Jeremyjjbrown

7

Der einfachste Weg, den ich gefunden habe, war das Herunterladen der JLayer-JAR-Datei von http://www.javazoom.net/javalayer/sources.html und das Hinzufügen zur Jar-Bibliothek http://www.wikihow.com/Add-JARs- to-Project-Build-Pfade-in-Eclipse-% 28Java% 29

Hier ist der Code für die Klasse

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

und hier sind die Importe

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

1
Ja, es sieht sich dieses Video an [ youtube.com/… es durchläuft alle Funktionen wie Stopp und Pause.
Vlad

1
Ich denke, es sollte diese Funktionen bereits enthalten, da sie ziemlich einfach erscheinen. Wie auch immer, ich habe eine andere Lösung mit einer anderen Bibliothek gefunden, danke für die Antwort :)
N3sh

5

Um den Lesern eine weitere Alternative zu bieten, schlage ich die JACo MP3 Player-Bibliothek vor, einen plattformübergreifenden Java MP3 Player.

Eigenschaften:

  • sehr geringe CPU-Auslastung (~ 2%)
  • unglaubliche kleine Bibliothek (~ 90KB)
  • benötigt kein JMF (Java Media Framework)
  • einfach in jede Anwendung zu integrieren
  • einfach in jede Webseite zu integrieren (als Applet).

Eine vollständige Liste der Methoden und Attribute finden Sie in der Dokumentation hier .

Beispielcode:

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

Weitere Einzelheiten habe ich ein einfaches Tutorial hier , die eine herunterladbare Quelltext enthält.


WOW, das war unglaublich einfach.
Wesos de Queso

Der Quellcode-Download gibt der Bibliothek keinen tatsächlichen Quellcode.
a8_

4

Verwenden der Maven-Abhängigkeit von MP3-Decoder / Player / Konverter .

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

Sie müssen zuerst JMF installieren ( Download über diesen Link )

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

Vergessen Sie nicht, JMF-JAR-Dateien hinzuzufügen


5
Beachten Sie, dass JMF vor langer Zeit von Sun / Oracle aufgegeben wurde.
Hendrik

1

Durchsuchen Sie freshmeat.net nach der JAVE-Bibliothek (steht für Java Audio Video Encoder) (Link hier ). Es ist eine Bibliothek für diese Art von Dingen. Ich weiß nicht, ob Java eine native MP3-Funktion hat.

Sie müssen wahrscheinlich die MP3-Funktion und die WAV-Funktion mithilfe der Vererbung und einer einfachen Wrapper-Funktion zusammenfassen, wenn eine Methode beide Dateitypen ausführen soll.


Ich habe wirklich keine Ahnung, wie man benutzerdefinierte Bibliotheken verwendet, Hilfe dabei?
Stan

Laden Sie die Bibliothek herunter und schreiben Sie eine include-Anweisung in Ihren Code. Es sollten Anweisungen zur Verwendung der Bibliothek enthalten sein. Normalerweise reicht ein Funktionsaufruf aus, obwohl Sie möglicherweise zuerst ein Objekt deklarieren müssen. Erstellen Sie dann eine Funktion, die die Dateierweiterung ihrer Eingabe überprüft und die gewünschte Bibliotheksfunktion aufruft.
Spencer Rathbun

0

Fügen Sie zum Hinzufügen von MP3-Leseunterstützung zu Java Sound mp3plugin.jardie JMF zum Laufzeitklassenpfad der Anwendung hinzu.

Beachten Sie, dass die ClipKlasse über Speicherbeschränkungen verfügt, die sie für mehr als einige Sekunden mit hoher Klangqualität ungeeignet machen.


2
JMF wurde 2003 aufgegeben. Es wird nicht empfohlen, es zu verwenden.
Joshreesjones

@ mathguy54 Wenn ich Leuten empfehle, es nicht zu verwenden, liegt es daran, dass es nicht genügend verschiedene Medientypen unterstützt. Trotzdem ist es für die Dekodierung von MP3 völlig ausreichend.
Andrew Thompson

0

Ich habe andere Methoden dafür, die erste ist:

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

Und der zweite ist:

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

Und wenn wir eine Schleife zu diesem Audio erstellen möchten, verwenden wir diese Methode.

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

Wenn wir diese Schleife stoppen möchten, fügen wir diese Bibliotheken im Versuch hinzu:

AudioPlayer.player.stop(s);

Für diese dritte Methode fügen wir die folgenden Importe hinzu:

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

-2

Verwenden Sie diese Bibliothek: 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
Dies war lange Zeit nicht die richtige Art, Sound abzuspielen. Siehe auch Es ist eine schlechte Praxis, die proprietären Java-Klassen von Sun zu verwenden. Ihr Code mit einem leeren Fangblock ist ebenfalls ein schreckliches Beispiel.
Radiodef
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.