Почему мой gif повторяется с разными временами? - PullRequest
0 голосов
/ 23 апреля 2020

Я добавил свой Icon в JLabel и добавил его в JFrame, и я пытаюсь воспроизвести саундтрек, который начинается с картинки. Моя проблема в том, что каждый раз, когда саундтрек повторяет GIF, не воспроизводится с одинаковой скоростью. Однажды gif и саундтрек заканчиваются одновременно, а затем второй раз, когда gif зацикливается вокруг саундтрека и заканчивается первым, и оттуда они просто сбрасываются syn c. Как я могу это исправить?

Код для GIF:

        ImageIcon back = new ImageIcon("res/" + ("Animations/" + "Untitled" + ".gif"));
        back = new ImageIcon(back.getImage().getScaledInstance((int)(Toolkit.getDefaultToolkit().getScreenSize().getWidth()), (int)(Toolkit.getDefaultToolkit().getScreenSize().getHeight()), Image.SCALE_DEFAULT));
        Icon icon = back;

        background = new JLabel(icon);

        welcomePanel.add(background);

Затем в JFrame добавляется welcomePanel.

Я не верю звуку проблема в этом случае, но на всякий случай это код звука:

        openingMusic = new SoundPlayer("OpeningAudio2.wav");

        openingMusic.loop();
        openingMusic.setVolume(60f);
        openingMusic.play();

Класс SoundPlayer:

public class SoundPlayer {

    AudioInputStream myobj;
    Clip clip;
    String fileName;
    FloatControl volume;
    final float muteVolume;

    public SoundPlayer(String FileName) {   
        fileName = FileName;

        try {
            myobj = AudioSystem.getAudioInputStream(new File(fileName).getAbsoluteFile());
        } catch (UnsupportedAudioFileException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        try {
            clip = AudioSystem.getClip();
        } catch (LineUnavailableException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        try {
            clip.open(myobj);
            volume = (FloatControl)clip.getControl(FloatControl.Type.MASTER_GAIN);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        muteVolume = volume.getMinimum();

    }

    public void play() {
        clip.start();
    }

    public void loop() {
        clip.loop(Clip.LOOP_CONTINUOUSLY);
    }

    public void changeVolume(float f) {
        volume.setValue(f);
    }

    public void setVolume(float f) {
        volume.setValue(f + muteVolume);
    }

    public void stop() {
        clip.stop();
        clip.close();
    }

    public void restart() { 
        clip.stop(); 
        clip.close(); 
        resetAudioStream();
        clip.setMicrosecondPosition(0);
    } 

    public void resetAudioStream() { 
        try {
            myobj = AudioSystem.getAudioInputStream(new File(fileName).getAbsoluteFile());
        } catch (UnsupportedAudioFileException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }       
        try {
            clip.open(myobj);
        } catch (LineUnavailableException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } 
    } 
}
...