以下代码在Windows上完美运行:
File soundFile = new File("bell.wav");
AudioInputStream ais = AudioSystem.getAudioInputStream(soundFile);
Clip clip = AudioSystem.getClip();
clip.open(ais);
clip.setFramePosition(0);
clip.start();
Thread.sleep(clip.getMicrosecondLength()/1000);
clip.stop();
clip.close();
但是在Linux上启动时会导致javax.sound.sampled.LineUnavailableException
异常:
No protocol specified
xcb_connection_has_error() вернул true
Home directory not accessible: Отказано в доступе
No protocol specified
javax.sound.sampled.LineUnavailableException
at org.classpath.icedtea.pulseaudio.PulseAudioMixer.openImpl(PulseAudioMixer.java:714)
at org.classpath.icedtea.pulseaudio.PulseAudioMixer.openLocal(PulseAudioMixer.java:588)
at org.classpath.icedtea.pulseaudio.PulseAudioMixer.openLocal(PulseAudioMixer.java:584)
at org.classpath.icedtea.pulseaudio.PulseAudioMixer.open(PulseAudioMixer.java:579)
at org.classpath.icedtea.pulseaudio.PulseAudioDataLine.open(PulseAudioDataLine.java:94)
at org.classpath.icedtea.pulseaudio.PulseAudioDataLine.open(PulseAudioDataLine.java:283)
at org.classpath.icedtea.pulseaudio.PulseAudioClip.open(PulseAudioClip.java:402)
at org.classpath.icedtea.pulseaudio.PulseAudioClip.open(PulseAudioClip.java:453)
at beans.SoundDriver.PlayText(SoundDriver.java:41)
请,任何想法,出了什么问题?
答案 0 :(得分:1)
您的问题在堆栈跟踪之前开始:
No protocol specified
xcb_connection_has_error() вернул true
Home directory not accessible: Отказано в доступе
No protocol specified
这告诉您无法访问您的主目录,并且拒绝访问它。这意味着它不存在,或者您有权限问题。如果您的音频文件位于您的主目录中,则您的程序无法访问它以进行播放。
File soundFile = new File("bell.wav");
这可能是另一个问题(或问题的一部分)。当您运行代码时,bell.wav
可能不在您的工作目录中......所以,如果您没有修改代码以指向您的linux文件夹中的此文件,那么上面的错误是有意义的。< / p>
在尝试播放文件之前,您应该验证它是否存在于文件系统上,并且您可以访问它。
类似的东西:
// if all your sound files are in the same directory
// you can make this final and set it in your sound
// player's constructor...
private final File soundDir;
public MySoundPlayer(final File soundDir) {
this.soundDir = soundDir;
}
// ...
public void playSound(final String soundFileName) {
File soundFile = new File(soundDir, soundFileName);
if (!soundFind.exists()) {
// do something here, maybe throw exception...
// or return out of your function early...
throw new IllegalArgumentException(
"Cannot access sound file: " + soundFileName);
}
// if you made it to here, now play your file
}