MokaByte 95 - Aprle 2005 
Multimedialità su J2ME
Lo stato dell'arte
di
Vincenzo Viola
Questo articolo descrive lo stato dell'arte per quanto riguarda l'implementazione di applicazioni multimediali sulla piattaforma Java 2 Micro Edition. In particolare saranno descritte, analizzate e confrontate le funzionalità offerte da Mobile Media API (MMAPI), MIDP Media API e Advanced Multimedia Supplements (AMMS)

Introduzione
L'attenzione alla multimedialità su piattaforma J2ME nasce con le MMAPI 1.0. Infatti né le configurazioni CDC o CLDC né il profilo MIDP 1.0 implementavano funzionalità di tipo multimediale.
Con il MIDP 2.0 una parte delle MMAPI sono migrate all'interno del profilo, permettendo anche ai dispositivi che non supportavano le MMAPI di aver a disposizione un set, seppur ridotto, di media API.
Le MMAPI 1.1 vanno a fissare problemi di documentazione, aggiungono alcune definizioni e rivedono la documentazione relativa al MIDP 2.0 security framework. Non implementano cambiamenti a classi, interfacce o metodi.
Dalla necessità di sfruttare e combinare le innovative feautures dei dispositivi mobili più recenti (v. UMTS), nascono le Advanced Multimedia Supplements (AMMS).
In questo articolo descriveremo e confronteremo tutte queste soluzioni al fine di dare una panoramica completa delle potenzialità multimediali dei diversi dispositivi mobili Java.

 

MMAPI
Iniziamo la nostra analisi dalle Mobile Media API che, come già detto, rappresentano il primo, e il più utilizzato dagli sviluppatori, strumento per la realizzazione di applicazioni multimediali.
Si tratta di un package opzionale pensato per funzionare su dispositivi J2ME abilitati.
Riportiamo di seguito le caratteristiche rese disponibili dalle MMAPI 1.0, secondo le idee che hanno dato vita alla relativa JSR:

  • Support for Tone Generation, Playback, and Recording of Time-Based Media: il package supporta la fruizione di qualsiasi contenuto audio o video time-based.
  • Small Footprint: le MMAPI hanno a disposizione una memoria limitata, secondo quanto previsto dalla configurazione CDC o CLDC.
  • Protocol- and Content-Agnostic: le API non si basano su specifici protocolli o tipologie di contenuto.
  • Subsettable: gli sviluppatori possono limitare il supporto a particolari tipologie di contenuto.
  • Extensible: le nuove caratteristiche possono essere facilmente aggiunte, in particolare i formati addizionali possono essere resi facilmente supportabili.
  • Options for Implementers: le API offrono funzionalità per diversi scopi. Esse sono realizzate in modo da permettere agli sviluppatori di lasciare non implementate funzionalità che non intendono fornire o che il terminale non supporta.

Le modalità per l'elaborazione di dati multimediali sono due:

  • Protocol Handling: lettura di dati da una sorgente quale un file o uno streaming server e inserimento in un sistema di processamento.
  • Content Handling: manipolazione o decodifica di dati multimediali al fine di renderizzarli per dispositivi quali un audio speaker o un display video.

Per facilitare queste operazioni le API forniscono due tipologie di oggetti di alto livello:

  • DataSource: incapsula il meccanismo di protocol handling nascondendo i dettagli su come i dati vengono letti dalla sorgente. I metodi di questo oggetto rendono possibile la manipolazione del contenuto da parte dell'oggetto Player.
  • Player: legge i dati dal DataSource, gli elabora e li renderizza per dispositivi di output. Questo oggetto fornisce i metodi per la riproduzione di dati multimediali e una serie di controlli per poter disporre delle caratterische specifiche dei dati stessi.

Le MMAPI forniscono un terzo oggetto, un meccanismo di costruzione noto come Manager, necessario per la creazione di Player a partire da DataSource o da InputStream.
L'architettura delle MMAPI è mostrata nella Fig. 1:


Figura 1
- L'architettura MMAPI

 

Il Manager dispone del metodo createPlayer():

Player player = Manager.createPlayer(String url);

dove url specifica protocollo e contenuto, nel formato <protocol>:<content location>.

I metodi del Player così creato vengono utilizzati per controllare la riproduzione e l'accesso ai dati multimediali.

Il ciclo di vita del Player è costituito da cinque stati: UNREALIZED, REALIZED, PREFETCHED, STARTED e CLOSED.

I metodi utilizzati per le transizioni di stato sono invece sei:

realize ( )
prefetch ( )
start ( )
stop ( )
deallocate ( )
close ( )

 


Figura 2 - Gli stati di un Player MMAPI

 

Come si vede nella Fig. 2, quando il Player viene creato è nello stato UNREALIZED.
Chiamando realize ( ) il Player transita nello stato REALIZED e vengono inizializzate le informazioni di cui esso ha bisogno per acquisire le risorse multimediali.
Dopo che è stato invocato il metodo realize ( ) il solo modo per tornare nello stato UNREALIZED è chiamare il metodo deallocate ( ); ciò può essere utile nel caso in cui il Player resta bloccato durante la fase di "realizzazione".
Chiamando prefetch ( ) il Player transita nello stato PREFETCHED, stabilisce le connessioni di rete nel caso di streaming ed effettua altre azioni preliminari.
Si può tornare dallo stato PREFETCHED allo stato REALIZED invocando deallocate ( ).
La chiamata start ( ) provoca il passaggio allo stato STARTED, nel quale il Player è in grado di processare i dati. Quando termina la fase di gestione dei dati il Player ritorna nello stato PREFETCHED.
Infine, chiamando close ( ) il Player passa allo stato CLOSED in cui ha rilasciato la maggior parte delle risorse.

Il quarto componente principale delle MMAPI è il Control, il quale controlla varie caratteristiche del Player e le operazioni di riproduzione. Un'applicazione usando il metodo getControl ( ) ottiene un singolo controllo mentre con getControls ( ) ottiene un array contenente tutti i controlli supportati.

Nel package javax.microedition.control le MMAPI dispongono di dodici controlli:

  • MetaDataControl: ottiene informazioni "metadata" dai dati multimediali.
  • MIDIControl: fornisce l'accesso ai dispositivi per la trasmissione e la renderizzazione di dati MIDI.
  • GUIControl: rappresenta un controllo che fornisce una componente UI.
  • PitchControl: aumenta o diminuisce il pitch di riproduzione senza cambiarne la velocità.
  • RateControl: controlla la velocità di riproduzione.
  • TempoControl: controlla il "tempo" di una canzone MIDI.
  • VolumeControl: controlla il volume.
  • VideoControl: controlla il contenuto visivo del display.
  • FramePositioningControl: abilita il posizionamento su un preciso video frame.
  • RecordControl: registra quello che viene mostrato dal Player.
  • StopTimeControl: abilita l'applicazione a definire un tempo presettato di stop per il Player.
  • ToneControl: è un'interfaccia che abilita la riproduzione di sequenze di toni definite dall'utente.

Ovviamente non tutti i device supportano tutti i controlli. Si può verificare quali siano i controlli supportati tramite la chiamata System.getProperty(String key), dove, secondo le specifiche, le stringhe da utilizzare per ottenere le proprietà sono:

  • microedition.media.version restituisce una stringa che rappresenta la versione di MMAPI implementata: "1.0", "1.1" oppure "null".
  • supports.mixing restituisce "true" se il mixing è supportato altrimenti "false".
  • supports.audio.capture restituisce "true" se la cattura audio è supportata altrimenti "false".
  • supports.video.capture restituisce "true" se la cattura video è supportata altrimenti "false".
  • supports.recording restituisce "true" se la registrazione è supportata altrimenti "false".
  • audio.encodings restituisce una stringa che rappresenta i formati di cattura audio supportati o "null" se la cattura audio non è supportata.
  • video.encodings restituisce una stringa che rappresenta i formati di cattura video supportati o "null" se la cattura video non è supportata.
  • video.snapshot.encodings restituisce una stringa che rappresenta i formati di cattura immagini supportati o "null" se la cattura immagini non è supportata.
  • streamable.contents restituisce una stringa che rappresenta le tipologie di contenuti di streaming supportati utilizzando la sintassi MIME.

Oltre alle proprietà che resituisce System.getProperty(), il Manager dispone anche di due utili metodi statici:

  • String[] getSupportedContentTypes(String protocol) prende un protocollo come "http" e restituisce le tipologie di contenuto supportate da quel protocollo.
  • String[] getSupportedProtocols(String contentType) prende una tipologia di contenuto in sintassi MIME, come "video/mpeg" e restituisce i protocolli che possono essere utilizzati per trasportarlo.

MIDP 2.0 Media API
Le MIDP 2.0 Media API sono un sottoinsieme delle MMAPI pensare per dispositivi che dispongono del profilo MIDP 2.0 ma non hanno strumenti multimediali adeguatamente estesi.
In particolare le MIDP 2.0 Media API differiscono dalle MMAPI in quanto:

  • supportano soltanto funzionalità legate all'audio: riproduzione ed eventualmente registrazione;
  • tutti i controlli connessi al video o alla grafica sono esclusi;
  • non è supportata la sincronizzazione nella riproduzione simultanea di più pacchetti audio;
  • il package javax.microedition.media.protocol è escluso;
  • viene utilizzata una versione semplificata del Manager.

In pratica il MIDP 2.0 include il cosiddetto Audio Building Block (ABB) che permette di utilizzare toni, sequenze di toni e file WAV all'interno di applicazioni MIDP. Gli unici controlli presenti sono ToneControl e VolumeControl.

 

Advanced Multimedia Supplements
AMMS, che al momento ancora non è stato rilasciato, implementerà la JSR 234. Si tratterà di un package opzionale dedicato a funzionalità multimediali avanzate connesse alle recenti innovazioni nell'hardware dei dispositivi mobili.
Le AMMS andranno ad estendere le potenzialità delle MMAPI.
L'obiettivo è offrire un miglior supporto per la camera e la radio e la possibilità di elaborazioni avanzate sull'audio.
Alcune delle migliorie descritte nelle specifiche delle AMMS sono:

  • accesso a specifici controlli della camera come luminosità e contrasto, flash, modalità lampeggiante e zoom;
  • accesso alla radio e ad altri canali e sorgenti frequency-based, compreso l'RDS (Radio Data System);
  • accesso a particolari funzionalità di elaborazione audio come equalizzatore, effetti audio, riverbero artificiale, audio 3D;
  • possibilità di direzionare l'uscita, ad esempio smistare l'audio a casse, microfono o cuffie.

Essendo le AMMS basate sulle MMAPI ereditano i concetti di Player, per riprodurre audio e video; Manager per creare Player; Control per interagire con i Player. In più, AMMS aggiunge altri controlli ad un GlobalManager, che viene utilizzato per creare nuovi oggetti per gli effetti di rete e l'elaborazione delle immagini.

A livello funzionale, l'implementazione delle AMMS consiste di cinque blocchi:

  • Camera;
  • Image Effect;
  • Tuner;
  • Audio Effect;
  • 3D Audio

Almeno uno di questi macrorequisiti deve essere supportato da un dispositivo perché esso sia "AMMS-compliant". Ognuno di questi blocchi definisce una serie di funzionalità, raggruppate in uno specifico package, e implementate sotto forma di controlli.
Oltre ai controlli specifici per ogni macrorequisito, ci sono dei controlli generali, contenuti nel package javax.microedition.amms.control:

  • AudioFormatControl: controlla i settaggi relativi al formato audio.
  • ContainerFormatControl: controlla i settaggi dei formati "container" (audio + video)
  • EffectControl: interfaccia per il controllo di un filtro astratto con varie impostazioni presettate.
  • EffectOrderControl: interfaccia utilizzata per specificare l'ordine degli effetti rappresentati da EffectControl.
  • FormatControl: controlla il formato utilizzato nel salvataggio di dati multimediali.
  • ImageFormatControl: controlla i settaggi relativi al formato delle immagini.
  • MIDIChannelControl: controllo che dà accesso a risorse di tipo MIDI.
  • PanControl: interfaccio per la manipolazione del "panning" di un Player in modalità stereo. Il pannin consiste nel posizionamento del suono in una determinata posizione spaziale su due o più canali.
  • PriorityControl: interfaccia per il controllo delle priorità tra diversi Player.
  • VideoFormatControl: controlla i settaggi relativi al formato video.

