【问题标题】:Ubuntu 16.4, Java, WAV file playbackUbuntu 16.4、Java、WAV文件播放
【发布时间】:2018-08-23 06:58:03
【问题描述】:

这是一件很奇怪的事情。我正在尝试通过 Java AudioSystem 和AudioSystem.getClip() 播放一些声音。这些文件都是“PCM_SIGNED, 22.050.0 Hz, 16 bit, mono, 2 bytes/frame, little endian”。

在几个 Ubuntu 16.4 LTS Linux 机器上,这种格式被 PulseAudio 拒绝并带有 Invalid Format Exception,因为唯一接受的格式似乎是“PCM_SIGNED,未知采样率,16 位,立体声,4 字节/帧,大端”。

我已经尝试重新采样我的 WAV 以匹配这个奇怪的约束,但无济于事。 AudioSystem.getAudioInputStream() 甚至不再接受这些。

不用说,这同样适用于 Mac OS 和 Windows。而且使用sox库和play file.wav播放这些文件也没有问题

【问题讨论】:

    标签: java ubuntu wav


    【解决方案1】:

    好的,解决了。

    通常如果有人问,如何使用 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 系统上,这最终会导致 PulseAudio 抛出“格式无效”异常,该异常声称无法播放最简单的 WAV 文件(见上文)。

    解决方法是在 Linux 下使用此序列。它通常也适用于 MacOS,但最终的“STOP”指示出现得很晚(播放结束后大约 5 秒),所以我在这里进行条件执行:

    这适用于带有剪辑的 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();
    

    两个代码sn-ps都有条件使用:

    if (System.getProperty("os.name").equals("Mac OS X")) {
        // The clip solution
    }
    else {
        // The datapusher solution
    }
    

    希望,这可以帮助其他也会遇到这个问题的人。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-15
      • 2011-01-25
      • 1970-01-01
      • 2011-04-18
      • 1970-01-01
      • 2010-11-19
      • 2012-12-02
      • 1970-01-01
      相关资源
      最近更新 更多