我有一个播放音频文件的应用程序。 我的问题是只允许我从音乐当前所在的位置暂停播放,但我想要的是暂停并继续从那一点开始播放。到目前为止,我无法做出改变。
我想从另一个位置移动滑块,并能够从轨道上的那个位置播放音乐。
File juntos = new File("C:/juntos.wav");
if(controlPlay){
//Sliderprogreso is bar Slider
Sliprogreso.setEnabled(true);
controlReproducir=true;
Btngrabar.setEnabled(false);
Btnguardar.setEnabled(false);
Btnplay.setText("Pause");
try {
AudioInputStream stream;
AudioFormat format;
DataLine.Info info;
stream = AudioSystem.getAudioInputStream(juntos);
format = stream.getFormat();
frames =stream.getFrameLength();
durationInSeconds = (frames+0.0) / format.getFrameRate();
System.out.println("duracion:"+durationInSeconds);
Sliprogreso.setMaximum((int) durationInSeconds);
info = new DataLine.Info(Clip.class, format);
clip = (Clip) AudioSystem.getLine(info);
clip.open(stream);
clip.start();
controlPlay=false;
TimerTask timerTask=new TimerTask(){
public synchronized void run() {
{
double timeNow=(durationInSeconds*clip.getFramePosition())/frames;
System.out.println("frames:"+frames);
System.out.println("clipframe:"+clip.getFramePosition());
System.out.println("time now");
Sliprogreso.setValue((int)Math.round(timeNow));
if((int)Math.round(timeNow)==(int)durationInSeconds){
System.out.println("se cancelo");
this.cancel();
Btnplay.setText("Play");
Btngrabar.setEnabled(true);
Btnguardar.setEnabled(true);
controlPlay=true;
}
}
}
};
timer.scheduleAtFixedRate(timerTask, 30, 30);
}
catch (Exception e) {
System.out.println(e);
e.printStackTrace();
}
}
else{
clip.stop();
timer.cancel();
Btnplay.setText("Play");
controlPlay=true;
Btngrabar.setEnabled(true);
Btnguardar.setEnabled(true);
}
答案 0 :(得分:1)
你看过Clip API了吗?有使用帧或经过时间暂停和将“播放头”设置到任何位置的方法。
在TimerTask中:
if (positionOnSliderUpdatedByUser)
{
clip.stop();
int desiredMicrosecond = yourConversionFunction( sliprogreso.getValue() );
clip.setMicrosecondPosition(desiredMicrosecond);
clip.start();
positionOnSliderUpdatedByUser = false;
}
我不确定我是否正确阅读了您的代码,尤其是在您缺少格式化的情况下。我认为你正在使用歌曲位置定期更新滑块,但是如果用户更改了滑块,那么你想要移动到歌曲中的那一点。因此,应该有某种过程来标记用户何时更改滑块(与更改滑块的歌曲相反)。我正在使用标志名称“positionOnSliderUpdatedByUser”。