首页 > 解决方案 > 调用 AudioSystem.getClip() 时出现 IllegalArgumentException

问题描述

我正在尝试在我用 Java 制作的俄罗斯方块风格的游戏中播放音频,我不想引入任何外部依赖项来做到这一点。当寻找在没有外部库的情况下在 Java 中播放音频的方法时,我发现AudioSystem.getClip()这似乎给了我想要的东西。但是,当我使用它时,会立即抛出 IllegalArgumentException。

即使像这样最小的东西也可以重现错误:

import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.sound.sampled.LineUnavailableException;

public class AudioTest {
    public static void main(String[] args) throws LineUnavailableException {
        final Clip clip = AudioSystem.getClip();
    }
}

运行它会给我以下堆栈跟踪:

/mnt/storage/Programs/Flatpak/runtime/org.freedesktop.Sdk.Extension.openjdk17/x86_64/21.08/active/files/jvm/openjdk-17/bin/java -javaagent:/app/idea-IC/lib/idea_rt.jar=37847:/app/idea-IC/bin -Dfile.encoding=UTF-8 -classpath /mnt/storage/Programming/audio-test/out/production/audio-test AudioTest
Exception in thread "main" java.lang.IllegalArgumentException: No line matching interface Clip supporting format PCM_SIGNED unknown sample rate, 16 bit, stereo, 4 bytes/frame, big-endian is supported.
    at java.desktop/javax.sound.sampled.AudioSystem.getLine(AudioSystem.java:425)
    at java.desktop/javax.sound.sampled.AudioSystem.getClip(AudioSystem.java:461)
    at AudioTest.main(AudioTest.java:7)

Process finished with exit code 1

那么我在这里可能做错了什么?如果我正确阅读了文档,则无需为此方法提供任何参数:https ://docs.oracle.com/en/java/javase/11/docs/api/java.desktop/javax/声音/采样/AudioSystem.html#getClip()

它确实说“如果系统不通过任何已安装的混音器支持至少一个剪辑实例”,则会引发此异常,但我并不特别明白这意味着什么。我应该如何解决这个问题?

对于它的价值,我正在使用带有 OpenJDK 17 的 IntelliJ IDEA 社区,由 Flathub 在 Fedora (Linux) 34 上使用 PipeWire 作为我的音频系统(支持 PulseAudio)。

标签: javaruntime-errorillegalargumentexceptionjava-17

解决方案


推荐阅读