Dies ist vielleicht nicht sehr akzeptabel Frage, aber ich bin so verzweifelt an dieser Stelle.Synchron-Media-Player javafx
Ich brauche einen synchronen Java-Media-Player mit schnellen Such-und Balance-Änderung.
Szenario:
Ich habe ein JavaFX-Projekt, wo ich eine sehr kurze spielen (50-100 ms) Mediendatei in einer Schleife. Die Sache ist, ich habe Anforderungen vor dem Neustart zu halten.
in Kürze: Spielsound -> bestimmte Anforderungen erfüllt (Balance wird geändert) (alle 120ms) -> wenn Sound fertig Wiedergabe Wiedergabe von Anfang an.
javafx bietet einen Mediaplayer, den ich modifiziert habe. noch mehr Effizienz erforderlich:
// this method is just to show how the modified mediaplayer class is called
public void updateSoundBalance(double currentTimeInCycle) {
// control the balance of the sound
if(playingSound && mediaPlayer != null)
{
long b = System.nanoTime();
// 0 <= balance < 4. balance represents the cycle phase.
double balance = currentTimeInCycle % RADIANCE_FULL_CYCLE/RADIANCE_QUARTER_CYCLE;
boolean firstHalfCycle = balance < 2;
double quarterCycleIndex = Math.floor(balance);
long a = System.nanoTime();
if(swingingSound)
mediaPlayer.setBalance(firstHalfCycle ? 1 - balance : balance - 3);
else
mediaPlayer.setBalance(balance > 1 && balance < 3? -1 : 1);
System.out.println("C ::: sound balance = " + (System.nanoTime() - a));
if ((quarterCycleIndex == 1 | quarterCycleIndex == 3) &&
balance - quarterCycleIndex <= Settings.DEFAULT_PATTERN_SMOOTHNESS)
{
a = System.nanoTime();
if (mediaDone){
mediaPlayer.reset();
mediaDone = false;
}
System.out.println("B ::: call reset = " + (System.nanoTime() - a));
}
System.out.println("A ::: total time = " + (System.nanoTime() - b));
}
}
import java.util.concurrent.ScheduledThreadPoolExecutor;
import javafx.scene.media.Media;
import javafx.scene.media.MediaPlayer;
import javafx.util.Duration;
public class MultiMediaPlayer
{
private MediaPlayer mp1, mp2;
private boolean usingMp1 = true;
private ScheduledThreadPoolExecutor seekService = new ScheduledThreadPoolExecutor(2);
private Runnable seekRun = new Runnable() {
@Override
public void run() {
try
{
long a = System.nanoTime();
if(usingMp1) {
usingMp1 = false;
mp1.stop();
mp2.play();
mp1.seek(new Duration(0));
} else {
usingMp1 = true;
mp2.stop();
mp1.play();
mp2.seek(new Duration(0));
}
System.out.println("D ::: reset sound time taken = " + (System.nanoTime() - a));
}
catch (Exception e){
e.printStackTrace();
}
}
};
public MultiMediaPlayer(Media value)
{
mp1 = new MediaPlayer(value);
mp2 = new MediaPlayer(value);
mp1.balanceProperty().bindBidirectional(mp2.balanceProperty());
mp1.onEndOfMediaProperty().bindBidirectional(mp2.onEndOfMediaProperty());
}
public void setBalance(double value){
mp1.setBalance(value);
}
public void reset(){
seekService.execute(seekRun);
}
public void play(){
if(usingMp1) {
mp1.play();
} else {
mp2.play();
}
}
public void stop(){
mp1.stop();
mp2.stop();
}
public void pause(){
mp1.pause();
mp2.pause();
}
public void setOnEndOfMedia(Runnable r) {
mp1.setOnEndOfMedia(r);
}
}
wenn jemand mich in die richtige Richtung zeigen kann (Bibliothek/etwas, was ich verpasst) wäre ich dankbar
ps die Java-Version erlaubt ist die aktuell möglich