Vous jouez .mp3 et .wav en Java?


105

Comment puis-je lire .mp3un .wavfichier et un fichier dans mon application Java? J'utilise Swing. J'ai essayé de chercher sur Internet, quelque chose comme cet exemple:

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

Mais, cela ne lira que les .wavfichiers.

De même:

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

Je veux pouvoir lire les .mp3fichiers et les .wavfichiers avec la même méthode.


1
On dirait que vous aurez besoin d'une sorte de plugin. JMF devrait avoir ce dont vous avez besoin. oracle.com/technetwork/java/javase/tech/index-jsp-140239.html
Otra

Eh bien, je ne sais pas comment utiliser ces choses, je ne les ai jamais utilisées auparavant. Comment puis-je l'implanter, comment puis-je l'utiliser?
Stan

JFM a été abandonné en 2003. Il n'est pas recommandé de l'utiliser.
joshreesjones

3
Il est à noter que, dans une mainméthode, il est nécessaire d'ajouter un Thread.sleeppour entendre le son, sinon le programme se terminera avant que cela ne se produise. Une façon utile de le faire est:Thread.sleep(clip.getMicrosecondLength() / 1000);
André Valenti

Réponses:


119

Java FX a Mediaet MediaPlayerclasses qui liront les fichiers mp3.

Exemple de code:

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

Vous aurez besoin des instructions d'importation suivantes:

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

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

44
cela ne fonctionne pas du tout pour moi. il dit que les importations n'existent pas. et
j'utilise

9
stackoverflow.com/questions/15149547/… On dirait que vous devez ajouter manuellement la bibliothèque javafx depuis le dossier Java 7 si vous utilisez Eclipse.
Gyurme

7
Techniquement, Mediaet MediaPlayerne sont pas des classes Java , mais des classes JavaFX . Pour ajouter la prise en charge de mp3 à Java sous OS X ou Windows, vous pouvez consulter SampledSP . Et oui - j'ai écrit ces bibliothèques.
Hendrik

8
N'oubliez pas que vous devez également initialiser javaFX pour que cela fonctionne. stackoverflow.com/questions/14025718/…
user738048


18

vous ne pouvez jouer .wav qu'avec l'API java:

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

Et jouez .mp3 avec jLayer


4
C'est faux. Java lira d'autres formats de conteneurs en plus de wav. De plus, wav est un format de conteneur qui peut même contenir des mp3. Ainsi Java ne peut pas lire tous les fichiers wav.
Radiodef

15

Cela fait un moment que je ne l'ai pas utilisé, mais JavaLayer est idéal pour la lecture MP3


Oui, c'est très cool. Simple et ne semble pas dépendant de la plate-forme. Joue bien en arrière-plan et il suffit de comprendre comment arrêter un fil.
James P.

14

Utilisation de l'API javax.sound standard, une seule dépendance Maven, complètement Open Source ( Java 7 requis):

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

Références:


J'obtiens cette erreur pour mp3 et ogg: UnsupportedAudioFileException: impossible d'obtenir le flux d'entrée audio à partir du fichier d'entrée
David Winiecki

J'ai mis le code dans un module Maven. Cela fonctionne vraiment: search.maven.org
...

je pourrais mettre à niveau les numéros de version vers: <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

seul verbisspi 1.0.3.3 qui est le dernier n'a pas fonctionné.
tibi

C'est génial, cela fonctionne pour MP3 et WAV dès la sortie de la boîte!
Miles Henrichs

13

Je recommanderais d'utiliser le BasicPlayerAPI. C'est open source, très simple et ne nécessite pas JavaFX. http://www.javazoom.net/jlgui/api.html

Après avoir téléchargé et extrait le fichier zip, il faut ajouter les fichiers jar suivants au chemin de construction du projet:

  • basicplayer3.0.jar
  • tous les jars du répertoire lib (dans BasicPlayer3.0)

Voici un exemple d'utilisation minimaliste:

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

Importations requises:

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

C'est tout ce dont vous avez besoin pour commencer à jouer de la musique. Le lecteur démarre et gère son propre fil de lecture et propose lecture, pause, reprise, arrêt et recherche .

Pour une utilisation plus avancée, vous pouvez jeter un œil au lecteur de musique jlGui. C'est un clone WinAmp open source: http://www.javazoom.net/jlgui/jlgui.html

La première classe à examiner serait PlayerUI (dans le package javazoom.jlgui.player.amp). Il démontre assez bien les fonctionnalités avancées du BasicPlayer.


