Come per la prima parte del tutorial,chiudiamo illustrando un'applicazione di quanto visto in questa parte dedicata alla compressione audio.Si tratta di una classe Java in grado di convertire un file audio compresso dal formato ADPCM al formato PCM lineare,che può essere usata come codec per Java Media Framework (JMF). Che cos'e' Java Media Framework ------------------------------- Java Media Framework (JMF) e' una suite di classi e interfacce pensate da Sun e IBM per acquisire e manipolare dati multimediali (audio,video e immagini). JMF è implementato nel package javax.media e può essere liberamente scaricato all'indirizzo java.sun.com insieme all'applicazione dimostrativa JM STUDIO. Presuppongo che chi mi sta leggendo abbia una certa familiarità con Java e la programmazione a oggetti. Descrizione essenziale ---------------------- Le classi più importanti di javax.media sono le seguenti javax.media.Codec javax.media.Demultiplexer javax.media.Renderer javax.media.Multiplexer javax.media.Effect Per i nostri scopi ci interessa solo la prima. Un oggetto che implementa l'interfaccia javax.media.Codec è in grado di comprimere,decomprimere o convertire dati multimediali da un formato a un altro;per esempio,da PCM lineare a MP3 nel caso di un encoder audio (o viceversa,nel caso di un decoder audio). Per implementare un codec bisogna definire i seguenti metodi public Format[] getSupportedInputFormats() Restituisce la lista dei formati multimediali che il codec accetta come ingresso. Un decoder audio restituirà una serie di oggetti che specificano il tipo di compressione,il tasso di campionamento,il numero dei canali,l'endianess e la polarità dei dati in ingresso (signed/unsigned). public Format[] getSupportedOutputFormats(Format input) Restituisce la lista dei formati multimediali che il codec è in grado di generare per un certo formato in ingresso. Generalmente la corrispondenza è di tipo 1:1,nel senso che ad ogni formato dei dati in ingresso corrisponde un solo formato in uscita. public Format setInputFormat(Format format) Definisce il formato dei dati in ingresso;il codec restituisce il formato richiesto o un formato "simile" a quello richiesto. Per esempio,a un decoder audio potrebbe essere richiesto di trattare un segnale audio con tasso di campionamento di 44100 campioni/secondo,ma funzionare su un dispositivo obsoleto in grado di elaborare al massimo 22050 campioni/secondo.In questo caso,il codec restituirà il tasso di campionamento massimo possibile per il dispositivo. public Format setOutputFormat(Format format) Definisce il formato dei dati in uscita;il codec restituisce il formato richiesto o un formato "simile" a quello richiesto. Per esempio,a un decoder audio potrebbe essere richiesto di decomprimere un segnale audio su 44100 campioni/secondo ma funzionare su una scheda audio in grado di riprodurre al massimo 22050 campioni/secondo.In questo caso,il codec restituirà il tasso di campionamento massimo gestibile dalla scheda audio. public int process(Buffer input, Buffer output) Qui i dati in ingresso vengono letti,convertiti nel formato di uscita e depositati nel buffer apposito. Al termine del processo il codec restituisce un codice d'errore,tipicamente BUFFER_PROCESSED_OK se i dati sono stati elaborati e convertiti correttamente o BUFFER_PROCESSED_FAILED in caso contrario (per esempio perchè non è stato riconosciuto il formato d'ingresso o perchè c'e' congestione nella rete da cui arrivano i dati). Funzionamento essenziale di JM STUDIO ------------------------------------- JM STUDIO è una semplice applicazione per acquisire e riprodurre file multimediali di ogni tipo,presenti nel filesystem locale o prelevati da una rete. Le capacità di JMS possono essere estese aggiungendo classi alla voce PlugIns del JMF Registry Editor;questa è divisa in 5 sottovoci Demultiplexer Codec Effect Renderer Multiplexer Aggiungere una classe ad una di queste cinque sottovoci significa permettere a JM STUDIO di leggere e manipolare nuovi formati di dati multimediali,oppure di manipolare diversamente formati di dati già esistenti. Prima di passare all'installazione dobbiamo definire un altro paio di metodi per permettere al nostro decoder ADPCM di funzionare come un plug-in all'interno di JMS public String getName() Restituisce il nome identificativo del plug-in;il nome da me scelto è Custom IMA ADPCM Decoder (notare la fantasia da ingegnere...) public Object[] getControls() Assegna una serie di controlli visuali a questo codec (per esempio regolazione del volume per un codec audio,o della luminosità per un codec video).Per i nostri scopi possiamo ignorare questo metodo. Ok,let's go!! Installazione e prova del codec ------------------------------- Dopo aver scaricato JM STUDIO,lanciamolo.Cliccando su File->Preferences... entriamo diretti nel JMF Registry Editor.A questo punto,andiamo alla voce PlugIns e da qui selezioniamo il menu Codec:dovremmo vedere una schermata del genereDalla barra di testo Codec digitiamo il package in cui si trova il decoder che vogliamo instal= lare,seguito dal nome del file di classe;nel mio caso il package è tuttowindows98.com.geocities. codecs.audio.IMADPCM e il nome della classe è IMADPCM_Decoder.Clicchiamo su Add e poi su Commit per confermare;se tutto è ok,il nostro codec è stato aggiunto in fondo all'elenco di sinistra.
Quando deve riprodurre una sequenza di dati multimediali,JM STUDIO legge dalla lista dei codec in ordine e seleziona il primo codec adatto che trova. JMS dispone già di un decoder ADPCM registrato come com.ibm.media.codec.audio.ima4.JavaDecoder _ms,perciò dobbiamo fare in modo che il nostro compaia in lista prima di questo,cliccando su Move Up e poi di nuovo su Commit.
A questo punto possiamo uscire dal registry,apriamo un file audio compresso con ADPCM e clic= chiamo su Player->PlugIn Viewer;dovremmo vedere questo
Questa è la sequenza di plug-in che JM STUDIO sta usando per riprodurre il file,e in mezzo c'e' proprio il *nostro* decoder:ma vieeeeeeniiiiii!!!!!!!!! IMADPCM_Decoder.jar Va indrè