Andiamo ora ad analizzare i singoli macroblocchi.

 

Camera
Cominciamo dalla funzionalità "Camera". Il relativo package è javax.microedition.amms.control.camera. Esso contiene sei controlli:

  • CameraControl: controlla le caratteristiche della camera del telefono; ad esempio si può abilitare lo shutter (otturatore) audio/video; si può controllare se la camera è ruotata per essere in modalità "portrait", si può scegliere la modalità di esposizione e la risoluzione delle immagini.
  • ExposureControl: per settare le impostazioni relative all'esposizione, quali l'apertura e la velocità dello shutter e la sensibilità.
  • FlashControl: per settare le impostazioni relative al flah, quali la riduzione dell'effetto "occhi rossi" (red-eye reduction).
  • FocusControl: fornisce un controllo sul focus.
  • SnapshotControl: fornisce un controllo sulla cattura delle immagini, mettendo a disposizione "modalità sequenza", autoscatto, ecc.
  • ZoomControl: fornisce un controllo sullo zoom, ottico o digitale

 

Image Effect
Questa funzionalità permette di manipolare le immagini dopo che sono state catturate. Prima di utilizzare un controllo bisogna usare un GlobalManager per creare un MediaProcessor.
I possibili controlli sono:

  • ImageEffectControl: contiene una serie di filtri quali ad esempio quello per rendere l'immagine monocromatica o farne il negativo.
  • ImageTonalityControl: permette di cambiare alcune impostazioni delle immagini, quali luminosità e contrasto.
  • ImageTransformControl: implementa una serie di trasformazioni sulle immagini: rotazione, crop, zoom, mirror, flip, stretch.
  • OverlayControl: fornisce una serie di settaggi per gestire le immagini in sovraimpressione sullo schermo.
  • WhiteBalanceControl: permette di cambiare il bilanciamento del bianco in immagini e video.

 

Tuner
Si tratta di una serie di funzionalità legate alla radio. Il relativo package è javax.microedition.amms.control.tuner. I controlli sono due:

  • TunerControl: interfaccia per controllare le impostazioni del radio player, ad esempio per trovare una stazione radio FM e memorizzarla.
  • RDSControl: interfaccia per accedere ai dati RDS (Radio Data System) di una stazione: ad esempio si può accedere ad informazioni di tipo TA (Traffic Anouncement).

Audio Effect
Questo requisito prevede a livello realizzativo una serie di controlli per cambiare le impostazioni dell'audio, in particolare durante l'ascolto di musica. Il relativo package è: javax.microedition.amms.control.audioeffect.
I controlli sono:

  • AudioVirtualizerControl: è un effetto utilizzano per rendere virtuali i canali audio. Il comportamento esatto di questo effetto dipende dal numero e dal tipo di canali audio che il Player ha a disposizione. Un Player dotato di 5.1 utilizza un algoritmo di surround virtuale.
  • ChorusControl: interfaccia per settare le impostazioni relative agli effetti "chorus" e "flanger".
    Il chorus è un effetto sonoro che simula la presenza di più fonti sonore, lievemente differenti tra loro per quanto riguarda l'intonazione e lo sviluppo temporale, creando l'effetto di un coro. Si utilizza per dare corpo al suono.
    Il flanger è un effetto sonoro che sovrappone al segnale originale un segnale identico ma rallentato, ottenendo una modulazione costante.
  • EqualizerControl: interfaccia per settare le impostazioni relative all'equalizzatore. L'equilizzatore solitamente viene utilizzato per due motivi: compensare la risposta in frequenza non ideale del sistema al fine di rendere il suono più naturale oppure per creare effetti modificando in modo innaturale il suono.
  • ReverbControl: interfaccia per settare le impostazioni relative all'effetto riverbero.
    Il riverbero è un effetto sonoro che simula un ambiente acustico in cui si sviluppa il suono, mediante la sovrapposizione di numerose linee di ritardo, opportunamente filtrate e sfasate rispetto all'originale. Il riverbero è essenziale per percepire le proprietà dell'ambiente circostante, dalle dimensioni ai materiali delle pareti.
  • ReverbSourceControl: interfaccia per settare le impostazioni relative alle sorgenti di riverbero.

