CERCA SITEMAP FEED RSS 1280
Ultimo aggiornamento: 30 Agosto 2009

Mobile Media API

Le Mobile Media API costituiscono un package opzionale necessario all’implementazione di funzionalità multimediali.

A partire dal MIDP 2.0 parte di queste funzioni sono state trasferite all’interno del profilo stesso con opportune limitazioni:
  • sono supportate soltanto funzionalità legate all’audio
  • non è consentita una riproduzione simultanea di più file audio
  • viene utilizzata una versione semplificata del Manager
L’elaborazione multimediale può avvenire in due distinti modi:
  • attraverso la lettura dei dati da una sorgente (ad esempio un file o un server di streaming audio/video)
  • attraverso la manipolazione, la riproduzione e la decodifica
Nel primo caso si fa riferimento ad un DataSource ovvero una sorgente di dati che nasconde i dettagli su come i dati vengano effettivamente recuperati.
Nel secondo caso invece si utilizza un Player che legge i dati da un DataSource e fornisce una serie di metodi per la riproduzione multimediale.
Oltre al Player ed al DataSource esistono altri due oggetti che ricoprono un ruolo fondamentale nell’implementazione di applicazioni J2ME multimediali: il Manager ed i Control.
Il Manager costituisce di fatto il punto di accesso alle risorse multimediali: fornisce pertanto alcuni meccanismi per la creazione di oggetti Player o ancora per la generazione di toni, la definizione di MediaLocator (specifiche URI che identificano un media e permettono di recuperarne i dati).
I Control invece forniscono opportune funzioni nell’elaborazione dei media: tali funzioni sono raggruppate logicamente così ad esempio i metodi per il controllo del volume fanno parte dell’interfaccia VolumeControl, quelli per il controllo del posizionamento temporale fanno parte del FramePositioningControl e così via.
Componenti fondamentali
L’immagine a lato rappresenta quelli che sono gli oggetti fondamentali delle Mobile Media API:
  • il Manager costituisce il punto di accesso alle risorse multimediali.
  • il DataSource rappresenta il contenuto informativo vero e proprio.
  • il Player è responsabile della presentazione multimediale delle informazioni.
  • i Controlli permettono di manipolare ed alterare le caratteristiche del flusso video riprodotto.
Le MMAPI sono organizzate in tre package:
  • javax.microedition.media : è il package principale e contiene la definizione delle classi Manager e Player
  • javax.microedition.media.control: raggruppa tutte le interfaccia per l’implementazioni delle classi di tipo Control
  • javax.microedition.media.protocol: il package contenente la classe DataSource per il recupero di dati multimediali

La classe Manager

La classe Manager fornisce tre distinti metodi per creare un Player:
  • a partire da un Media Locator
  • utilizzando un DataSource
  • utilizzando un InputStream

Creazione tramite Media Locator

Un Media Locator non è altro che un URI che rispetta una determinata sintassi:
  scheme:scheme-specific-part
che identifica la sorgente dei dati ed il tipo di operazione ("capture" per l’acquisizione):
  • "capture://audio" imposta come sorgente di acquisizione dati il microfono del dispositivo
  • "capture://video" imposta come sorgente di acquisizione dati la fotocamera del dispositivo
  • "capture://audio_video" imposta come sorgenti di acquisizione dati sia la fotocamera che il microfono del dispositivo
  • "rtp://address:port/type" utilizza il Real Time Protocol utilizzando come sorgente dati una risorse trasmessa in streaming di tipo audio o video (a seconda che type sia "audio" o "video")
  • "http://risorsa" cattura una sorgente dati audio/video reperibile tramite protocollo http
Esistono inoltre i Media Locator definiti da Manager.TONE_DEVICE_LOCATOR e Manager.MIDI_DEVICE_LOCATOR che danno accesso rispettivamente ai dispositivi per la riproduzione di una sequenza di tonalità e per la riproduzione di file MIDI.
In modalità di acquisizione (capture) è possibile specificare le caratteristiche del flusso dati audio, video o mixed (audio + video) specificando una serie di parametri (per conoscerli rimando alla documentazione ufficiale).
Il seguente esempio definisce un Media Locator per un’acquisizione video in scala di grigi con una larghezza di 160 pixel ed un’altezza di 120 pixel
  capture://video?encoding=gray8width=160height=120
Una volta definito il Media Locator è possible creare un Player come nell’esempio:
...

try
{
   Player player = Manager.createPlayer ("http://server/audio.wav");
   player.start();
}
catch(Exception e)
{
   ...
}

...

Creazione tramite DataSource

La creazione tramite DataSource avviene in maniera analoga a quella che utilizza un Media Locator ma a differenza di questa permette di avere un controllo migliore del flusso dati tramite i seguenti metodi:
  • connect() effettua la connessione alla sorgente dati
  • disconnect() si disconnette dalla sorgente dati
  • start() inizia (o riprende) il trasferimento dati
  • stop() ferma (o sospende) il trasferimento dati

