У меня есть аудиофайл wav. Я знаю, как играть в нее с помощью AudioImputStream в java. Я научился создавать jslider. Теперь я должен использовать слайдер в качестве индикатора выполнения с аудио, например, воспроизведение звука, поэтому ползунок движется вперед. И если пользователь меняет положение слайдера, аудиофайл должен воспроизводиться с этой позиции.Как обновить jslider с аудиофайлом как индикатор выполнения
Я новичок в java, и могут быть некоторые ошибки, которые я мог бы надеть в сообщение. Пожалуйста, обратите внимание на них
Так что я застрял в обновлении звуковой дорожки при обновлении слайдера. Я попытался добавить changeListner в слайдер, но я не мог заставить его работать.
Вот код
import java.io.File;
import java.util.Timer;
import java.util.TimerTask;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.sound.sampled.DataLine;
import javax.swing.JFrame;
import javax.swing.JSlider;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
public class audio {
public static void main(String args[])
{
try {
final JFrame f=new JFrame();
File yourFile;
AudioInputStream stream;
AudioFormat format;
DataLine.Info info;
final Clip clip;
yourFile = new File(fileName);
stream = AudioSystem.getAudioInputStream(yourFile);
format = stream.getFormat();
final long frames =stream.getFrameLength();
final double durationInSeconds = (frames+0.0)/format.getFrameRate();
final JSlider slider=new JSlider(0,(int) Math.round(durationInSeconds),0);
info = new DataLine.Info(Clip.class, format);
clip = (Clip) AudioSystem.getLine(info);
clip.open(stream);
clip.start();
f.add(slider);
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
TimerTask timerTask=new TimerTask(){
@Override
public void run() {
// TODO Auto-generated method stub
{
double timeNow=(durationInSeconds*clip.getFramePosition())/frames;
slider.setValue((int)Math.round(timeNow));
f.repaint();
}
}
};
Timer timer = new Timer("MyTimer");//create a new Timer
timer.scheduleAtFixedRate(timerTask, 30, 30);//this line starts the timer at the same time its executed
}
catch (Exception e) {
System.out.println(e);
}
}
}
Вы что-то пробовали? Если да, разместите здесь свой код, чтобы его можно было улучшить. Мы не будем делать ** все ** работу для вас. – D180
Я понятия не имею, что у вас есть, но я собираюсь предположить, что вы воспроизводите аудио обратно в потоке, используя DataLine, а не клип. Оттуда его простая математика. Вы начинаете с 0%, а конец звукового файла - 100%. Найдите длину аудиофайла, а затем, когда воспроизводятся звуковые файлы, отслеживайте, насколько далеко вы находитесь в аудиофайле, и отрегулируйте слайдер соответственно от потока.Я считаю, что это будет что-то вроде currentPositionInTrack/totalLengthOfTrack * 100, надеюсь, я не ошибаюсь, но это должно дать вам процент завершен. Если вам нужна дополнительная помощь, вам нужно быть более конкретным. –
Итак, проблема обновления слайдера решена. Я использовал таймер, в котором я получаю текущий кадр звуковой дорожки, конвертирую его в продолжительность и обновляю таймер каждые 30 миллисекунд. – jas