使用clip.open启动音乐时出现Java负数组化异常
我目前正在尝试使用javax.sound.sampled将音乐引入我的程序, 我写了一个叫做music的方法,它应该在执行时启动一个音乐剪辑。事情是这样的:使用clip.open启动音乐时出现Java负数组化异常,java,javax.sound.sampled,Java,Javax.sound.sampled,我目前正在尝试使用javax.sound.sampled将音乐引入我的程序, 我写了一个叫做music的方法,它应该在执行时启动一个音乐剪辑。事情是这样的: public void playMusic(){ try { AudioInputStream astream = AudioSystem.getAudioInputStream( newFileInputStream("bin/ctk_tune.mp3"));
public void playMusic(){
try {
AudioInputStream astream = AudioSystem.getAudioInputStream(
newFileInputStream("bin/ctk_tune.mp3"));
AudioFormat baseFormat = astream.getFormat();
AudioFormat newFormat = new AudioFormat(
AudioFormat.Encoding.PCM_SIGNED,
baseFormat.getSampleRate(),
16,
baseFormat.getChannels(),
baseFormat.getChannels() * 2,
baseFormat.getSampleRate(),
false);
AudioInputStream dstream = AudioSystem.getAudioInputStream(
newFormat, astream);
Clip clip = AudioSystem.getClip();
clip.open(dstream);
clip.setFramePosition(0);
clip.start();
} catch(IOException ex) {
System.out.println("music not loaded : ");
ex.printStackTrace();
} catch (UnsupportedAudioFileException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (LineUnavailableException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
当我试着运行它时,我得到了一个未捕获的异常,程序没有启动,它说:
Exception in thread "main" java.lang.NegativeArraySizeException
at org.classpath.icedtea.pulseaudio.PulseAudioClip.open(PulseAudioClip.java:449)
at mainProgram.playMusic(mainProgram.java:211)
at mainProgram.<init>(mainProgram.java:67)
at Launcher.main(Launcher.java:16)
我认为您的代码在调用此方法时失败:
@Override
public void open(AudioInputStream stream)
throws LineUnavailableException, IOException {
byte[] buffer = new byte[(int) (stream.getFrameLength() *
stream.getFormat().getFrameSize())];
stream.read(buffer, 0, buffer.length);
open(stream.getFormat(), buffer, 0, buffer.length);
}
这似乎表明:
stream.getFrameLength() * stream.getFormat().getFrameSize()
给你一个负值。这将导致例外。。。我看不出在这个方法中会发生任何其他异常
我的猜测是,要么您创建流或格式描述符的方式有问题,要么您尝试播放的音频文件有问题
我建议您使用调试器来找出表达式为负值的原因。您是对的。使用system.out.print;我发现astream.getFormat和dstream.getFormat都与-1相同。然而,我不知道为什么我的音乐源代码是有效的音乐曲目。如果有人知道如何解决这个问题,我将非常感激。继续调试。如果使用调试器反向工作,则可以找出导致这些数字为负数的原因。