Звук Java прекрасно работает в Windows, в Linux мы получили исключение LineUnavailableException

1

Следующий код отлично работает в 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();

Но это вызывает исключение javax.sound.sampled.LineUnavailableException при запуске в Linux:

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
    В каком каталоге Windows работает это приложение? Кроме того, где находится bell.wav в вашей среде Linux? Все, что я знаю, это то, что bell.wav - это системный звук Windows (если память мне не изменяет).
  • 0
    Нет. WAV - это стандартный аудио-формат, а не Windows
Показать ещё 2 комментария
Теги:
javasound

1 ответ

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-окне, тогда ошибка выше имеет смысл.

Прежде чем пытаться воспроизвести файл, вы должны убедиться, что он существует в файловой системе, и у вас есть к нему доступ.

Что-то вроде:

// if all your sound files are in the same directory
// you can make this final and set it in your sound
// player 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
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню