Programma multimediale con JMF, parte 1

Java Media Framework (JMF) è un'API ampia e versatile utilizzata per elaborare supporti basati sul tempo. Tuttavia, la complessità di JMF può richiedere settimane per essere compresa. Con questa complessità in mente, questo articolo introduce JMF in modo semplice. Iniziamo disegnando un'analogia con un sistema stereo, quindi procediamo con le discussioni sulle interfacce e sulle classi più comuni di JMF. Infine, vedremo il codice funzionante che dimostra parte delle capacità dell'API.

Questo articolo, il primo di una serie in due parti, si concentra sull'architettura JMF. La parte 2 si concentrerà principalmente sul codice che mostra come registrare i dispositivi di acquisizione e come riprodurre e acquisire dati audio e video.

JMF, attualmente alla versione 2.1, è l'iniziativa di Sun di portare l' elaborazione multimediale basata sul tempo in Java. I media basati sul tempo sono dati che cambiano in modo significativo rispetto al tempo, come clip audio e video, sequenze MIDI e animazioni. Notare che Sun ha recentemente annunciato che rilascerà il codice sorgente JMF 2.1 nell'ambito del Sun Community Source Licensing Program (SCSL). Anche un'implementazione di riferimento completa, JMF 2.1 ti consentirà di fare qualsiasi cosa immaginabile con il multimedia. Tra gli altri usi, JMF può:

  • Riproduci vari file multimediali in un'applet o un'applicazione Java. I formati supportati includono AU, AVI, MIDI, MPEG, QuickTime e WAV.
  • Riproduci contenuti multimediali in streaming da Internet.
  • Cattura audio e video con il microfono e la videocamera, quindi archivia i dati in un formato supportato.
  • Elabora contenuti multimediali basati sul tempo e modifica il formato del tipo di contenuto.
  • Trasmetti audio e video in tempo reale su Internet.
  • Trasmissione di programmi radiofonici o televisivi in ​​diretta.

Tuttavia, prima di scrivere un'applicazione JMF, è necessario comprendere appieno l'architettura JMF, le sue interfacce e le sue classi.

L'architettura JMF

Per comprendere facilmente l'architettura JMF, prendi il tuo sistema stereo come confronto. Quando si riproduce un CD di Sarah Vaughan con il lettore CD, il CD fornisce i dati musicali al sistema. Questi dati sono stati precedentemente acquisiti utilizzando microfoni e altri dispositivi nello studio di registrazione. Il microfono funge da dispositivo di acquisizione audio. Il CD stesso è una fonte di dati per il sistema stereo.

Il lettore CD invia il segnale musicale all'altoparlante, il dispositivo di uscita. Tuttavia, dal lettore CD possiamo anche collegare un auricolare. In questo caso, l'auricolare funge da dispositivo di uscita.

JMF utilizza lo stesso modello. Continuando a leggere, incontrerai termini come:

  • Fonte di dati
  • Dispositivo di acquisizione
  • Giocatore
  • Processore
  • DataSink
  • Formato
  • Manager

Diamo un'occhiata a questi termini in modo più dettagliato.

Fonte di dati

Un'origine dati incapsula il flusso multimediale in modo molto simile a un CD musicale. In JMF, un DataSourceoggetto rappresenta il supporto audio, il supporto video o una combinazione dei due. A DataSourcepuò essere un file o un flusso in arrivo da Internet. La cosa buona di questa classe è che, una volta determinata la sua posizione o protocollo, DataSourceincapsula sia la posizione del supporto, sia il protocollo e il software utilizzati per distribuire il supporto. Una volta creato, a DataSourcepuò essere inserito in un Playerda renderizzare, senza Playerpreoccuparsi di dove abbia DataSourceavuto origine o di quale fosse la sua forma originale.

I dati multimediali possono essere ottenuti da varie fonti, come file locali o di rete o trasmissioni Internet in diretta. Pertanto, DataSourcei messaggi di posta elettronica possono essere classificati in base a come viene avviato un trasferimento di dati:

  • Pull data source: il client avvia il trasferimento dei dati e controlla il flusso di dati dall'origine. HTTP e FILE servono come esempi di protocolli stabiliti per questo tipo di dati.
  • Origine dati push: il server avvia il trasferimento dei dati e controlla il flusso di dati da un'origine dati push. Esempi di sorgenti dati push includono broadcast media e video on demand.

Come vedremo nella Parte 2 di questa serie, diverse origini dati possono essere combinate in una sola. Ad esempio, se stai catturando una scena dal vivo, è probabile che tu abbia due origini dati: audio e video. In quella situazione, potresti voler combinare questi due per un controllo più semplice.

Dispositivo di acquisizione

Un dispositivo di acquisizione rappresenta l'hardware utilizzato per acquisire i dati, come un microfono, una fotocamera o una videocamera. I dati multimediali acquisiti possono essere inseriti in un Playerper essere renderizzati, elaborati per convertire i dati in un altro formato o archiviati per un uso futuro.

I dispositivi di acquisizione possono essere classificati come sorgenti push o pull . Con un'origine pull, l'utente controlla quando acquisire un'immagine. Ad esempio, pensa a una fotocamera fissa in cui un utente fa clic su un pulsante per scattare la foto. Al contrario, un microfono funge da sorgente push perché fornisce continuamente un flusso di dati audio.

Giocatore

A Playerprende come input un flusso di dati audio o video e lo riproduce su un altoparlante o su uno schermo, proprio come un lettore CD legge un CD e trasmette musica all'altoparlante. A Playerpuò avere stati, che esistono naturalmente perché a Playerdeve preparare se stesso e la sua fonte di dati prima di poter iniziare a riprodurre i media. Per capirlo, inserisci un CD nello stereo e riproduci la quarta canzone del CD. Cosa succederebbe? Il lettore CD non riproduce immediatamente il brano. Prima deve cercare la traccia in cui inizia la quarta canzone e fare altri preparativi. Dopo circa mezzo secondo (a seconda del lettore CD), inizi ad ascoltare la musica. Allo stesso modo, il JMF Playerdeve fare un po 'di preparazione prima di poter ascoltare l'audio o vedere il video. Nelle normali operazioni, aPlayerpassa attraverso ogni stato fino a raggiungere lo stato finale. JMF definisce sei stati in a Player:

  • Non realizzato: in questo stato, l' Playeroggetto è stato istanziato. Come un neonato che non riconosce ancora il suo ambiente, un neonato istanziato Playernon sa ancora nulla dei suoi media.
  • Rendendosi conto: A Playerpassa dallo stato realizzato allo stato rendersi conto quando si chiama il Player's realize()metodo. Nello stato di realizzazione, Playerè in procinto di determinare i propri requisiti di risorse. Una realizzazione Playerscarica spesso risorse sulla rete.
  • Realizzato: la transizione dallo stato di realizzazione, Playerarriva allo stato di realizzazione. In questo stato Playersa di quali risorse ha bisogno e dispone di informazioni sul tipo di media che deve presentare. Può anche fornire componenti visivi e controlli e le sue connessioni ad altri oggetti nel sistema sono in atto.
  • Precaricamento: quando il prefetch()metodo viene chiamato, a si Playersposta dallo stato realizzato allo stato di precaricamento. Un prelettura si Playersta preparando a presentare i suoi media. Durante questa fase, Playerprecarica i suoi dati multimediali, ottiene risorse ad uso esclusivo e fa qualsiasi altra cosa sia necessaria per riprodurre i dati multimediali.
  • Precaricamento: lo stato in cui Playerha terminato il precaricamento dei dati multimediali: è pronto per iniziare.
  • Avviato: questo stato viene inserito quando si chiama il start()metodo. L' Playerora è pronto per presentare i dati multimediali.

Processore

A Processorè un tipo di Player. Nell'API JMF, Processorun'interfaccia si estende Player. In quanto tale, a Processorsupporta gli stessi controlli di presentazione di un file Player. A differenza di a Player, tuttavia, a Processorha il controllo su quale elaborazione viene eseguita sul flusso multimediale di input.

Oltre a eseguire il rendering di un'origine dati, a Processorpuò anche generare dati multimediali tramite a in DataSourcemodo che possano essere presentati da un altro Playero Processor, ulteriormente elaborati da un altro Processor, o convertiti in un altro formato.

Oltre ai sei Playerstati summenzionati , a Processorinclude due stati aggiuntivi che si verificano prima che Processorentri nello stato di realizzazione ma dopo lo stato non realizzato:

  • Configurazione: A Processorentra nello stato di configurazione dallo stato non realizzato quando configure()viene chiamato il metodo. A Processoresiste nello stato di configurazione quando si connette a DataSource, demultipla il flusso di input e accede alle informazioni sul formato dei dati di input.
  • Configurato: dallo stato di configurazione, a Processorpassa allo stato configurato quando è connesso a DataSourcee il formato dei dati è stato determinato.

Come con a Player, a Processorpassa allo stato realizzato quando realize()viene chiamato il metodo.

DataSink

È DataSinkun'interfaccia di base per gli oggetti che leggono il contenuto multimediale fornito da a DataSourceed eseguono il rendering del supporto in una determinata destinazione. Ad esempio DataSink, si consideri un oggetto di scrittura file che memorizza il supporto in un file.

Formato

Un Formatoggetto rappresenta il formato multimediale esatto di un oggetto. Il formato stesso non contiene parametri specifici della codifica o informazioni di temporizzazione globale; descrive il nome di codifica del formato e il tipo di dati richiesti dal formato. Formatle sottoclassi includono AudioFormate VideoFormat. A sua volta, VideoFormatcontiene sei sottoclassi dirette:

  • H261Format
  • H263Format
  • IndexedColorFormat
  • JPEGFormat
  • RGBFormat
  • YUVFormat

Manager

