Это может быть не очень приемлемый вопрос, но я в отчаянии на этом этапе.Синхронный медиа-плеер javafx
Мне нужен синхронный мультимедийный плеер Java с быстрым поиском и балансировкой.
Сценарий:
У меня есть проект JavaFX, где я должен играть очень короткий (50-100 мс) медиа-файл в цикле. дело в том, что у меня есть требования к удержанию перед перезапуском.
: воспроизведение звука -> определенные требования удовлетворены (баланс будет изменен) (каждые 120 мс) -> если звук завершено воспроизведение воспроизведение из старт.
javafx предоставляет медиа-плеер, который я модифицировал. еще требуется больше эффективности:
// 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);
}
}
если кто-нибудь может мне точку в правильном направлении (библиотека/что-то я пропустил) я был бы признателен
пс версия Java позволило наиболее до настоящего времени возможно