如何在Java中播放不同的声音?

问题描述:

我想在java中播放声音......如何在Java中播放不同的声音?

private Clip clip; 

public Sound(String filename) 
{ 
    try{ 
     AudioInputStream ais; 
     ais = AudioSystem.getAudioInputStream(this.getClass().getResource(filename)); 
     clip = AudioSystem.getClip(); 
     clip.open(ais); 
    }catch(Exception e){e.printStackTrace();} 

} 
public void playSFX() 
{ 
    clip.stop(); 
    clip.setFramePosition(0); 
    clip.start(); 
} 

我用.wav文件上面的代码。我可以成功播放某些.wav剪辑;但是我无法播放其他.wav剪辑。我究竟做错了什么? 还要注意:我想播放简短的(< 3秒)音效。 我得到UnsupportedAudioFileException为某些不播放的剪辑(它们也是.wav)。 抽样工作剪辑:link 示例工作剪辑:link

+1

也许你可以提供示例链接到文件的工作和不工作? – ashes999 2011-05-30 00:47:56

+2

@ ashes999:+1 WAV是一种容器格式,可能有多种内部编码。 Java Sound将播放其中一些编码,但不包含其他编码。 @Derek:如果这是一个applet,请使用'URL'(专有)而不是'File'。如果这不是一个小程序,使用'Clip'而不是'AudioClip'。 – 2011-05-30 01:04:13

+0

好的,我调整了我的程序来使用剪辑,而我得到错误:UnsupportedAudioFileException。我用这个答案:[链接](http://stackoverflow.com/questions/2246809/how-to-play-sounds-in-java-games)来实现剪辑。 – Derek 2011-05-30 01:58:44

据我所知,某些格式不支持。请检查那些工作和不工作的WAV格式。

通过格式我的意思是这样的位置:http://en.wikipedia.org/wiki/WAV#WAV_file_compression_codecs_compared

然后,你可以转换成其作品格式。

正如以前的人所说,一些WAV格式不支持。我只会添加更多的细节。

当16位是javax.sound.sampled支持的最大值时,我经常遇到以24位或32位编码的WAV。

要了解特定的.wav文件,如果您有Windows,可以右键单击该文件并检查属性和“摘要”选项卡。我不知道MAC或Linux系统上的等价物是什么。

一旦你知道的格式,您可以如果在本教程中的代码支持的检查: http://download.oracle.com/javase/tutorial/sound/converters.html 参见“写作声音文件”,他们介绍AudioSystem方法,“isFileTypeSupported”的讨论。

这是我的电脑支持的格式列表。通过Eclipse调试器检查LineInfo对象,我得到了这个列表。我怀疑这些是标准的,但我不知道:

BigEndian = false, PCM_UNSIGNED, channels = 1, bits = 8 
BigEndian = false, PCM_SIGNED, channels = 1, bits = 8 
BigEndian = false, PCM_SIGNED, channels = 1, bits = 16 
BigEndian = true, PCM_SIGNED, channels = 1, bits = 16 
BigEndian = false, PCM_UNSIGNED, channels = 2, bits = 8 
BigEndian = false, PCM_SIGNED, channels = 2, bits = 8 
BigEndian = false, PCM_SIGNED, channels = 2, bits = 16 
BigEndian = true, PCM_SIGNED, channels = 2, bits = 16 
我工作的第二到最后在上面的列表

大多数WAV文件:小尾数,16位,PCM_SIGNED,立体声,编码在44100 fps。

以下代码也可以帮助您找出.wav文件的格式。

InputStream inStream = YourClass.class.getResourceAsStream("YourSound.wav"); 
AudioInputStream aiStream = AudioSystem.getAudioInputStream(inStream); 
AudioFormat audioFmt = aiStream.getFormat();    
DataLine.Info info = new DataLine.Info(SourceDataLine.class, audioFmt); 
System.out.println(info);