我试图在我用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/sound/sampled/AudioSystem.html#getClip()
它确实说,这个异常是抛出的“如果系统不支持至少一个剪辑实例通过任何已安装的混频器”,但我不明白这意味着什么。我该怎么解决这个问题?
值得注意的是,我正在使用IntelliJ IDEA (Linux) 34构建的OpenJDK 17作为我的音频系统(支持PulseAudio )。
发布于 2022-04-02 19:49:38
一个不太好的方法是使用AudioSystem.getClip(null);。我刚刚将我的一个项目迁移到Linux,我不得不重构我的代码,以便将这个方法包含到音频中。这不是最好的解决办法,但这是我能找到的最好的办法。
如果您想要一个更有建设性的解决方案,您可以像这样重构代码
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()。
https://stackoverflow.com/questions/69571313
复制相似问题