这很奇怪。我试图通过Java AudioSystem和AudioSystem.getClip()
播放一些声音。这些文件都是" PCM_SIGNED,22.050.0 Hz,16位,单声道,2字节/帧,小端"。
在几个Ubuntu 16.4 LTS Linux机器上,PulseAudio用Invalid Format Exception
拒绝这种格式,因为唯一接受的格式似乎是" PCM_SIGNED,未知采样率,16位,立体声,4字节/帧,big endian"。
我已经尝试重新采样我的WAV以匹配这个奇怪的约束,但无济于事。 AudioSystem.getAudioInputStream()
毋庸置疑,在Mac OS和Windows上也能正常运行。使用sox
库和play file.wav
答案 0 :(得分:0)
好的,解决了。
通常如果有人问,如何使用Java播放WAV,这是最常见的答案:
AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(DragonflyApp.class.getResource("/resources/" + soundFile));
clip = AudioSystem.getClip();
clip.addLineListener(e -> {
if (e.getType() == LineEvent.Type.STOP) {
// Do something on end of playback
}
});
clip.open(audioInputStream);
clip.start();
不幸的是,在某些Linux系统上,这最终会导致“#34; Invalid Format" PulseAudio抛出异常,声称无法播放最简单的WAV文件(见上文)。
解决方法是在Linux下使用此序列。它通常也适用于MacOS,但最终" STOP"指示来得很晚(播放结束后大约5s),所以我在这里进行了条件执行:
这适用于Linux(至少在Ubunutu 16.04上),其中包含以前被PulseAudio拒绝的剪辑:
DataPusher datapusher = null;
DataLine.Info lineinfo = null;
SourceDataLine sourcedataline = null;
lineinfo = new DataLine.Info(SourceDataLine.class, audioInputStream.getFormat());
if (!(AudioSystem.isLineSupported(lineinfo))) {
return;
}
sourcedataline = (SourceDataLine) AudioSystem.getLine(lineinfo);
sourcedataline.addLineListener(e -> {
if (e.getType() == LineEvent.Type.STOP) {
// Do something on end of playback
}
});
datapusher = new DataPusher(sourcedataline, audioInputStream);
datapusher.start();
有条件地使用这两个代码段:
if (System.getProperty("os.name").equals("Mac OS X")) {
// The clip solution
}
else {
// The datapusher solution
}
希望,这有助于其他人,他们也会遇到这个问题。