Un manager, un oggetto intermediario, integra implementazioni di interfacce chiave che possono essere utilizzate senza problemi con le classi esistenti. Nessun equivalente del mondo reale esiste nel sistema stereo, ma puoi immaginare un manager come un oggetto versatile che può interfacciare due oggetti diversi. Ad esempio, con Managerpuoi creare un file Playerda un file DataSource. JMF offre quattro gestori:

  • Manager: Utilizzare Managerper creare Players, Processors, DataSources, e DataSinks. Ad esempio, se vuoi eseguire il rendering di un DataSource, puoi usarlo Managerper creare un Playerper esso.
  • PackageManager: Questo Manager mantiene un registro di pacchetti che contengono le classi JMF, come consuetudine Players, Processors, DataSources, e DataSinks.
  • CaptureDeviceManager: Questo gestore mantiene un registro dei dispositivi di acquisizione disponibili.
  • PlugInManager: Questo gestore mantiene un registro dei componenti di elaborazione plug-in JMF disponibili.

Crea un giocatore

Con la programmazione multimediale JMF, uno dei tuoi compiti più importanti è creare un file Player. Si crea un Playerchiamando il metodo Manager's createPlayer(). Il Managerutilizza l'URL dei media o MediaLocatorche si specifica per creare un adeguato Player. Una volta che hai a Player, puoi ottenere i componenti visiviPlayer dell'oggetto - dove a presenta la rappresentazione visiva dei suoi media. È quindi possibile aggiungere questi componenti visivi alla finestra dell'applicazione o all'applet.Player

Per visualizzare Playeril componente visivo di un oggetto, devi:

  1. Ottieni il componente visivo chiamando il getVisualComponent()metodo
  2. Aggiungi il componente visivo alla finestra dell'applicazione o all'applet

A Playerpuò anche includere un pannello di controllo con pulsanti per avviare, interrompere e mettere in pausa il flusso multimediale, nonché controllare il volume, proprio come i pulsanti simili sul lettore CD.

Molti dei Playermetodi di possono essere chiamati solo quando Playerè nello stato realizzato. Per garantire che sia in questo stato, puoi usare il metodo Manager's createRealizedPlayer()per creare il file Player. Questo metodo fornisce un modo conveniente per creare e realizzare un Playerin un unico passaggio. Quando viene chiamato, si blocca finché non Playerviene realizzato.

Inoltre, start()può essere richiamato dopo la Playercreazione di a ma prima che raggiunga lo stato precaricato. start()tenta di passare Playerallo stato di avvio dallo stato in cui si trova attualmente. Ad esempio, è possibile chiamare immediatamente il start()metodo dopo l' Playeristanza di a. Il start()metodo chiamerà quindi implicitamente tutti i metodi necessari per portare Playernello stato di avvio.

Acquisisci dati multimediali

L'acquisizione di supporti è un altro compito importante nella programmazione JMF. È possibile acquisire dati multimediali utilizzando un dispositivo di acquisizione come un microfono o una videocamera. Può quindi essere elaborato e renderizzato o archiviato in un formato multimediale. Per acquisire dati multimediali, è necessario:

  1. Individua il dispositivo di acquisizione che desideri utilizzare interrogando il file CaptureDeviceManager
  2. Ottieni un CaptureDeviceInfooggetto per il dispositivo
  3. Ottenere una MediaLocatordalla CaptureDeviceInfooggetto e usarlo per creare unDataSource
  4. Crea un Playero un Processorusando ilDataSource
  5. Avviare Playero Processorper avviare il processo di acquisizione

Utilizzare CaptureDeviceManagerper accedere ai dispositivi di acquisizione disponibili sul sistema. Questo gestore funge da registro centrale per tutti i dispositivi di acquisizione disponibili per JMF. È possibile ottenere un elenco di dispositivi disponibili chiamando il getDeviceList()metodo. Un dispositivo di acquisizione è rappresentato da un CaptureDeviceInfooggetto. Si utilizza il CaptureDeviceManager's getDevice()metodo per ottenere il CaptureDeviceInfoper un particolare dispositivo di acquisizione.

Per utilizzare il dispositivo di acquisizione per acquisire i dati multimediali, è quindi necessario ottenere il dispositivo MediaLocatordal suo CaptureDeviceInfooggetto. Puoi usarlo MediaLocatorper costruire un Playero Processordirettamente, oppure usare il MediaLocatorper costruire un DataSourceche puoi usare come input per a Playero Processor. Utilizzare il metodo Player's o Processor' s start()per avviare il processo di acquisizione.

Elaborazione multimediale in tempo reale

Con JMF puoi anche inviare o ricevere una trasmissione multimediale in diretta, come trasmissioni radiofoniche e televisive in diretta o teleconferenze in tempo reale su Internet o su una intranet.

Una caratteristica del trasporto multimediale in tempo reale che differisce dall'accesso ai dati statici: il protocollo in tempo reale non garantisce che tutti i pacchetti arriveranno in modo sicuro. Ancora più importante, come si compensa la perdita di dati e non si garantisce un grande ritardo nella ricezione dei dati? Quando si lavora con flussi multimediali in tempo reale, si riproducono i dati multimediali senza attendere il download dei dati del flusso completo. Allo stesso modo, la trasmissione su Internet in tempo reale richiede una rete a larghezza di banda elevata in modo che il destinatario possa riprodurre continuamente i dati multimediali.