Comment puis-je jouer du son en Java?

Je veux pouvoir lire des fichiers audio dans mon programme. Où devrais-je regarder?

J’ai écrit le code suivant qui fonctionne bien. Mais je pense que cela ne fonctionne qu’avec le format .wav .

 public static synchronized void playSound(final Ssortingng url) { new Thread(new Runnable() { // The wrapper thread is unnecessary, unless it blocks on the // Clip finishing; see comments. public void run() { try { Clip clip = AudioSystem.getClip(); AudioInputStream inputStream = AudioSystem.getAudioInputStream( Main.class.getResourceAsStream("/path/to/sounds/" + url)); clip.open(inputStream); clip.start(); } catch (Exception e) { System.err.println(e.getMessage()); } } }).start(); } 

Le Sound Trail du Java Tutorial vaut le sharepoint départ.

Un mauvais exemple:

 import sun.audio.*; //import the sun.audio package import java.io.*; //** add this into your application code as appropriate // Open an input stream to the audio file. InputStream in = new FileInputStream(Filename); // Create an AudioStream object from the input stream. AudioStream as = new AudioStream(in); // Use the static class member "player" from class AudioPlayer to play // clip. AudioPlayer.player.start(as); // Similarly, to stop the audio. AudioPlayer.player.stop(as); 

Je ne voulais pas avoir autant de lignes de code juste pour jouer un simple son. Cela peut fonctionner si vous avez le package JavaFX (déjà inclus dans mon jdk 8).

 private static void playSound(Ssortingng sound){ // cl is the ClassLoader for the current class, ie. CurrentClass.class.getClassLoader(); URL file = cl.getResource(sound); final Media media = new Media(file.toSsortingng()); final MediaPlayer mediaPlayer = new MediaPlayer(media); mediaPlayer.play(); } 

Remarque: vous devez initialiser JavaFX . Un moyen rapide de le faire consiste à appeler le constructeur de JFXPanel () une fois dans votre application:

 static{ JFXPanel fxPanel = new JFXPanel(); } 

Pour jouer du son en Java, vous pouvez vous référer au code suivant.

 import java.io.*; import java.net.URL; import javax.sound.sampled.*; import javax.swing.*; // To play sound using Clip, the process need to be alive. // Hence, we use a Swing application. public class SoundClipTest extends JFrame { public SoundClipTest() { this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setTitle("Test Sound Clip"); this.setSize(300, 200); this.setVisible(true); try { // Open an audio input stream. URL url = this.getClass().getClassLoader().getResource("gameover.wav"); AudioInputStream audioIn = AudioSystem.getAudioInputStream(url); // Get a sound clip resource. Clip clip = AudioSystem.getClip(); // Open audio clip and load samples from the audio input stream. clip.open(audioIn); clip.start(); } catch (UnsupportedAudioFileException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (LineUnavailableException e) { e.printStackTrace(); } } public static void main(Ssortingng[] args) { new SoundClipTest(); } } 

Pour une raison quelconque, la réponse en haut de wchargin me donnait une erreur de pointeur nul lorsque j’appelais this.getClass (). GetResourceAsStream ().

Ce qui a fonctionné pour moi était le suivant:

 void playSound(Ssortingng soundFile) { File f = new File("./" + soundFile); audioIn = AudioSystem.getAudioInputStream(f.toURI().toURL()); Clip clip = AudioSystem.getClip(); clip.open(audioIn); clip.start(); } 

Et je jouerais le son avec:

  playSound("sounds/effects/sheep1.wav"); 

sounds / effects / sheep1.wav se trouvait dans le répertoire de base de mon projet dans Eclipse (donc pas dans le dossier src).

Il existe une alternative à l’importation des fichiers audio fonctionnant à la fois dans les applets et les applications: convertissez les fichiers audio en fichiers .java et utilisez-les simplement dans votre code.

J’ai développé un outil qui rend ce processus beaucoup plus facile. Cela simplifie un peu l’API Java Sound.

http://stephengware.com/projects/soundtoclass/

J’ai créé une structure de jeu il y a quelque temps pour travailler sur Android et Desktop, la partie de bureau qui gère le son peut être utilisée comme source d’inspiration.

https://github.com/hamilton-lima/jaga/blob/master/jaga%20desktop/src-desktop/com/athanazio/jaga/desktop/sound/Sound.java

Voici le code de référence.

 package com.athanazio.jaga.desktop.sound; import java.io.BufferedInputStream; import java.io.IOException; import java.io.InputStream; import javax.sound.sampled.AudioFormat; import javax.sound.sampled.AudioInputStream; import javax.sound.sampled.AudioSystem; import javax.sound.sampled.DataLine; import javax.sound.sampled.LineUnavailableException; import javax.sound.sampled.SourceDataLine; import javax.sound.sampled.UnsupportedAudioFileException; public class Sound { AudioInputStream in; AudioFormat decodedFormat; AudioInputStream din; AudioFormat baseFormat; SourceDataLine line; private boolean loop; private BufferedInputStream stream; // private ByteArrayInputStream stream; /** * recreate the stream * */ public void reset() { try { stream.reset(); in = AudioSystem.getAudioInputStream(stream); din = AudioSystem.getAudioInputStream(decodedFormat, in); line = getLine(decodedFormat); } catch (Exception e) { e.printStackTrace(); } } public void close() { try { line.close(); din.close(); in.close(); } catch (IOException e) { } } Sound(Ssortingng filename, boolean loop) { this(filename); this.loop = loop; } Sound(Ssortingng filename) { this.loop = false; try { InputStream raw = Object.class.getResourceAsStream(filename); stream = new BufferedInputStream(raw); // ByteArrayOutputStream out = new ByteArrayOutputStream(); // byte[] buffer = new byte[1024]; // int read = raw.read(buffer); // while( read > 0 ) { // out.write(buffer, 0, read); // read = raw.read(buffer); // } // stream = new ByteArrayInputStream(out.toByteArray()); in = AudioSystem.getAudioInputStream(stream); din = null; if (in != null) { baseFormat = in.getFormat(); decodedFormat = new AudioFormat( AudioFormat.Encoding.PCM_SIGNED, baseFormat .getSampleRate(), 16, baseFormat.getChannels(), baseFormat.getChannels() * 2, baseFormat .getSampleRate(), false); din = AudioSystem.getAudioInputStream(decodedFormat, in); line = getLine(decodedFormat); } } catch (UnsupportedAudioFileException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (LineUnavailableException e) { e.printStackTrace(); } } private SourceDataLine getLine(AudioFormat audioFormat) throws LineUnavailableException { SourceDataLine res = null; DataLine.Info info = new DataLine.Info(SourceDataLine.class, audioFormat); res = (SourceDataLine) AudioSystem.getLine(info); res.open(audioFormat); return res; } public void play() { try { boolean firstTime = true; while (firstTime || loop) { firstTime = false; byte[] data = new byte[4096]; if (line != null) { line.start(); int nBytesRead = 0; while (nBytesRead != -1) { nBytesRead = din.read(data, 0, data.length); if (nBytesRead != -1) line.write(data, 0, nBytesRead); } line.drain(); line.stop(); line.close(); reset(); } } } catch (IOException e) { e.printStackTrace(); } } } 

Ce fil est assez ancien mais j’ai déterminé une option qui pourrait s’avérer utile.

Au lieu d’utiliser la bibliothèque Java AudioStream , vous pouvez utiliser un programme externe tel que Windows Media Player ou VLC et l’exécuter avec une commande de console via Java.

 Ssortingng command = "\"C:/Program Files (x86)/Windows Media Player/wmplayer.exe\" \"C:/song.mp3\""; try { Process p = Runtime.getRuntime().exec(command); catch (IOException e) { e.printStackTrace(); } 

Cela créera également un processus distinct qui peut être contrôlé par le programme.

 p.destroy(); 

Bien sûr, l’exécution de cette tâche prendra plus de temps qu’avec une bibliothèque interne, mais il peut exister des programmes qui peuvent démarrer plus rapidement et éventuellement sans interface graphique pour certaines commandes de la console.

Si le temps n’est pas essentiel, cela est utile.