Odtwarzasz pliki .mp3 i .wav w Javie?


105

Jak mogę odtworzyć plik .mp3i .wavw mojej aplikacji Java? Używam Swing. Próbowałem poszukać w Internecie czegoś takiego, jak ten przykład:

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

Ale to tylko odtworzy .wavpliki.

Tak samo z:

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

Chcę mieć możliwość odtwarzania .mp3plików i .wavplików tą samą metodą.


1
Wygląda na to, że będziesz potrzebować jakiejś wtyczki. JMF powinien mieć to, czego potrzebujesz. oracle.com/technetwork/java/javase/tech/index-jsp-140239.html
Otra

Cóż, nie jestem pewien, jak używać tych rzeczy, nigdy wcześniej ich nie używałem. Jak mogę to zaimplementować, jak mogę tego użyć?
Stan

JFM został porzucony w 2003 roku. Nie zaleca się go używać.
joshreesjones

3
Warto zauważyć, że w mainmetodzie konieczne jest dodanie a Thread.sleep, aby usłyszeć dźwięk, w przeciwnym razie program zakończy się, zanim to się stanie. Użytecznym sposobem na to jest:Thread.sleep(clip.getMicrosecondLength() / 1000);
André Valenti

Odpowiedzi:


119

Java FX ma Mediai MediaPlayerklasy, które będą odtwarzać pliki mp3.

Przykładowy kod:

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

Będziesz potrzebował następujących instrukcji importu:

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

5
końcowy URL zasób = getClass (). getResource ("a.mp3");
Neil,

44
to w ogóle nie działa dla mnie. mówi, że import nie istnieje. i
używam

9
stackoverflow.com/questions/15149547/… Wygląda na to, że musisz ręcznie dodać bibliotekę javafx z folderu Java 7, jeśli używasz Eclipse.
Gyurme

7
Technicznie Mediai MediaPlayernie są to klasy Java , ale klasy JavaFX . Aby dodać obsługę mp3 do Javy na OS X lub Windows, możesz zajrzeć do SampledSP . I tak - pisałem te biblioteki.
Hendrik

8
Nie zapomnij, że musisz również zainicjować javaFX, aby to zadziałało. stackoverflow.com/questions/14025718/…
user738048


18

możesz grać w .wav tylko z java API:

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

kod:

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

I odtwarzaj .mp3 z jLayer


4
To jest źle. Java będzie odtwarzać inne formaty kontenerów oprócz wav. Ponadto wav jest formatem kontenera, który może zawierać nawet mp3. Dlatego Java nie może odtwarzać wszystkich plików wav.
Radiodef

15

Minęło trochę czasu, odkąd go używałem, ale JavaLayer świetnie nadaje się do odtwarzania plików MP3


Tak, jest bardzo fajny. Proste i nie wydaje się zależne od platformy. Odgrywa dobrze w tle i wystarczy dowiedzieć się, jak zatrzymać wątek.
James P.,

14

Korzystanie ze standardowego interfejsu API javax.sound, jednej zależności Maven, całkowicie Open Source ( wymagana 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>

Kod

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

Bibliografia:


Otrzymuję ten błąd zarówno dla mp3, jak i ogg: UnsupportedAudioFileException: nie można pobrać strumienia wejściowego audio z pliku wejściowego
David Winiecki

Umieściłem kod w module Maven. To na pewno działa: search.maven.org/…
odoepner

mogę zaktualizować numery wersji do: <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

tylko verbisspi 1.0.3.3, który jest najnowszy, nie działał.
tibi

To jest świetne, działa z plikami MP3 i WAV od razu po wyjęciu z pudełka!
Miles Henrichs

13

Polecam korzystanie z BasicPlayerAPI. Jest open source, bardzo prosty i nie wymaga JavaFX. http://www.javazoom.net/jlgui/api.html

Po pobraniu i rozpakowaniu pliku zip należy dodać następujące pliki jar do ścieżki budowania projektu:

  • basicplayer3.0.jar
  • wszystkie pliki jar z katalogu lib (wewnątrz BasicPlayer3.0)

Oto minimalistyczny przykład użycia:

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

Wymagany import:

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

To wszystko, czego potrzebujesz, aby zacząć grać muzykę. Odtwarzacz uruchamia swój własny wątek odtwarzania i zarządza nim oraz zapewnia funkcje odtwarzania, wstrzymywania, wznawiania, zatrzymywania i wyszukiwania .

Aby uzyskać bardziej zaawansowane zastosowania, możesz rzucić okiem na odtwarzacz muzyczny jlGui. Jest to klon WinAmp typu open source: http://www.javazoom.net/jlgui/jlgui.html

Pierwszą klasą, której należy się przyjrzeć, byłby PlayerUI (w pakiecie javazoom.jlgui.player.amp). Całkiem dobrze demonstruje zaawansowane funkcje BasicPlayera.


Dzięki, to najłatwiejszy sposób, w jaki próbowałem dodać obsługę mp3 do bieżącej aplikacji. mp3spi1.9.4.jarnależy jednak zastąpić z mp3spi1.9.5.jarwitryny powiększania java.
Old Badman Grey

Nie zapomnij przespać głównego wątku po player.play()lub możesz nie usłyszeć żadnego dźwięku.
jeremyjjbrown

7

Najłatwiejszym sposobem, jaki znalazłem, było pobranie pliku jar JLayer z http://www.javazoom.net/javalayer/sources.html i dodanie go do biblioteki Jar http://www.wikihow.com/Add-JARs- do-projektu-budowania-ścieżek-w-Eclipse-% 28Java% 29

Oto kod zajęć

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

a oto import

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

1
Tak, obejrzyj ten film [ youtube.com/…] przechodzi przez wszystkie funkcje, takie jak zatrzymywanie i pauza.
Vlad

1
Myślę, że powinien już zawierać te funkcje, ponieważ wydają się raczej podstawowe. W każdym razie znalazłem inne rozwiązanie z inną biblioteką, dzięki za odpowiedź :)
N3sh

