2008-08-25 143 views
153

我想能够在我的程序中播放声音文件。我应该在哪里看?如何在Java中播放声音?

+1

看看这个类:https://github.com/dberm22/DBoard/blob/master/src/com/dberm22/utils/MediaPlayer.java你可以调用它(新线程(new MediaPlayer(PATHTOFILE) ))。start(); – dberm22 2014-01-20 14:36:01

回答

116

我写了下面的代码工作正常。但我认为它只适用于.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(); 
} 
19

了一个坏榜样:

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

http://java.sun.com/products/jdk/faq/faq-sun-packages.html有使用sun.audio的公共API替代品 – McDowell 2009-04-23 13:44:06

+4

@GregHurlman不是太阳。 *包使我们的开发人员不使用? – 2010-06-10 14:00:07

+0

@Tom - 可能;我通常不会发现自己使用这种代码 – 2010-06-12 17:49:36

4

还有一种替代方法可以导入可在applet和应用程序中工作的声音文件:将音频文件转换为.java文件并在代码中简单地使用它们。

我开发了一个工具,使这个过程变得更容易。它相当简化了Java Sound API。

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

2

我创建了一个游戏框架较早前对Android和桌面,可处理声音也许可以作为灵感,你所需要的桌面部分的工作。

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

下面是参考代码。

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

} 
7

对于在java中播放声音,您可以参考以下代码。

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

我不想有太多的代码行来玩一个简单的该死的声音。这可以工作,如果你有JavaFX包(已经包含在我的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(); 
} 

注意:您需要登录initialize JavaFX。一个快速的方法来做到这一点,是调用JFXPanel的构造函数()曾经在您的应用程序:

static{ 
    JFXPanel fxPanel = new JFXPanel(); 
} 
3

无论出于何种原因,通过wchargin最多的回答是给我一个空指针错误我打电话这个时候。的getClass()。的getResourceAsStream()。

什么工作对我来说是以下几点:

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

而且我会用播放声音:

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

声音/效果/ sheep1.wav位于在我的项目的基本目录在Eclipse中(因此不在src文件夹中)。

-1

此线程相当老,但我确定了一个可能证明有用的选项。

除了使用Java AudioStream库之外,您可以使用Windows Media Player或VLC等外部程序,并通过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(); 
} 

这也将创建一个单独的过程,可以控制它的程序。

p.destroy(); 

当然,这将花费更长的时间比使用内部库来执行,但有可能是能够更快,并可能启动时不给予一定的控制台命令的GUI程序。

如果时间不是本质,那么这很有用。