Ubuntu 16.4,Java,WAV文件播放

时间:2018-03-14 16:25:06

标签: java ubuntu wav

这很奇怪。我试图通过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

播放这些文件也没有问题

1 个答案:

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

希望,这有助于其他人,他们也会遇到这个问题。