java - 调用 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)。
解决方案
推荐阅读
- excel - 即使在命令行输入密码后,仍然提示输入密码
- rust - 如何在 Rust 中缺少 Copy 的借用元素向量上计算算术运算?
- google-analytics - 如何在谷歌分析中获取帖子网址
- kotlin - Ktor 提示来自基本身份验证块内的路由拦截器内的凭据
- reactjs - 受控的单选按钮警告使用 formik 字段处理它的值
- scala - Spark的LogisticRegression在哪里做数据标准化?
- javascript - 如何根据不同的登录在 Web 应用程序中创建多个视图?
- node.js - 使用以前下载的源代码重新创建 HTTP 触发器
- python - 加速和优化 Python 循环
- c++ - QLabel 没有正确更新