1

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


}
}
4

2 に答える 2

0

したがって、スライダーを更新する問題は解決されます。オーディオトラックの現在のフレームを取得し、それを継続時間に変換し、30ミリ秒ごとにタイマーを更新するタイマーを使用しました。

しかし、スライダーの更新でトラックを更新する方法にまだこだわっています。

トラックを手動で更新する理由がわかりません。オーディオ トラックの現在のフレームを既に取得できる場合は、更新中である必要があります。したがって、直面している可能性のある問題を解決するには:

スライダーが適切に更新されていない場合は、コンポーネントから削除してから更新し、再度追加して動作させることがわかりました。

@Override
public void run() {
// TODO Auto-generated method stub
{
f.remove(slider);
double timeNow=(durationInSeconds*clip.getFramePosition())/frames;
slider.setValue((int)Math.round(timeNow));
f.add(slider);
f.repaint();
}

クリップを手動で更新する場合は、clip.setFramePosition(int frames)

于 2013-11-11T23:46:35.373 に答える