首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IllegalArgumentException在调用AudioSystem.getClip()时

IllegalArgumentException在调用AudioSystem.getClip()时
EN

Stack Overflow用户
提问于 2021-10-14 13:09:27
回答 1查看 171关注 0票数 0

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

即使在这样的最小程度上,错误也可以再现:

代码语言:javascript
复制
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();
    }
}

运行此操作将给出以下堆栈跟踪:

代码语言:javascript
复制
/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/sound/sampled/AudioSystem.html#getClip()

它确实说,这个异常是抛出的“如果系统不支持至少一个剪辑实例通过任何已安装的混频器”,但我不明白这意味着什么。我该怎么解决这个问题?

值得注意的是,我正在使用IntelliJ IDEA (Linux) 34构建的OpenJDK 17作为我的音频系统(支持PulseAudio )。

EN

回答 1

Stack Overflow用户

发布于 2022-04-02 19:49:38

一个不太好的方法是使用AudioSystem.getClip(null);。我刚刚将我的一个项目迁移到Linux,我不得不重构我的代码,以便将这个方法包含到音频中。这不是最好的解决办法,但这是我能找到的最好的办法。

如果您想要一个更有建设性的解决方案,您可以像这样重构代码

代码语言:javascript
复制
File soundFile = new File("/full/path/to/sound.wav");
AudioInputStream soundIn = AudioSystem.getAudioInputStream(soundFile);
AudioFormat format = soundIn.getFormat();
DataLine.Info info = new DataLine.Info(Clip.class, format);
Clip clip = (Clip)AudioSystem.getLine(info);
clip.open(soundIn);
clip.start();

这里的神奇之处在于soundIn.getFormat()

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69571313

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档