Java声音在Windows中非常完美,在Linux中我们得到了LineUnavailableException

时间:2015-02-05 15:28:56

标签: java linux javasound

以下代码在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)  

请,任何想法,出了什么问题?

1 个答案:

答案 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
}