La riproduzione di un media può fallire per diverse ragioni, per questo motivo le API JavaFX consentono di intercettare e gestire opportunamente situazioni di fallimento. Un ruolo importante è rappresentato dalla classe javafx.scene.media.MediaException
. All'interno di questa classe troviamo infatti un'enumerazione statica, MediaException.Type
, le cui costanti identificano il tipo di errore: MEDIA_CORRUPTED
, MEDIA_INACCESSIBLE
, MEDIA_UNAVAILABLE
etc.
Un player pronto all'uso
Per poter verificare il funzionamento della gestione degli errori di playback, riprendiamo il semplice video player con i due pulsanti play e stop:
public class FxMediaExample extends Application {
public static void main(String[] args) {
Application.launch(args);
}
@Override
public void start(Stage stage) throws MalformedURLException {
URL mediaUrl = new URL("http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4");
Media media = new Media(mediaUrl.toExternalForm());
MediaPlayer player = new MediaPlayer(media);
player.setAutoPlay(false);
Button playButton = new Button("Play");
Button stopButton = new Button("Stop");
playButton.setOnAction((ActionEvent event) -> {
if (player.getStatus() == Status.PLAYING) {
player.stop();
player.play();
} else {
player.play();
}
});
stopButton.setOnAction((ActionEvent event) -> {
player.stop();
});
MediaView mediaView = new MediaView(player);
mediaView.setFitWidth(350);
mediaView.setFitHeight(200);
mediaView.setSmooth(true);
// Qui playback error management
HBox controlBox = new HBox(5, playButton, stopButton);
VBox root = new VBox(5, mediaView, controlBox, markerMessage);
Scene scene = new Scene(root);
stage.setScene(scene);
stage.setTitle("Media Player Demo");
stage.show();
}
}
Error playback management
Per ciascun oggetto chiave (Media
, MediaPlayer
e MediaView
) andiamo ad aggiungere, nel codice precedente, un gestore di errore in sostituzione del commento inserito:
player.setOnError(() -> {
errorMessage(player.getError());
});
media.setOnError(() -> {
errorMessage(player.getError());
});
mediaView.setOnError((MediaErrorEvent event) -> {
errorMessage(event.getMediaError());
});
Aggiungiamo inoltre un metodo ausiliaro per la stampa dell'evento di errore:
private void errorMessage(MediaException error) {
MediaException.Type errorType = error.getType();
String errorMessage = error.getMessage();
System.out.println("Message:"+errorMessage+" Type:"+errorType);
}
Per testare i vari errori di playback possiamo cambiare l'URL del file mp4 in modo tale che punti di volta in volta a file un differente in grado di evidenziare un specifico errore.