Merci, c'est le moyen le plus simple que j'ai essayé d'ajouter le support mp3 à une application actuelle. mp3spi1.9.4.jardevrait être remplacé par mp3spi1.9.5.jardu site java zoom.
Old Badman Grey

N'oubliez pas de mettre en veille votre fil principal après player.play()ou vous n'entendrez peut-être aucun son.
jeremyjjbrown

7

Le moyen le plus simple que j'ai trouvé était de télécharger le fichier jar JLayer à partir de http://www.javazoom.net/javalayer/sources.html et de l'ajouter à la bibliothèque Jar http://www.wikihow.com/Add-JARs- vers-Project-Build-Paths-in-Eclipse-% 28Java% 29

Voici le code de 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);
           }
    } 
}

et voici les importations

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

1
Oui, il regarde cette vidéo [ youtube.com/... il passe par toutes les fonctions comme arrêter et mettre en pause.
Vlad

1
Je pense qu'il devrait déjà contenir ces fonctions, car elles semblent plutôt basiques. Quoi qu'il en soit, j'ai trouvé une autre solution avec une autre bibliothèque, merci pour la réponse :)
N3sh

5

Pour donner aux lecteurs une autre alternative, je suggère la bibliothèque JACo MP3 Player, un lecteur mp3 java multiplateforme.

Fonctionnalités:

  • très faible utilisation du processeur (~ 2%)
  • incroyable petite bibliothèque (~ 90 Ko)
  • n'a pas besoin de JMF (Java Media Framework)
  • facile à intégrer dans n'importe quelle application
  • facile à intégrer dans n'importe quelle page Web (sous forme d'applet).

Pour une liste complète de ses méthodes et attributs, vous pouvez consulter sa documentation ici .

Exemple de code:

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

Pour plus de détails, j'ai créé un tutoriel simple ici qui comprend un code source téléchargeable.


WOW, c'était incroyablement simple.
Wesos de Queso

le téléchargement du code source ne donne pas le code source réel à la bibliothèque?
a8_

4

Utilisation du décodeur / lecteur / convertisseur MP3 Dépendance 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

Vous devez d'abord installer JMF ( télécharger en utilisant ce lien )

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

n'oubliez pas d'ajouter les fichiers jar JMF


5
Notez que JMF a été abandonné par Sun / Oracle il y a longtemps.
Hendrik

1

Faites une recherche sur freshmeat.net pour la bibliothèque JAVE (signifie Java Audio Video Encoder) (lien ici ). C'est une bibliothèque pour ce genre de choses. Je ne sais pas si Java a une fonction mp3 native.

Vous devrez probablement encapsuler la fonction mp3 et la fonction wav ensemble, en utilisant l'héritage et une simple fonction wrapper, si vous voulez qu'une méthode exécute les deux types de fichiers.


Je ne sais vraiment pas comment utiliser les bibliothèques personnalisées, aucune aide à ce sujet?
Stan

Téléchargez la bibliothèque et écrivez une instruction d'inclusion dans votre code. Des instructions sur l'utilisation de la bibliothèque devraient être incluses. En général, un appel de fonction suffit, même si vous devrez peut-être d'abord déclarer un objet. Ensuite, créez une fonction qui vérifie l'extension de fichier de son entrée et appelle la fonction de bibliothèque souhaitée.
Spencer Rathbun

0

Pour ajouter la prise en charge de la lecture MP3 à Java Sound, ajoutez le mp3plugin.jarfichier JMF au chemin d'accès aux classes d'exécution de l'application.

Notez que la Clipclasse a des limitations de mémoire qui la rendent inadaptée pour plus de quelques secondes de son de haute qualité.


2
JMF a été abandonné en 2003. Il n'est pas recommandé de l'utiliser.
joshreesjones

@ mathguy54 Quand je recommande aux gens de ne pas l'utiliser, c'est parce qu'il ne supporte pas suffisamment de types de médias différents. Néanmoins, il reste tout à fait adéquat pour décoder des MP3.
Andrew Thompson

0

J'ai d'autres méthodes pour cela, la première est:

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

Et le second est:

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

Et si nous voulons faire une boucle sur cet audio, nous utilisons cette méthode.

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

si nous voulons arrêter cette boucle, nous ajoutons ces libreries dans l'essai:

AudioPlayer.player.stop(s);

pour cette troisième méthode, nous ajoutons les importations suivantes:

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

-2

Utilisez cette bibliothèque: 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
Cela n'a pas été la bonne façon de jouer du son depuis très longtemps. Voir aussi C'est une mauvaise pratique d'utiliser les classes Java propriétaires de Sun? Votre code avec un bloc catch vide est également un exemple terrible.
Radiodef
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.