Ich programmiere einen Audio Visualizer. Um die Daten, die angezeigt werden sollen, mit der Musik selbst zu synchronisieren, muss ich die aktuelle Position des Clips/Players in der Audiodatei abrufen, indem ich/aufrufen. Dies funktioniert gut für den Clip. Das Problem ist, dass ich das Player-Objekt in einem anderen Thread definieren muss, da der Aufruf player.play()
die gesamte Ausführung im aktuellen Thread stoppt, bis die Datei bis zum Ende abgespielt wird. Player
ist eine Klasse aus der MP3SPI-Bibliothek (javazoom.jl.player.Player
).Rückgabevariable aus der in einem anderen Thread definierten Klasse
Code:
public class AudioTools implements Runnable {
public File file;
public boolean isMP3 = false;
public Player player;
public Clip clip;
public AudioTools(File file) {
this.file = file;
determineFilyType();
}
private void determineFileType() {
if (file.getAbsolutePath().endsWith(".mp3")) {
this.isMP3 = true;
} else if (file.getAbsolutePath().endsWith(".wav")) {
this.isMP3 = false;
} else {
System.err.println("Invalid File Type!");
System.exit(0);
}
}
public void play() {
if (isMP3) {
Thread t = new Thread(this);
t.start(); // play MP3 using Player class
} else {
playWav(file); // play WAV using Clip class
}
}
protected void playMP3(File file){
try {
player = new Player(new FileInputStream(file));
player.play();
} catch (Exception e) {
System.out.println("Invalid MP3 File!");
e.printStackTrace();
System.exit(0);
}
}
@Override
public void run() {
playMP3(file);
}
private void playWav(File file) {
try {
AudioInputStream ais = AudioSystem.getAudioInputStream(file);
DataLine.Info dataInfo = new DataLine.Info(Clip.class, null);
clip = (Clip) AudioSystem.getLine(dataInfo);
clip.open(ais);
clip.start();
} catch (Exception e) {
e.printStackTrace();
System.err.println("Invalid .wav file!");
System.exit(0);
}
}
}
Hauptklasse:
public static void main(String[] args) {
File file = new File(/*PATH_TO_FILE_HERE*/);
AudioTools at = new AudioTools(file);
at.play();
// at.clip.getMicrosecondPosition() works here if loaded file is .wav.
// at.player.getPosition() returns null if loaded file is .mp3.
}
Von der Hauptklasse, würde Ich mag Lage sein, die aktuelle Position des Spielers zu bekommen. Wenn Sie dies versuchen, wird null zurückgegeben.
Alle hilfreiche Kommentare sind willkommen. Ich habe vorher eine ähnliche Frage gestellt, diese Bearbeitung hat die Frage etwas klarer und kürzer gemacht.
EDIT: Sollte den gesamten Code enthalten, um das Beispiel auszuführen.
Ein MCVE könnte helfen. –