【发布时间】:2013-04-06 20:15:01
【问题描述】:
我有一个 wav 音频文件。我知道如何在 java 中使用 AudioImputStream 播放它。我学会了创建一个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);
}
}
}
【问题讨论】:
-
您至少尝试过什么吗?如果是这样,请在此处发布您的代码,以便对其进行改进。我们不会为您完成所有的工作。
-
我不知道你到目前为止有什么,但我会假设你正在使用 DataLine 而不是 Clip 在线程中播放音频。从那里开始它的简单数学。您从 0% 开始,声音文件的结尾是 100%。找到音频文件的长度,然后在音频文件播放时跟踪您在音频文件中的距离,并从线程中相应地调整滑块。我相信它会类似于 currentPositionInTrack / totalLengthOfTrack * 100,希望我没有错,但这应该会给你完成的百分比。如果您需要更多帮助,则必须更具体。
-
这样更新滑块的问题就解决了。我使用了一个计时器,在其中我获取当前音轨帧,将其转换为持续时间并每 30 毫秒更新一次计时器。
-
但我仍然坚持如何更新滑块更新中的轨道。