Hola, un saludo a todos, hoy les mostraré como reproducir videos con JavaFX. El código que necesitamos escribir para lograr esto es bastante corto gracias a la librería de JavaFX, principalmente necesitamos crear un objeto de la clase MediaPlayer el cual necesita un objeto de la clase Media que representa el origen del archivo de video.
Ahora si reproducimos el video solo podremos oír el sonido que este contenga, para que podamos ver la imagen del video hay que agregarle un objeto de la clase MediaView el cual colocaremos en alguna parte de nuestra ventana y le agregaremos nuestro objeto MediaPlayer, todo este conjunto de elementos nos permitirá reproducir el video que deseemos siempre y cuando sea de los formatos soportados por JavaFX, de acuerdo a la documentación de JavaFX el formato de video soportado es el siguiente.
Video Encoding: H.264/AVC, H.264/MPEG-4 Part 10 / AVC (Advanced Video Coding)
video compresión.
Creando un objeto Media para el MediaPlayer.
Sabiendo esto, veamos un ejemplo para tener más claro como utilizar todos estos elementos. Primeramente debemos entender el objeto Media.
Package javafx.scene.media
Media media = new Media(source)
El parámetro source del objeto media debe ser la forma String de la dirección del archivo de video en formato URI, es decir, si queremos abrir un archivo de video desde nuestro disco por ejemplo, podemos crear un objeto Path utilizando la clase Paths de la siguiente manera.
Path p = Paths.get(source)
Y luego utilizando el método de la clase Path, toUri() y a la vez toString() para convertirlo en String.
p.toUri().toString()
Podemos entonces crear un objeto Media directamente haciendo lo siguiente.
Media media = new Media(Paths.get(source).toUri().toString())
Creando el objeto MediaPlayer
La clase MediaPlayer tiene el siguiente constructor, MediaPlayer(Media media), y es el lugar donde debes colocar el objeto Media que se construyó inicialmente, esto significa que cada vez que queramos abrir otro archivo de video se debe crear otro objeto MediaPlayer con el nuevo objeto Media, por lo que me parece correcto crear un método que llamemos cada vez que se quiera reproducir otro video.
public MediaPlayer getMediaPlayer(String source){
Media media = new Media(Paths.get(source).toUri().toString());
MediaPlayer player = new MediaPlayer(media);
player.setVolume(0.5);
player.setAutoPlay(true);
return player;
}
Cada vez que necesitemos cambiar de video, creamos un nuevo objeto Media el cual pasamos a nuevo objeto MediaPlayer configurado con el volume a la mitad y que inicie tan pronto esté listo para reproducir el archivo de video.
Creando el objeto MediaView
El objeto MediaView se construye agregándole como parámetro el objeto MediaPlayer al constructor de la clase.
MediaView view = new MediaView(MediaPlayer player);
El objeto MediaView es el que nos permitirá visualizar las imágenes del video, y el tamaño inicial de este contenedor será el tamaño del video que se reproduzca, si queremos que el video se ajuste a la ventana que lo contiene debemos configurarlo de tal manera que al ajustar el tamaño de la ventana el objeto MediaView sea reajustado y consigo la imagen del video que se reproduce, para este ejemplo se ajustará el tamaño del video al obtener el ancho y alto de la escena y variando el tamaño del MediaView acorde a estos valores por ejemplo.
Stackpane root = new StackPane();
MediaView view = new MediaView(getMediaPlayer(logo.mp4));
root.getChildren().add(view);
view.setPreserveRatio(true);
Scene scene = new Scene(root,640,480);
Aquí escuchamos si hay algún cambio en el tamaño de la escena y si es así, cambiamos el tamaño de view al nuevo valor de tamaño de la escena.
scene.heightProperty().addListener(new ChangeListener<Number>(){
public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {
view.setFitHeight(newValue.doubleValue());}});
scene.widthProperty().addListener(new ChangeListener<Number>() {
public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {
view.setFitWidth(newValue.doubleValue());}});
Selección de archivos en JavaFX
Lo único que faltaría seria como seleccionar los archivos de video de nuestro disco de almacenamiento. Para esto JavaFX tiene una clase llamada FileChooser que nos da la facilidad de navegar a través de nuestros archivos y seleccionar el que deseemos, además de que nos permite agregar filtros para que solo tipos específicos de archivos puedan ser seleccionados, por ejemplo solo extensiones "jpg", "mp3", "mp4" entre otros.
Veamos el código de FileChooser.
FileChooser chooser = new FileChooser();
Ajustamos el directorio inicial a la carpeta donde se encuentran todas las carpetas del usuario del sistema, por ejemplo en Linux sería "/home/nombreDeUsuario"
chooser.setInitialDirectory(new File(System.getProperty("user.home")))
Agregamos un título a la ventana del chooser.
chooser.setTitle("Selecciona un archivo de video")
Y ahora los filtros de extensiones, se agregaron 2 opciones una llamada video que solo deja ver los archivos con extensión "mp4" y la opción todo en la cual todos los archivos pueden ser seleccionados sin importar su extensión.
chooser.getExtensionFilters().addAll(
new ExtensionFilter("Video","*.mp4"),
new ExtensionFilter("Todo","*"));
Finalmente para mostrar la ventana de chooser usaremos el siguiente comando, el cual guarda en una objeto de tipo File la selección que se hiciera en el chooser.
File archivoSeleccionado = chooser.showOpenDialog(stage);
Teniendo un archivo seleccionado válido, pasamos la dirección de ese archivo al método getMediaPlayer().
if (archivoSeleccionado != null) {
if(view.getMediaPlayer() != null) {
player.stop();
}
view.setMediaPlayer(getMediaPlayer(selectedFile.getPath()));
}
Juntando todas estas partes de código podemos crear una ventana con JavaFX que muestre el video que seleccionamos, si quieres ver el código fuente completo o probar la versión ejecutable pasa por aquí.
Bueno, eso es todo por ahora, hasta la próxima!.
Comentarios
Publicar un comentario