Creazione tramite InputStream

La creazione di un Player tramite InputStream infine potrebbe essere utilizzata per riprodurre file multimediali memorizzati nel RecordStore del dispositivo nel seguente modo:
RecordStore store;

...

try
{
   InputStream stream = new ByteArrayInputStream(store.getRecord(1));
   Player player = Manager.createPlayer(stream, "audio/X-wav");
   player.start();
}
catch (Exception e)
{
   ...
}

...

Il Player

Nelle MMAPI un Player si può trovare in cinque diversi stati:
  • Unrealized quando non ha abbastanza informazioni per reperire le risorse necessarie al funzionamento
  • Realized quando ha ottenuto tutte le informazioni necessarie al funzionamento: in questo stato il Player non ha ancora ottenuto le risorse (flussi audio o video) da processare ma è pronto a farlo
  • Prefetch quando compie tutte le operazioni di buffering necessarie a garantire un flusso dati costante in fase di riproduzione audio/video
  • Started quando sta processando i dati (riproducendo ad esempio un video)
  • Closed quando ha rilasciato la maggiorparte delle risorse di cui disponeva e non può essere utilizzato di nuovo
Quando un Player viene creato attraverso il Manager si trova nello stato di Unrealized; per transitare allo stato di Realized occorre invocare il metodo realize(), il passaggio dallo stato di Realized a quello di Prefetch avviene tramite il metodo prefetch() e quindi allo stato di Started con il metodo start() (i passaggi di stato inversi avvengono invocando deallocate() negli stati di Realized e Prefetched e stop() nello stato di Started).
Il metodo close() fa transitare il Player nello stato di Closed in qualsiasi momento.
Stati del Player
L’immagine a lato rappresenta il diagramma degli stati possibili in cui può trovarsi il Player nel corso della sua "esistenza".

Sono altresì rappresentati mediante archi orientati gli eventi responsabili delle transizioni da uno stato all’altro: ad eccezione di quello che porta il Player nello stato di Closed tutti gli altri cambiamenti di stato sono reversibili.
E’ possibile monitorare i cambiamenti di stato del Player ed in generale gli eventi generati implementando un PlayerListener e collegandolo al Player mediante il metodo addPlayerListener(PlayerListener listener).
L’interfaccia PlayerListener contiene soltanto il metodo playerUpdate(Player player, java.lang.String event, java.lang.Object eventData) che viene invocato ogni volta che viene intercettato un evento generato dal Player (un cambiamento di stato, oppure l’inizio e l’interruzione del buffering, inizio e la fine di un registrazione o di un media, il cambiamento delle dimenzioni del display ed altro ancora).
...

class PlayerMonitor implements PlayerListener
{

   ...

   public void playerUpdate(Player player,String event,Object eventData)
   {
      if (event.equals(PlayerListener.STARTED))
      {
         ...
      }
      else
      if (event.equals(PlayerListener.END_OF_MEDIA))
      {
         ...
      }
      else

      ...

   }

}

...
L’oggetto Player fornisce anche metodi per il recupero della durata del media getDuration(), il contenuto del media getContentType(), dello stato getState() e dei controlli getControl(java.lang.String controlType)

Utilizzo dei controlli

Il metodo getControl(java.lang.String controlType) della classe Player consente di recuperare una serie di funzioni raggruppate logicamente per elaborare i media.

Il package javax.microedition.media.control raggruppa tali funzioni nelle seguente interfacce:
  • FramePositioningControl
  • MetaDataControl
  • MIDIControl
  • PitchControl
  • RateControl
  • RecordControl
  • StopTimeControl
  • TempoControl
  • VideoControl
  • VolumeControl

FramePositioningControl

L’interfaccia FramePositioningControl contiene funzioni di posizionamento in un preciso frame del flusso video:
  • mapFrameToTime(int frameNumber) converte il numero frame nel corrispondente tempo
  • mapTimeToFrame(long mediaTime) converte un istante di tempo nel corrispondente frame del flusso video
  • seek(int framenumber) posiziona il Player nel frame specificato
  • skip(int framesToSkip) salta il numero di frame specificati come parametro
FramePositioningControl positioningControl = (FramePositioningControl)(player.getControl("FramePositioningControl"));
positioningControl.skip(50);

MetaDataControl

Recupera informazioni sui metadati relativi al media riprodotto.

Utilizza i metodi:
  • getKeys() restituisce tutti i metadati associati al media
  • getKeyValue(java.lang.String key) restituisce il valore corrispondente ad una determinata chiave MetaDataControl.AUTHOR_KEY, MetaDataControl.COPYRIGHT_KEY, MetaDataControl.DATE_KEY e MetaDataControl.TITLE_KEY.

MIDIControl

Fornisce funzionalità per il controllo di sintetizzatori interni o esterni al dispositivo J2ME.

