音频暂停并播放另一个位置

时间:2015-01-09 19:49:16

标签: java audio-player

我有一个播放音频文件的应用程序。 我的问题是只允许我从音乐当前所在的位置暂停播放,但我想要的是暂停并继续从那一点开始播放。到目前为止,我无法做出改变。

我想从另一个位置移动滑块,并能够从轨道上的那个位置播放音乐。

 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);
}

1 个答案:

答案 0 :(得分:1)

你看过Clip API了吗?有使用帧或经过时间暂停和将“播放头”设置到任何位置的方法。

在TimerTask中:

if (positionOnSliderUpdatedByUser)
{
    clip.stop();
    int desiredMicrosecond = yourConversionFunction( sliprogreso.getValue() );
    clip.setMicrosecondPosition(desiredMicrosecond);
    clip.start();
    positionOnSliderUpdatedByUser = false;
}

我不确定我是否正确阅读了您的代码,尤其是在您缺少格式化的情况下。我认为你正在使用歌曲位置定期更新滑块,但是如果用户更改了滑块,那么你想要移动到歌曲中的那一点。因此,应该有某种过程来标记用户何时更改滑块(与更改滑块的歌曲相反)。我正在使用标志名称“positionOnSliderUpdatedByUser”。