我只是尝试使用javax.sound.sampled库播放声音片段,使用我在文档中找到的最基本的示例。我已经看到了几十个这样编码的例子,它们似乎都可以工作,文件只有174KB所以它不像我想要播放整个音乐会:
public static void main(String[] args) throws UnsupportedAudioFileException, IOException, LineUnavailableException {
// TODO Auto-generated method stub
Clip clip;
AudioInputStream sound = AudioSystem.getAudioInputStream(new File("test.wav"));
AudioFormat format = sound.getFormat();
DataLine.Info info = new DataLine.Info(Clip.class, format);
clip = (Clip)AudioSystem.getLine(info);
clip.open(sound);
clip.start();
}
...这会产生错误:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at com.sun.media.sound.DirectAudioDevice$DirectClip.open(DirectAudioDevice.java:1131)
at test.main(test.java:21)
我几乎不知道造成这种情况的原因,我已经尝试增加JVM的内存限制,这根本没有帮助。我将非常感谢您提供的任何帮助。
答案 0 :(得分:0)
将以下内容添加到Java命令
-XX:+HeapDumpOnOutOfMemory
获取OOM后,JVM将生成二进制堆转储,您可以使用Eclipse MAT或VisualVM(JDK附带)等工具。这将显示堆中保留的数据。
答案 1 :(得分:0)
我只是查看源自异常的源,并且在此方法中它尝试分配大小的字节缓冲区
audioInputStream.getFrameLength() * audioInputStream.getFormat().getFrameSize()
如果audioInputStream.getFrameLength()
返回除-1以外的任何其他内容。因此,您的媒体文件可能会返回这些参数中的任何一个的异常值,导致此代码尝试分配非常大的内存块。我建议你检查你为你的wav文件计算的值是这样的:
AudioInputStream sound = AudioSystem.getAudioInputStream(new File("test.wav"));
System.out.println( "frame length: " + sound.getFrameLength() );
System.out.println( "frame size: " + sound.getFormat().getFrameSize() );