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

4

我正在尝试在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秒)的音效。 对于那些无法播放的片段(它们也是.wav格式),我会收到UnsupportedAudioFileException异常。 不工作的示例剪辑:链接 工作的示例剪辑:链接

1
也许您可以提供一些可用和不可用文件的示例链接? - ashes999
2
@ashes999:+1 WAV是一种容器格式,可能具有多种内部编码之一。Java Sound可以播放其中的一些编码,但不能播放其他编码。 @Derek:如果这是一个小程序,请使用URL(独占)而不是File。如果这不是小程序,请使用Clip而不是AudioClip - Andrew Thompson
好的,我调整了我的程序使用Clips,在执行该程序时出现了错误:UnsupportedAudioFileException。我使用了这个链接中的答案:link 来实现Clip。 - Derek
看一下这个问题,他有一个类似的问题:我注意到其中一个答案中提到了一个方法waitUntilDone()https://dev59.com/9nRB5IYBdhLWcg3wl4Kc - javing
顺便说一下 - 这两个链接都将我重定向到亚马逊的“Kindle”页面。那是怎么回事? - Andrew Thompson
2个回答

1

就像之前的人所说,有些WAV格式是不支持的。我会补充一些细节。

我经常遇到编码为24位或32位的WAV文件,而javax.sound.sampled支持的最大位数是16位。

如果您使用Windows系统,可以右键单击文件并检查属性和“摘要”选项卡来了解特定的.wav文件。我不知道MAC或Linux系统上的等效方法。

一旦您知道格式,您可以使用本教程中的代码检查它是否受支持: http://download.oracle.com/javase/tutorial/sound/converters.html 请参阅“编写声音文件”中的讨论,其中介绍了AudioSystem方法“isFileTypeSupported”。

这是我PC支持的格式列表。我通过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);

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接