2016-09-29 2 views
2

J'ai trouvé quelques réponses possibles sur Stack Overflow, mais elles sont anciennes et on dirait qu'elles utilisent des technologies obsolètes.Comment lire un fichier mp3 avec un nom de fichier absolu?

J'ai besoin de lire un fichier mp3 avec un nom de fichier absolu.

Voici ce que j'ai essayé:

1. JavaFX

MediaPlayer player = new MediaPlayer(new Media(uriString)); 

Je reçois java.lang.IllegalStateException: Toolkit not initialized.

Je pourrais probablement trouver un moyen d'initialiser cette boîte à outils, mais j'aimerais savoir si c'est le moyen préféré.

2. Intellij UIUtil

final InputStream is = new FileInputStream(fileName); 

UIUtil.playSoundFromStream(new Factory<InputStream>() { 
    @Override 
    public InputStream create() { 
     return is; 
    } 
}); 

Je me fais Audio format is not yet supported: could not get audio input stream from input file

J'ai fait quelques autres tentatives, mais c'est ce que j'ai un dossier de.

La seule chose qui fonctionne pour moi à ce jour est la lecture des fichiers de shell: sur Mac,

Runtime.getRuntime().exec("afplay " + filePath); 

Mais je préfère une solution Java. Des idées?

+0

voir Java son api. travail très bien – Tokazio

+0

J'ai essayé cela aussi. Ne supporte pas mp3: http://stackoverflow.com/questions/5667454/playing-mp3-using-java-sound-api –

Répondre

2
  • Pour JavaFX

Vous pouvez regarder ici Getting a mp3 file to play using javafx

  • Ici vous êtes, ma partie préférée:

Vous pouvez utiliser JLayer qui prend en charge .mp3.

Exemple

new Thread(()->{ 
    try { 
     FileInputStream file = new FileInputStream("path ..../audio.mp3"); //initialize the FileInputStream 
     Player player= new Player(file); //initialize the player 
     player.play(); //start the player 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

}).start(); 

Note:

Notez que j'utilise une cause distincte Thread sinon l'application pile.

En général:

Vous devez utiliser des bibliothèques externes pour lire les fichiers .mp3 comme dans Java (bien que JavaFX supports.mp3, mais pas tous les formats)

Java ne supporte que .wav

Bien que ce soit enough.All dont vous avez besoin est un algorithme externe pour jouer d'autres musiques formats.All viennent de l'autre format à l'origine de .wav, ils passent dans un algorithme, puis boom deviennent .ogg,.mp3,.whatever

1.As mentionnées précédemment pour .mp3JLayer.jar Vous pouvez importer ce pot dans votre projet comme une bibliothèque externe.

2. JavaZoom a également et d'autres bibliothèques pour soutenir .ogg, .speex, flac, .mp3, suivez le lien ci-dessus et télécharger le projet jlGui là, vous pouvez trouver les bibliothèques pour un grand nombre de formats.

Lien vers Stackoverflow sur How to play .wav files with java

Et http://alvinalexander.com/java/java-audio-example-java-au-play-sound Je ne sais pas si cela fonctionne toujours avec java 8

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.Clip; 
    import javax.sound.sampled.DataLine; 
    import javax.sound.sampled.LineEvent; 
    import javax.sound.sampled.LineListener; 
    import javax.sound.sampled.LineUnavailableException; 
    import javax.sound.sampled.UnsupportedAudioFileException; 


public class AudioPlayerExample1 implements LineListener { 

/** 
* this flag indicates whether the playback completes or not. 
*/ 
boolean playCompleted; 

/** 
* Play a given audio file. 
* @param audioFilePath Path of the audio file. 
*/ 
void play() { 
    File audioFile = new File("C:/Users/Alex.hp/Desktop/Musc/audio.wav"); 

    try { 
     AudioInputStream audioStream = AudioSystem.getAudioInputStream(audioFile); 

     AudioFormat format = audioStream.getFormat(); 

     DataLine.Info info = new DataLine.Info(Clip.class, format); 

     Clip audioClip = (Clip) AudioSystem.getLine(info); 

     audioClip.addLineListener(this); 

     audioClip.open(audioStream); 

     audioClip.start(); 

     while (!playCompleted) { 
      // wait for the playback completes 
      try { 
       Thread.sleep(1000); 
      } catch (InterruptedException ex) { 
       ex.printStackTrace(); 
      } 
     } 

     audioClip.close(); 

    } catch (UnsupportedAudioFileException ex) { 
     System.out.println("The specified audio file is not supported."); 
     ex.printStackTrace(); 
    } catch (LineUnavailableException ex) { 
     System.out.println("Audio line for playing back is unavailable."); 
     ex.printStackTrace(); 
    } catch (IOException ex) { 
     System.out.println("Error playing the audio file."); 
     ex.printStackTrace(); 
    } 
} 

/** 
* Listens to the START and STOP events of the audio line. 
*/ 
@Override 
public void update(LineEvent event) { 
    LineEvent.Type type = event.getType(); 

    if (type == LineEvent.Type.START) { 
     System.out.println("Playback started."); 

    } else if (type == LineEvent.Type.STOP) { 
     playCompleted = true; 
     System.out.println("Playback completed."); 
    } 
} 

public static void main(String[] args) { 
    AudioPlayerExample1 player = new AudioPlayerExample1(); 
    player.play(); 
} 

}

+0

Merci pour votre réponse. On dirait que toutes les solutions sauf la dernière reposent sur des bibliothèques tierces. A propos du dernier - pensez-vous qu'il pourrait jouer au format mp3? –

+0

@Irina Rapoport J'ai édité la réponse, donc au début il inclut un lien avec des solutions sur 'JavaFX'. Le code à la fin est seulement pour les fichiers' .wav'. Si vous voulez utiliser des bibliothèques tierces comme 'JLayer' , il est si facile que vous importez le .jar dans le projet, vous exécutez le code au début et le tour est joué! – GOXR3PLUS

+1

Merci pour l'édition. True RE 3rd party .jar, mais je ne lance pas de code tiers obscur sans le lire en premier, et qui a le temps pour ça? –