3D audio
Le funzionalità 3D audio sono probabilmente le meno comprensibili in quanto non di uso comune per l'utente e comunque abbastanza complicate anche dal punto di vista implementativo. Le API permettono allo sviluppatore di costruire una rete di Player che possono essere combinati e ai quali si possono applicare degli effetti audio. I tradizionali effetti 2D sono estesi con gli effetti 3D che mirano a localizzare le sorgenti sonore in uno spazio virtuale tridimensionale intorno all'ascoltatore.
Il package utilizzato è javax.microedition.amms.control.audio3d.
I controlli sono:

  • CommitControl: fornisce un meccanismo per fare in modo che alcuni parametri audio vengano aggiornati simultaneamente.
  • DirectivityControl: aggiunge a OrientationControl un metodo per settare il modello di direttività di una sorgente sonora.
  • DistanceAttenuationControl: interfaccia per controllare l'attenuazione del suono proveniente da una data sorgente al variare della sua distanza dall'ascoltatore.
  • DopplerControl: interfaccia per settare le impostazioni relative all'effetto Doppler.
    L'effetto Doppler è il cambio di frequenza percepito dall'ascoltatore nel suono emesso da una sorgente sonora quando la distanza tra di loro varia rapidamente.
  • LocationControl: interfaccia per manipolare la posizione virtuale di un oggetto nello spazio acustico virtuale.
  • MacroscopicControl: interfaccia per manipolare il comportamento macroscopico di una sorgente sonora quando si usa il 3D audio. Di default le sorgenti sonore sono considerante come punti di dimensione zero. Questo controllo va a specificare una dimensione finita per le sorgenti sonore. Ciò può essere utile nel caso di sorgenti sonore di grandi dimensioni come le cascate.
  • ObstructionControl: fornisce un meccanismo di controllo sui livelli generali del segnale audio che fluisce direttamente dalla sorgente verso l'ascoltatore. Inoltre permette di filtrare (attenuare) le componenti ad alta frequenza del segnale ad uno specifico livello.
  • OrientationControl: interfaccia per manipolare l'orientamento virtuale di un oggetto nello spazio acustico virtuale.

Conclusioni
Le MMAPI forniscono alcune interessanti funzionalità multimediali. Le MIDP Media API fondamentalmente forniscono soltanto un minimo supporto audio. Le AMMS integrate con le MMAPI permettono invece di realizzare applicazioni davvero avanzate, che addirittura presumono delle conoscenze tecniche non comuni.
Il boom multimediale che ha investito il mondo mobile sia a livello hardware che software non ha lasciato indifferente la comunità tecnologica internazionale, che mette a disposizione su una piattaforma flessibile come Java funzionalità sempre più innovative ed aggiornate con le tecnologie in uso.

 

Bibliografia
[1] http://jcp.org/en/jsr/detail?id=234
[2] http://java.sun.com/products/mmapi/index.jsp
[3] http://java.sun.com/products/midp/index.jsp
[4] http://java.sun.com/products/cldc/index.jsp
[5] http://java.sun.com/j2me/index.jsp

 

Vincenzo Viola è nato a Formia (LT) il 03/11/1977, laureato in Ingegneria delle Telecomunicazioni presso l'Università Federico II di Napoli con una tesi sulla segmentazione automatica di video digitali in scene, con sviluppo software implementato su piattaforma Java - Oracle.
Lavora come progettista software per una Mobile Company che offre la sua consulenza ai gestori di telefonia e alle major del settore ICT.

MokaByte® è un marchio registrato da MokaByte s.r.l. 
Java®, Jini® e tutti i nomi derivati sono marchi registrati da Sun Microsystems.
Tutti i diritti riservati. E' vietata la riproduzione anche parziale.
Per comunicazioni inviare una mail a info@mokabyte.it