giovedì 18 giugno 2015

JAVA E MULTIMEDIA

Come si riproduce un file audio in Java? La domanda è abbastanza semplice ma la risposta tuttavia è complessa. Java possiede un media framework adatto alle necessità, JavaFX ne possiede uno a parte, in ogni caso esploriamo questa libreria e valutiamo le alternative.


JMF - Java Media Framework

JMF (Java Media Framework) è una libreria che permette la riproduzione di file multimediali (audio e video) attraverso il linguaggio di programmazione Java e l'utilizzo della JVM. Studiato in piena filosofia Java per essere l'utilizzo di riproduzione multimediale multi piattaforma. L'ultima versione stabile risale a ben 12 anni fa (Marzo 2003) cosa che rende questa tecnologia affidabile ma allo stesso tempo abbassa la fiducia nei suoi confronti.

Vediamo insieme un esempio su come riprodurre un file audio MP3 con JMF. Prima di tutto è necessario scaricare il file JAR della libreria sul sito della Oracle, vi consiglio di scaricare la versione multi piattaforma. Vediamo insieme come costruire un programma di esempio:

import java.io.File;
import javax.media.MediaLocator;
import javax.media.bean.playerbean.MediaPlayer;
[...]
File audioFile = new File("C:\\temp\\wav.wav");
MediaLocator location = new MediaLocator(audioFile.toURI().toURL());
MediaPlayer player = new MediaPlayer();
player.setMediaLocator(location);
player.start();
[...]

Per degli esempi pratici su come scrivere semplici programmi che sfruttano questa libreria esiste la sezione dedicata Oracle.

Le ragioni dell'abbandono del JMF sono riconducibili a due ragioni principali:
  • Java viene usato sempre più per un ambiente Enterprise o applicazioni web.
  • Sono state sviluppate altre librerie wrapper che hanno facilitato l'utilizzo del JMF.

JLayer

Una delle librerie che per un po' di tempo è spopolata su web e fra i professionisti del settore è stata JLayer. JLayer è una libreria wrapper che permette la riproduzione di file multimediali (soprattutto audio) in maniera molto più pulita e leggibile del JMF puro. Per un certo periodo di tempo JLayer era stato lasciato alla versione 1.0 del 2004, successivamente ricevette un aggiornamento bugfix nel Novembre del 2008, il che fa sperare quanto meno che ogni tanto qualcuno ci perda del tempo.

Dopo aver scaricato l'ultima versione di JLayer dal sito di Javazoom e aver inserito il file JAR nel progetto, possiamo procedere con la scrittura del primo semplice programma:
import java.io.File;
import java.io.FileInputStream;
import javazoom.jl.player.Player;
[...]
File audioFile = new File("c:\\mypath\\myfile.mp3");
FileInputStream inputStream = new FileInputStream(audioFile);
Player player = new Player(inputStream);
player.play();
[...]

Inserendo questo codice in un task parallelo come un Thread è possibile riprodurre l'audio in background.


JMF vs JLayer

Le principali differenze fra l'utilizzo di JMF e JLayer sono piccole e puramente pratiche:

  • JLayer supporta il formato audio MP3, per JMF esisteva un plugin ormai introvabile in rete (download).
  • il metodo play() di JLayer è singolo mentre il metodo play() di JMF riproduce in loop.
  • JLayer viene ogni tanto aggiornato (ultima release 2008), JMF è considerato un progetto morto da tutta la comunità (ultima release 2003).
  • JMF contiene molte più funzionalità multimediali a differenza di JLayer che è utile soprattutto alla riproduzione di file audio.

JavaSound

Esiste un'altra libreria di Oracle che gestisce i file audio chiamata JavaSound il cui utilizzo è comunque limitato dal fatto che non esiste il supporto nativo ai file audio mp3 e che quindi necessita di un plugin aggiuntivo.


2 commenti:

  1. import javazoom.jl.player.Player;
    ^
    P.java:10: error: cannot find symbol
    Player player = new Player(inputStream);
    ^
    symbol: class Player
    location: class P
    P.java:10: error: cannot find symbol
    Player player = new Player(inputStream);
    ^
    symbol: class Player
    location: class P
    3 errors

    RispondiElimina
    Risposte
    1. Ciao Astrex, grazie per il tuo commento molto esplicativo...

      il problema è che non hai incluso nel tuo progetto il JAR di JLayer. Che tipo di IDE (Netbeans, IntelliJ, Eclipse) stai usando?

      ------------

      Hi Astrex, thanks for your "very explicit" comment...

      Your problem is that You have not included the JLayer JAR into your project. What kind of IDE (Netbeans, IntelliJ, Eclipse) are you using?

      Elimina