Intégration du multimédia à Java avec JMF
[30 mn de lecture - paru le 11/4/2003 - Public : Confirmé]
|
   
|
Auteur
1. Présentation, possibilités
1.1. Les possibilités
JMF permet de faire à peu près tout ce que l’on veut avec
des « objets » multimédia… que cela soit lire des films,
des mp3, acquérir des données avec une webcam ou un micro…
voici une petite liste non exhaustive des utilisations possibles de JMF :
• Lire différents types de fichiers multimédias dans une
application Java ou un applet. JMF supporte de nombreux formats tels que AU,
AVI, MPEG, WAV… Le site de Sun propose une liste détaillée
des formats supportés par l’API (http://java.sun.com/products/java-media/jmf/2.1.1/formats.html).
• Capturer des données audio et vidéo depuis une caméra
ou une webcam puis les enregistrer dans différents formats
• Transmettre des flux audio et vidéo en temps réel sur
le Net
• Lire des médias temps réel depuis le Net (à l’image
de RealPlayer)
• Diffuser à de nombreux clients connectés des vidéos
ou de la musique (exemple d’une radio online)
• …
1.2. Prédispositions matérielles
JMF ne prend pas en compte toutes les webcams. Sous Windows, votre webcam doit
disposer des drivers VFW (Video For Windows) et sous Linux
elle doit avoir des drivers Video4Linux. Une liste non exhaustive
des webcams supportées est disponible sur le site de Sun (http://java.sun.com/products/java-media/jmf/2.1.1/formats.html#Capturers).
A titre d’information, j’ai fait tous mes tests sous Windows XP
avec une webcam QuickMessenger de chez Logitech (l’une des moins chères
du marché) et elle a été reconnue sans problème
lors de l’installation de JMF.
1.3. Comparaison avec un ensemble vidéo domestique

Pour expliquer le fonctionnement de JMF, on va le comparer à celui d’un
ensemble vidéo domestique (télé, caméra,
magnétoscope, enceintes). JMF recourt à 4 éléments
principaux pour manipuler le multimédia, à savoir :
• Un ou plusieurs périphériques de capture,
que nous pouvons assimiler à une caméra dans le cadre de notre
comparaison.
• Une ou plusieurs sources de données, comparable
à une cassette vidéo.
• Un lecteur (ou processeur, nous y
reviendrons), que l’on peut comparer à un magnétoscope.
• Et une destination, qui peut être un fichier,
un écran etc… Dans notre exemple cela correspondra à la
télévision et aux haut-parleurs.
Vous pouvez facilement imaginer comment fonctionne l’ensemble vidéo
décrit ci-dessus, nous allons voir comment fonctionne JMF.
Pour pouvoir présenter un média sur un périphérique
de sortie tel qu’un écran ou des haut-parleurs, JMF doit créer
un lecteur qui récupérera un ou plusieurs flux de données
en entrée, effectuera certains traitements pour les rendre présentables
sur un périphérique de destination. On peut créer un flux
de données à partir d’un simple fichier multimédia,
à partir d’une webcam ou de n’importe quel autre périphérique
de capture ou bien même en récupérant le flux de sortie
d’un processeur. Un processeur fonctionne à peu près de
la même manière qu’un lecteur et permet de créer un
nouveau flux de données à partir des flux de données d’entrées
(utile pour ré-encoder un flux vidéo par exemple).

1.4. Architecture
Nous allons maintenant décrire un peu plus en détail les éléments
essentiels de JMF. Nous en avons évoqué quelques uns précédemment
lors de la comparaison à un ensemble vidéo sans toute fois en
donner une description suffisante.
Voici les termes avec lesquels il faudra vous familiariser pour utiliser l’API
:
• Source de données (DataSource)
• Périphérique de capture (CaptureDevice)
• Lecteur (Player)
• Processeur (Processor)
• Datasink
• Format
• Manager
J’ai laissé les termes en anglais lorsqu’il n’était
pas évident de trouver une traduction convaincante car lors du développement,
ce sont des termes anglais qu’il faudra se rappeler. Nous allons maintenant
décrire chaque élément de la liste.
Source de données (DataSource)
Il s’agit d’un flux de données qui encapsule un média.
Une source de données peut contenir des données audio, vidéo
ou même un mélange des 2. Une source de données peut être
instanciée à partir d’un fichier local ou en réseau,
d’un micro, d’un flux audio arrivant du Net etc. Elle contient la
localisation du média (ex : adresse du fichier source…), le protocole
et le logiciel utilisé pour délivrer le média. Une source
de données peut être envoyée dans un lecteur pour pouvoir
être présentée.
Périphérique de capture (CaptureDevice)
Il s’agit d’un dispositif matériel capable d’acquérir
des données. Par exemple : webcam, micro, caméra…
Lecteur (Player)
Un lecteur est un objet qui prend en entrée un flux de données
(audio et/ou vidéo) et effectue un traitement pour pouvoir présenter
ces données sur un écran ou des haut-parleurs.
Mais avant de pouvoir présenter un média, un lecteur doit passer
par différentes étapes pour se préparer
à la lecture. On peut comparer ça au temps que prend un lecteur
cd quand on insère un nouveau cd pour analyser la table des matières,
la durée etc. Voyons les différents états d’un lecteur
:
• Unrealized (non créé) : Dans cet état,
l’objet Player a été instancié mais il ne connaît
encore rien du média qu’il aura à lire.
• Realizing (en cours de création) : Le lecteur passe
en état Realizing quand on appelle la méthode realize().
Le lecteur détermine alors les ressources dont il aura besoin.
• Realized (créé) : A ce stade, le lecteur sait
qu’elles sont les ressources nécessaires et détient les
informations concernant le média qu’il aura à lire.
• Prefetching (en préparation) : Le lecteur passe en état
Prefetching quand on appelle la méthode prefetch().
Le lecteur précharge alors le média, s’assure d’avoir
l’exclusivité sur les ressources matérielles (carte son…).
• Prefetched (prêt) : Le lecteur est prêt à
lire le média.
• Started (démarré) : Passage en Started
lors de l’appel à la méthode start(). La lecture
démarre.
Processeur (Processor)
Comme dit plus haut, un processeur est une sorte de lecteur. D’ailleurs
dans l’API, une interface Processor « extends » Player. Donc
un processeur fonctionne à peu près de la même façon,
la différence est que l’on contrôle le traitement effectué
dans le processeur. Le flux sortant d’un processeur peut être récupéré
par un autre processeur, ou par un lecteur.
Un processeur a aussi les 6 états du lecteur plus 2 : Configuring
et Configured. Qui sont à placer entre les états Unrealized
et Realizing.
• Configuring (en cours de configuration) : Le processeur entre
en état Configuring quand la méthode configure()
est appelée. Un processeur a atteint cet état quand il a accès
à la source de données, qu’il l’a démultiplexée
et qu’il a accès aux informations concernant le format.
• Configured (configuré) : Le processeur passe en état
Configured quand il s’est connecté à la source
de données et qu’il a fini de déterminer le format.
Datasink
Un Datasink récupère le média d’une source de données
et le redirige vers une destination. Un Datasink permet par exemple
d’enregistrer un média dans un fichier.
Format
Un objet format contient le format exact d’un media. Il ne contient pas
de paramètres spécifiques d’encodage ou d’information
sur la durée, il donne seulement le nom du format d’encodage et
le type de données nécessaires.
Manager
Un manager est un objet un peu spécial qui permet de faire la jonction
entre les différentes éléments vus ci-dessus. Il permet
par exemple de créer un lecteur à partir d’une source de
données. JMF fournit 4 managers :
• Manager : Pour créer des lecteurs, processeurs, sources
de données et DataSinks. Par exemple il peut créer un
lecteur à partir d’une source de données.
• PackageManager : Contient la liste des packages disponibles
dans les classes de JMF, à savoir des lecteurs, processeurs, sources
de données et DataSinks spécifiques.
• CaptureDeviceManager : Permet de gérer la liste des
périphériques de capture disponibles.
• PlugInManager : Gère la liste des plug-ins pour JMF.
|