Следующий код отлично работает в 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)
Пожалуйста, любые идеи, что не так?
Ваша проблема начинается перед вашей трассировкой стека:
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
}
bell.wav
в вашей среде Linux? Все, что я знаю, это то, чтоbell.wav
- это системный звук Windows (если память мне не изменяет).