Como posso reproduzir som em Java?

Eu quero ser capaz de reproduzir arquivos de som no meu programa. Onde devo procurar?

Eu escrevi o seguinte código que funciona bem. Mas acho que só funciona com o formato .wav .

 public static synchronized void playSound(final String 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(); } 

O Sound Trail do Java Tutorial vale a pena ser o ponto de partida.

Um mau exemplo:

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

Eu não queria ter tantas linhas de código apenas para tocar um maldito som. Isso pode funcionar se você tiver o pacote JavaFX (já incluído no meu jdk 8).

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

Aviso: Você precisa inicializar o JavaFX . Uma maneira rápida de fazer isso é chamar o construtor de JFXPanel () uma vez no seu aplicativo:

 static{ JFXPanel fxPanel = new JFXPanel(); } 

Para reproduzir som em java, você pode consultar o código a seguir.

 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(String[] args) { new SoundClipTest(); } } 

Por alguma razão, a resposta top por wchargin estava me dando um erro de ponteiro nulo quando eu estava chamando this.getClass (). GetResourceAsStream ().

O que funcionou para mim foi o seguinte:

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

E eu tocaria o som com:

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

sons / efeitos / sheep1.wav foi localizado no diretório base do meu projeto no Eclipse (portanto, não dentro da pasta src).

Existe uma alternativa para importar os arquivos de som que funcionam em applets e aplicativos: converta os arquivos de áudio em arquivos .java e simplesmente use-os em seu código.

Eu desenvolvi uma ferramenta que torna este processo muito mais fácil. Ele simplifica bastante a API do Java Sound.

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

Eu criei um framework de jogo algum tempo atrás para trabalhar com Android e Desktop, a parte de desktop que lida com o som pode ser usada como inspiração para o que você precisa.

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

Aqui está o código para referência.

 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(String filename, boolean loop) { this(filename); this.loop = loop; } Sound(String 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(); } } } 

Esse segmento é bastante antigo, mas determinei uma opção que poderia ser útil.

Em vez de usar a biblioteca Java AudioStream , você poderia usar um programa externo como o Windows Media Player ou o VLC e executá-lo com um comando do console por meio do Java.

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

Isso também irá criar um processo separado que pode ser controlado pelo programa.

 p.destroy(); 

É claro que isso levará mais tempo para ser executado do que usar uma biblioteca interna, mas pode haver programas que possam ser iniciados mais rapidamente e, possivelmente, sem uma GUI, dados determinados comandos do console.

Se o tempo não é essencial, isso é útil.