Вопрос Как получить длительность музыки через javazoom?

Начинающий
Начинающий
Статус
Оффлайн
Регистрация
16 Дек 2022
Сообщения
21
Реакции
0
У меня проблема с получением frames проигрываемой музыки с помощью AdvancedPlayer из либы javazoom. Я пишу плеер музыки с ползунком, который может управлять длительностью музыки. Здесь вы можете увидеть мой код, выводящий максимальное количество кадров трека, и тестовый код, выводящий количество кадров с момента старта трека. Метод, возвращающий максимальное количество кадров музыки, работает правильно, но 2 метод не работает. Кидал вопрос на стаковерфлоу, но даже там не могут решить этот вопрос

skippedFrames — это переменная, которая используется для расчета положения ползунка после нажатия на нее, вы можете увидеть код здесь (seekTo(targetTime) использует skippedFrames):

Код:
Expand Collapse Copy
if (invisibleSliderRect.intersect(mx, my)) {
            float clickPosition =  Math.max(0, Math.min(1, (mx - invisibleSliderRect.getX()) / invisibleSliderRect.getW()));
            int targetTime = (int) ((float) (clickPosition * music.getMaxFrames()));
            music.seekTo(targetTime);

            return true;
}

Вот коды тех методов. getFramesPlayed() работает неправильно, не возвращает кадров как getMax Frames(). Он возвращает больше, чем getMaxFrames(), ошибок и тому подобное он не кидает. Помогите плиз
Код:
Expand Collapse Copy
public int getFramesPlayed() {
        int framesPlayed = skippedFrames;
        AudioDevice audioDevice = ((JavaZoomAccessor) player).getAudio();
        SourceDataLine sourceDataLine;
        if (player != null && audioDevice instanceof JavaSoundAudioDevice js && (sourceDataLine = ((JavaSoundAudioDeviceAccessor) js).getSource()) != null) {
            long framesWritten = sourceDataLine.getLongFramePosition();
            int frameSize = sourceDataLine.getFormat().getFrameSize();
            int playedFrames = 0;
            if (frameSize > 0) {
                playedFrames = (int) (framesWritten / frameSize);
            }

            framesPlayed += playedFrames;

            int maxFrames = getMaxFrames();
            if (framesPlayed > maxFrames) framesPlayed = maxFrames;
        }
        return framesPlayed;
    }

    public int getMaxFrames() {
        if (currentTrackFile == null) return 0;
        try {
            FileInputStream fis = new FileInputStream(currentTrackFile);
            Bitstream bitstream = new Bitstream(fis);
            Header header = null;
            int frameCount = 0;
            while ((header = bitstream.readFrame()) != null) {
                frameCount++;
                bitstream.closeFrame();
            }

            fis.close();
            return frameCount;
        } catch (Exception e) {
            System.err.println("Ошибка: " + e.getMessage());
            return 0;
        }
    }
 
Назад
Сверху Снизу