2015-01-09 67 views
0

我有一個播放音頻文件的應用程序。 我的問題是,只允許我從當前音樂的位置暫停播放,但我想要暫停並繼續播放。到目前爲止,我無法做出改變。音頻暫停和播放另一個位置

我想從另一個位置移動滑塊,並能夠從軌道上的該位置播放音樂。

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

你可以格式化你的代碼並使用一些縮進嗎?這是不可讀的。 – 2015-01-29 14:48:05

回答

1

你看過Clip API嗎?有一些方法可用於暫停和將「播放頭」設置到任何位置,使用幀或經過的時間。

從您的TimerTask內:

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

我不知道如果我正確地讀你的代碼,尤其是你缺乏格式。我認爲你正在用歌曲位置定期更新滑塊,但是如果用戶更改了滑塊,那麼你想要移動到歌曲中的那個點。因此,當用戶改變滑塊時(與歌曲改變滑塊相反),應該有某種過程來標記。我正在使用標誌名稱「positionOnSliderUpdatedByUser」。