Como posso tocar som em Java?

Quero poder tocar arquivos de som no meu programa. Onde devo procurar?

 156
Author: pek, 2008-08-25

9 answers

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();
}
 117
Author: pek, 2016-06-08 05:54:48
 23
Author: yanchenko, 2012-04-01 17:10:58

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); 
 21
Author: Greg Hurlman, 2011-09-27 00:22:22
Não queria ter tantas linhas de código só para tocar um simples som. Isto 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();
}

Notice : You need to initialize JavaFX . Uma maneira rápida de fazer isso, é chamar o construtor de JFXPanel () uma vez em seu app:

static{
    JFXPanel fxPanel = new JFXPanel();
}
 8
Author: Cyril Duchon-Doris, 2017-05-23 11:54:51

Para tocar som em java, pode referir-se ao seguinte código.

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();
   }
}
 7
Author: Ishwor, 2015-05-29 20:04:16
Por alguma razão, a resposta principal do wchargin estava a dar-me um erro de ponteiro nulo quando eu estava a chamar isto.getClass().getresourceaasstream().

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 / ovinos 1.o wav foi localizado na pasta de base do meu projecto no Eclipse (por isso não está dentro da pasta src).

 4
Author: Andrew Jenkins, 2016-06-08 04:41:08

Existe uma alternativa para importar os ficheiros de som que funcionam tanto em applets como em aplicações: converter os ficheiros de áudio para .arquivos java e simplesmente usá-los em seu código.

Desenvolvi uma ferramenta que torna este processo muito mais fácil. Simplifica bastante a API de som Java.

Http://stephengware.com/projects/soundtoclass/

 4
Author: Stephen Ware, 2016-08-01 20:50:01

Eu criei um framework de jogo há algum tempo para trabalhar no Android e Desktop, a parte do desktop que lida com o som talvez possa 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 de 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();
        }
    }

}
 3
Author: hamilton.lima, 2013-03-29 01:01:01
Este tópico é bastante antigo, mas determinei uma opção que pode ser útil.

Em vez de usar a biblioteca Java AudioStream, poderá usar um programa externo como Windows Media Player ou VLC e executá-lo com um comando de consola através de 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();
}

Isto também irá criar um processo separado que pode ser controlado o programa.

p.destroy();

Claro que isto vai levar mais tempo a ser executado do que usando uma biblioteca interna, mas pode haver programas que podem iniciar-se mais rápido e possivelmente sem uma GUI dada certos comandos de console.

Se o tempo não é essencial, então isto é útil.
 -1
Author: Galen Nare, 2016-10-10 19:38:26