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

时间:2011-05-30 00:47:17

标签: java audio

我正试图在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

2 个答案:

答案 0 :(得分:1)

正如之前的人所说,不支持某些WAV格式。我只想补充一点细节。

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

要了解特定的.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);

答案 1 :(得分:0)

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

格式我的意思是:http://en.wikipedia.org/wiki/WAV#WAV_file_compression_codecs_compared

然后你就可以转换为有效的格式。