Java AudioSystem.wav文件行为不一致
我有许多从Java播放的.wav文件。在这个简化的示例中,“滴水”是可以听到的,但“嗖嗖”不是,即使它们通过相同的代码运行。“swish”似乎没有什么不寻常之处:它在Gnome桌面上播放。我有一个类似的应用程序,不是很精简,它可以播放“嗖嗖”而不是“滴水”,所以它似乎也不是一个与数据性质相关的问题 你知道这里发生了什么吗?在一个重建的系统上“重新部署”了已知可用的代码之后,人们注意到了这个bug:重新安装了Ubuntu 10.10和Eclipse Indigo。这个错误发生在Sun JDK 6和OpenJDK 6上编辑重建后的系统实际上也是不同的硬件:Intel E6500(2核,2.93 GHz)我只安装了Ubuntu、Eclipse、OpenJDK和Sun JDK。以前的系统是AMD630(4核,2.8GHz),带有Ubuntu、Eclipse和OpenJDK(我想) 编辑经过一些实验后,似乎加载的第一个剪辑会起作用。TestSounder构造函数加载它们,这样就可以颠倒顺序。也许使用静态方法AudioSystem.getLine与此有关,因为这显然是非面向对象的操作Java AudioSystem.wav文件行为不一致,java,audio,wav,javasound,Java,Audio,Wav,Javasound,我有许多从Java播放的.wav文件。在这个简化的示例中,“滴水”是可以听到的,但“嗖嗖”不是,即使它们通过相同的代码运行。“swish”似乎没有什么不寻常之处:它在Gnome桌面上播放。我有一个类似的应用程序,不是很精简,它可以播放“嗖嗖”而不是“滴水”,所以它似乎也不是一个与数据性质相关的问题 你知道这里发生了什么吗?在一个重建的系统上“重新部署”了已知可用的代码之后,人们注意到了这个bug:重新安装了Ubuntu 10.10和Eclipse Indigo。这个错误发生在Sun JDK 6和
import java.io.IOException;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.Clip;
import javax.sound.sampled.UnsupportedAudioFileException;
import javax.sound.sampled.LineUnavailableException;
public class TestSounder
{
String resourcePathFromBin = "/resources/";
Clip dripClip;
Clip swishClip;
public TestSounder()
{
dripClip = setupClip("drip.wav");
swishClip = setupClip("swish.wav");
}
public void close()
{
dripClip.close();
swishClip.close();
}
private Clip setupClip(String fileName)
{
Clip clip = null;
try
{
AudioInputStream ais =
AudioSystem.getAudioInputStream(this.getClass().getResourceAsStream(resourcePathFromBin +
fileName));
AudioFormat af = ais.getFormat();
DataLine.Info lineInfo = new DataLine.Info(Clip.class, af);
clip = (Clip)AudioSystem.getLine(lineInfo);
clip.open(ais);
}
catch (UnsupportedAudioFileException e)
{
assert false: "bug";
}
catch (IOException e)
{
assert false: "bug";
}
catch (LineUnavailableException e)
{
assert false: "bug";
}
return clip;
}
public void go(UtilityK.Sounds s)
{
Clip clip = null;
if (s == UtilityK.Sounds.drip)
clip = dripClip;
if (s == UtilityK.Sounds.swish)
clip = swishClip;
clip.stop();
clip.setFramePosition(0);
clip.start();
//while (clip.isRunning())
// TestSounder.delay();
}
public static void main(String[] args)
{
TestSounder obj = new TestSounder();
obj.go(UtilityK.Sounds.swish);
TestSounder.delay();
obj.go(UtilityK.Sounds.drip);
TestSounder.delay();
obj.go(UtilityK.Sounds.swish);
TestSounder.delay();
obj.go(UtilityK.Sounds.drip);
TestSounder.delay();
obj.close();
}
private static void delay()
{
Thread.sleep(5000);
}
}
public interface UtilityK
{
enum Sounds { drip, swish };
}
这里有另一种方法。它似乎非常适合于可能需要经常播放或作为用户反馈快速连续播放的短音
这两个WAV的编码和格式是什么?顺便说一句,对于所有捕获,调用
e.printStackTrace()
@Andrew Thompson,我使用一个web服务将一些声音转换为.wav。我不记得原来的格式是什么。我有11个这样的文件,所有这些文件都在我以前的计算机上使用相同的源代码…打开这些wav时,堆栈跟踪的输出是什么?在AudioInputStream的declare/assign下,swish.wav
和drip.wav
的堆栈都是相同的。我还有另一个重建的系统和这个它又坏了。它挂在静态方法AudioSystem.getLine中。值得注意的是,这些Java音频对象的脆弱性在于,最好在不完全需要此类功能的项目中省略此类功能。