У меня проблема с получением frames проигрываемой музыки с помощью AdvancedPlayer из либы javazoom. Я пишу плеер музыки с ползунком, который может управлять длительностью музыки. Здесь вы можете увидеть мой код, выводящий максимальное количество кадров трека, и тестовый код, выводящий количество кадров с момента старта трека. Метод, возвращающий максимальное количество кадров музыки, работает правильно, но 2 метод не работает. Кидал вопрос на стаковерфлоу, но даже там не могут решить этот вопрос
skippedFrames — это переменная, которая используется для расчета положения ползунка после нажатия на нее, вы можете увидеть код здесь (seekTo(targetTime) использует skippedFrames):
Вот коды тех методов.
skippedFrames — это переменная, которая используется для расчета положения ползунка после нажатия на нее, вы можете увидеть код здесь (seekTo(targetTime) использует skippedFrames):
Код:
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()
, ошибок и тому подобное он не кидает. Помогите плиз
Код:
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;
}
}