Мне нужно, чтобы короткий звуковой файл m4a воспроизводился непрерывно в течение 30 минут в назначенное время начала. Мне трудно заставить его играть непрерывно в назначенное время начала. Когда я исследовал эту проблему, мне показалось, что мне пришлось использовать отдельные потоки в JavaFX для выполнения этой работы, но я не смог написать ее с такими потоками, как Platform.runLater. Я также открыт для того, чтобы не использовать потоки для достижения этого эффекта. И я не могу сделать это l oop непрерывно в течение 30 минут с помощью методов MediaPlayer, предоставляемых в JavaFX (https://docs.oracle.com/javafx/2/api/javafx/scene/media/MediaPlayer.html).
Вот мой код, пока только возможность воспроизведения звукового файла один раз:
package MyAppPackage;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.canvas.Canvas;
import javafx.scene.control.Label;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
import javafx.scene.text.Text;
import javafx.application.Platform;
import javafx.scene.media.Media;
import javafx.scene.media.MediaPlayer;
import javafx.scene.media.MediaView;
import javafx.util.Duration;
import java.io.File;
import java.time.ZoneId;
import java.time.ZonedDateTime;
public class MyApp extends Application {
private void playAppTone(MediaPlayer mp, ZonedDateTime start, ZonedDateTime stop) {
while(ZonedDateTime.now(ZoneId.of("America/New_York")).isAfter(start) &&
ZonedDateTime.now(ZoneId.of("America/New_York")).isBefore(stop) ) {
mp.setOnEndOfMedia(new Runnable() {
@Override public void run() {
mp.seek(Duration.ZERO);
mp.play(); }
});
mp.setAutoPlay(true);
}
}
@Override
public void start(Stage primaryStage) {
Canvas canvas = new Canvas(400,400);
HBox statusBar = new HBox(new Label("Start the App Tone"));
BorderPane borderPane = new BorderPane(canvas, statusBar, null, null, null);
StackPane root = new StackPane(borderPane);
primaryStage.setScene(new Scene(root));
primaryStage.setTitle("Timed Playback of Sound Clip");
primaryStage.show();
statusBar.setOnMouseClicked((event) -> {
ZoneId zoneId = ZoneId.of( "America/New_York" );
ZonedDateTime appStartTime = ZonedDateTime.now( zoneId );
System.out.println(appStartTime);
ZonedDateTime start = appStartTime.plusMinutes(10);
ZonedDateTime stop = appStartTime.plusMinutes(40);
String path = "media/PlaybackClip.m4a";
Text playStatusText = new Text("A sound clip will be played continuously at the designated time...");
Media media = new Media(new File(path).toURI().toString());
MediaPlayer mp = new MediaPlayer(media);
MediaView mv = new MediaView(mp);
StackPane stackPane = new StackPane();
stackPane.getChildren().add(mv);
stackPane.getChildren().add(playStatusText);
primaryStage.setScene(new Scene(stackPane, 400, 400));
mp.play();
mp.setAutoPlay(true);
/*The Platform.runLater doesn't work
Platform.runLater(() -> {
playAppTone(mp, start, stop);
}); */
});
}
public static void main(String[] args) {
launch(args);
}
}