In Java è possibile gestire file video e audio utilizzando le JavaFX Media API. Un aspetto particolarmente interessante è la possibilità di riprodurre file attraverso uno streaming HTTP. I formati supportati sono AAC, AIFF, WAV ed MP3 per l'audio, FLV (contenenti video VP6 e audio MP3) e MPEG-4 (supportando anche i formati video H.264/AVC) per il video.
In questo articolo andiamo ad illustrare la classe javafx.scene.media.AudioClip
, pensata per la riproduzione di clip audio a latenza minima.
Classe AudioClip
I file audio a latenza minima sono in genere file audio di breve durata. Pensiamo ad esempio a un effetto beep o a un effetto audio relativo a un alert di errore. La classe AudioClip
fornisce un solo costruttore che accetta l'URL della sorgente audio da riprodurre. L'audio è immediatamente caricato in memoria in un formato raw e decompresso. Questo aspetto ci fa capire subito il perchè non dovremmo usare questa classe per riprodurre brani di lunga durata.
L'URL di input può utilizzare i protocolli HTTP, JAR e FILE, questo significa che possiamo riprodurre file provenienti da un indirizzo Internet remoto, da file system o da un file jar.
Audio clip in streaming
Vediamo un esempio di riproduzione di un file presente su un server remoto. Per illustrare l'utilizzo della classe AudioClip
, mostriamo il codice di una semplice applicazione JavaFX che utilizzi un oggetto AudioClip
i cui metodi di play/stop siano azionati attraverso due pulsanti.
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.HBox;
import javafx.scene.media.AudioClip;
import javafx.stage.Stage;
public class AudioClipDemo extends Application {
private AudioClip sound;
public static void main(String[] args) {
Application.launch(args);
}
@Override
public void init() {
sound = new AudioClip("http://soundbible.com/mp3/van-sliding-door-daniel_simon.mp3");
}
@Override
public void start(Stage primaryStage) throws Exception {
Button play = new Button("Play");
Button stop = new Button("Stop");
play.setOnAction(e -> sound.play());
stop.setOnAction(e -> sound.stop());
HBox root = new HBox(10, play, stop);
root.setStyle("-fx-padding:10;");
Scene scene = new Scene(root);
primaryStage.setScene(scene);
primaryStage.setTitle("Audio clip Demo");
primaryStage.show();
}
}
Al termine della creazione dell'oggetto AudioClip
, il file audio è caricato interamente in memoria e pronto per essere eseguito.
Proprietà audio di riproduzione
La classe AudioClip
supporta il setting di diverse proprietà:
cycleCount
(numero di volte che l'audio verrà riprodotto);volume
(volume audio),rate
(velocità relativa di esecuzione, valori validi sono compresi tra 0.125 a 8.0);balance
(livello di bilanciamento);pan
(il centro relativo di un clip: un valore pan 0 riproduce il clip normalmente, un valore di -1.0 effettua uno shift del clip interamente verso il canale sinistro mentre un valore di 1.0 applica uno shift interamente sul canale destro);priority
(livello di priorità del clip rispetto ad altri clip).
Vediamo un esempio. Per riprodurre il clip 5 volte, utilizziamo un'impostazione del tipo:
sound.setCycleCount(5);
Mentre per avere un loop indefinito utilizziamo il valore AudioClip.INDEFINITE
:
sound.setCycleCount(AudioClip.INDEFINITE);