5

Aby dać czytelnikom inną alternatywę, proponuję bibliotekę JACo MP3 Player, wieloplatformowy odtwarzacz mp3 java.

Cechy:

  • bardzo niskie zużycie procesora (~ 2%)
  • niesamowita mała biblioteka (~ 90 KB)
  • nie potrzebuje JMF (Java Media Framework)
  • łatwe do zintegrowania w dowolnej aplikacji
  • łatwe do zintegrowania z dowolną stroną internetową (jako aplet).

Pełną listę jego metod i atrybutów można znaleźć w dokumentacji tutaj .

Przykładowy kod:

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

Aby uzyskać więcej informacji, utworzyłem tutaj prosty samouczek , który zawiera kod źródłowy do pobrania.


WOW, to było niesamowicie proste.
Wesos de Queso

pobieranie kodu źródłowego nie przekazuje rzeczywistego kodu źródłowego do biblioteki?
a8_

4

Korzystanie z dekodera / odtwarzacza / konwertera MP3 Zależność 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

Najpierw musisz zainstalować JMF ( pobierz za pomocą tego linku )

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

nie zapomnij dodać plików jar JMF


5
Zauważ, że JMF został porzucony przez Sun / Oracle dawno temu.
Hendrik,

1

Wyszukaj bibliotekę JAVE na freshmeat.net (skrót od Java Audio Video Encoder) (łącze tutaj ). To biblioteka do tego typu rzeczy. Nie wiem, czy Java ma natywną funkcję mp3.

Prawdopodobnie będziesz musiał zawinąć razem funkcję mp3 i wav, używając dziedziczenia i prostej funkcji opakowującej, jeśli chcesz, aby jedna metoda uruchamiała oba typy plików.


Naprawdę nie mam pojęcia, jak korzystać z bibliotek niestandardowych, jakaś pomoc?
Stan

Pobierz bibliotekę i napisz instrukcję include w swoim kodzie. Powinna być dołączona instrukcja korzystania z biblioteki. Zwykle wystarczy wywołanie funkcji, chociaż może być konieczne najpierw zadeklarowanie obiektu. Następnie utwórz funkcję, która sprawdza rozszerzenie pliku swojego wejścia i wywołuje żądaną funkcję biblioteczną.
Spencer Rathbun

0

Aby dodać obsługę odczytu MP3 do Java Sound, dodaj mp3plugin.jarJMF do ścieżki klasy aplikacji w czasie wykonywania.

Zwróć uwagę, że Clipklasa ma ograniczenia pamięci, które sprawiają, że nie nadaje się do odtwarzania dźwięku wysokiej jakości przez więcej niż kilka sekund.


2
JMF został porzucony w 2003 roku. Nie zaleca się go używać.
joshreesjones

@ mathguy54 Kiedy zalecam ludziom, aby go nie używali, dzieje się tak dlatego, że nie obsługuje wystarczającej liczby różnych typów mediów. Niemniej jednak nadal jest całkowicie wystarczający do dekodowania MP3.
Andrew Thompson

0

Mam na to inne metody, pierwsza to:

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

A po drugie:

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

A jeśli chcemy zrobić pętlę z tym dźwiękiem, używamy tej metody.

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

jeśli chcemy zatrzymać tę pętlę, dodajemy te libreries w try:

AudioPlayer.player.stop(s);

dla tej trzeciej metody dodajemy następujące importy:

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

-2

Użyj tej biblioteki: 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
To nie był właściwy sposób odtwarzania dźwięku przez bardzo długi czas. Zobacz także Czy używanie zastrzeżonych przez firmę Sun klas Java jest złą praktyką? Twój kod z pustym blokiem catch również jest okropnym przykładem.
Radiodef
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.