Отрицательное исключение массива Java при запуске музыки с clip.open

В настоящее время я пытаюсь запустить музыку в моей программе, используя javax.sound.sampledи я написал метод, называемый музыкой, который должен запускать музыкальный клип при исполнении. Это выглядит так:

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)

1 ответ

Я думаю, что ваш код не работает, когда он вызывает этот метод:

@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()

дает вам отрицательное значение. Это вызовет это исключение... и я не вижу другого способа, чтобы исключение могло произойти в этом методе.

Я предполагаю, что либо в процессе создания потокового дескриптора или дескриптора формата либо что-то не так, либо в аудиофайле, который вы пытаетесь воспроизвести, что-то не так.


Я предлагаю вам использовать отладчик, чтобы выяснить, почему это выражение является отрицательным.

Другие вопросы по тегам