In particolare permette di:
  • i programmi assegnati a ciascuno dei 16 canali getProgram(int channel)
  • recuperare il volume di ogni canale getChannelVolume(int channel)
  • recuperare una lista delle "banche suoni" interne getBankList(boolean custom)
  • recuperare una lista dei programmi di una "banca suoni" getProgramList(int bank)
  • recuperare il nome di uno specifico programma getProgramName(int bank,int prog)
  • assegnare il volume ad un canale setChannelVolume(int channel,int volume)
  • settare il programma di uno specifico canale setProgram(int channel,int bank,int program)
  • inviare messaggi MIDI al dispositivo shortMidiEvent(int type,int data1,int data2)
Con la parola "programma" ci si riferisce ad un particolare strumento, una "banca suoni" può contenere fino a 128 strumenti numerati da 0 a 127.

PitchControl

L’interfaccia PitchControl permette di controllare la tonalità dell’audio durante la riproduzione senza variare altri parametri, attraverso i seguenti metodi:
  • getMaxPitch() ritorna la massima tonalità consentita
  • getMinPitch() ritorna la minima tonalità consentita
  • setPitch(int millisemitones) imposta la tonalità al valore specificato
  • getPitch() restituisce la tonalità corrente

RateControl

Il RateControl permette di effettuare controlli sulla velocità di riproduzione del media:
  • getMaxRate() restituisce la massima velocità di riproduzione
  • getMinRate() restituisce la minima velocità di riproduzione
  • getRate() restituisce l’attuale velocità di riproduzione
  • setRate(int millirate) imposta la velocità di riproduzione

RecordControl

Fornisce i metodi per la registrazione di ciò che è correntemente riprodotto dal Player.
  • startRecord() inizia la registrazione
  • stopRecord() ferma la registrazione
  • commit() effettua il salvataggio di quanto è stato registrato
  • reset() effettua un reset di quanto è stato registrato
  • setRecordSizeLimit(int size) permette di specificare il numero Massimo di byte utilizzati per la registrazione
  • setRecordLocation(String location) permette di stabilire dove verranno salvati i dati
  • setRecordStream(Outputstream output) permette di impostare lo stream al quale verranno inviati i dati registrati
try
{
  Player player = Manager.createPlayer("capture://video ?encoding=gray8");
  player.realize();
  RecordControl rc = (RecordControl)player.getControl("RecordControl");
  ByteArrayOutputStream output = new ByteArrayOutputStream();
  rc.setRecordStream(output);
  rc.startRecord();
  p.start();
  Thread.currentThread().sleep(5000);
  rc.commit();
  p.close();
}
catch (Exception e)
{
  ... 
}

StopTimeControl

Permette di impostare l’istante di tempo di arresto del Player.
  • getStopTime() recupera l’attuale istante di arresto del Player
  • setStopTime(long stopTime) imposta l’istante di tempo di arresto del Player
player = Manager.createPlayer ("http://server/video.mpg");
player.realize();

...

StopTimeControl stopControl = (StopTimeControl)(player.getControl("StopTimeControl"));
stopControl.setStopTime(1000000);

TempoControl

Permette di impostare il tempo (battute al minuto) per la riproduzione di contenuti musicali.
  • getTempo() recupera il tempo attualmente impostato
  • setTempo(int millitempo) permette di impostare le battute per minuto per la riproduzione audio

VideoControl

Contiene metodi che permettono di gestire il rendering video sui dispositivi J2ME.

In particolare:
  • getDisplayHeight() ritorna l’altezza attuale del video
  • getDisplayWidth() restituisce la larghezza attuale del video
  • getDisplayX() restituisce la coordinata orizzontale della posizione del video rispetto alla gui nel quale è inserito
  • getDisplayY() restituisce la coordinata verticale della posizione del video rispetto alla GUI nel quale è inserito
  • getSnapShot(String type) cattura l’immagine del contenuto visualizzato
  • getSourceHeight() restituisce l’altezza della sorgente video
  • getSourceWidth() restituisce la larghezza della sorgente video
  • setDisplayFullScreen(boolean mode) permette di impostare una visualizzazione del video a tutto schermo o meno
  • setDisplayLocation(int x,int y) permette di impostare la posizione del video rispetto alla GUI nel quale è inserito
  • setDisplaySize(int width. Int height) permette di impostare le dimensioni del video
  • setVisible(boolean visibile) permette di visualizzare o nascondere il video
...

if (player!=null)
{
   try
   {
      byte[] fotografia = videoControl.getSnapShot(’encoding=png’);
      ...

   }
   catch(Exception ecc)
   {
      ...
   }
}

...

VolumeControl

L’interfaccia per la manipolazione del volume audio.
  • getLevel() restituisce il livello di volume corrente
  • isMute() restituisce un boolean che indica se l’audio è muto o meno
  • setLevel(int level) permette di impostare il livello dell’audio
  • setMute(boolean mute) permette di impostare l’audio a muto