要从 Java 小程序中输出声音,需要哪些软件包?

要从 Java 小程序中输出声音,需要哪些软件包?

我有一个非常简约使用 debootstrap 创建的 ubuntu precise 设置。因此,请不要仅仅因为通常安装了任何软件包就认为它们已经安装。在该系统上,我想从 Java 小程序播放一些声音。但是,这总是失败并显示以下错误消息:

javax.sound.midi.MidiUnavailableException: Can not open line
    at com.sun.media.sound.SoftSynthesizer.open(SoftSynthesizer.java:1132)
    at com.sun.media.sound.SoftSynthesizer.open(SoftSynthesizer.java:1036)
    ...
Caused by: java.lang.IllegalArgumentException: No line matching interface
        SourceDataLine supporting format PCM_SIGNED 44100.0 Hz,
        16 bit, stereo, 4 bytes/frame, little-endian is supported.
    at javax.sound.sampled.AudioSystem.getLine(AudioSystem.java:476)
    at javax.sound.sampled.AudioSystem.getSourceDataLine(AudioSystem.java:604)
    at com.sun.media.sound.SoftSynthesizer.open(SoftSynthesizer.java:1066)
    ... 35 more

由于消息中提到了软合成器和 pcm 线路,我估计缺少某些 midi 守护进程不是问题所在。据我所知,已加载 alsa 内核模块,包括snd_hda_intelsnd_pcmsnd_seq_midi。我还包含了alsa-basealsa 实用程序我安装中的包。alsa-mixer看起来不错,使用“HDA Intel PCH”作为其默认设备。

java 需要哪些其他包、配置设置或守护进程启动才能使其声音输出正常工作?

答案1

我自己已经解决了这个问题。使用strace(我喜欢这个工具!),我发现 java 尝试访问各种 alsa 声音控制设备。其中大多数都不存在(ENOENT),但第一个也是主要的设备给出(EPERM),表示权限不足。

从这里开始,修复就很明显了:有问题的设备属于该audio组,但运行有问题的 Java 小程序的用户不属于该组。将他添加到该组后,错误消息就消失了。

我仍然听不到任何声音,但这可能是由于小程序本身的其他问题造成的。

相关内容