You are on page 1of 11

Traitement vido en Java

Par Mohamed Slim


Date de publication : 25 juin 2010
Dernire mise jour : 9 juillet 2010
Cet article est destin aux dveloppeurs Java qui souhaitent crire des applications ou des
applets permettant de traiter du son ou de la vido en Java en utilisant l'API Java Media
Framework(JMF) sous un systme Win32.
Traitement vido en Java par Mohamed Slim
- 2 -
http://slim-boukettaya.developpez.com/tutoriels/JMF/
I - Introduction..............................................................................................................................................................3
II - Java Media Framework..........................................................................................................................................3
III - Les formats supports par l'API........................................................................................................................... 3
IV - Fonctionnalit de l'API.......................................................................................................................................... 3
V - Architecture de l'API.............................................................................................................................................. 4
VI - tude de cas : affichage de la vido....................................................................................................................7
VI-A - Installation.................................................................................................................................................... 7
VI-B - Implmentation.............................................................................................................................................8
VII - Liens utiles.........................................................................................................................................................10
VIII - Conclusion........................................................................................................................................................ 11
IX - Remerciements................................................................................................................................................... 11
Traitement vido en Java par Mohamed Slim
- 3 -
http://slim-boukettaya.developpez.com/tutoriels/JMF/
I - Introduction
Certainement, l'utilisation de Java est tendue que ce soit dans des applications destines pour le Web ou pour des
applications bureautiques.
Grce la richesse de ses API standards et tierces, tout type d'application ou presque, peut tre implment en
Java. Prenons par exemple le domaine du multimdia ou l'information est prsente sous diffrents formats (vido,
audio, audiovisuelle). Comme exemple d'application, on peut penser crire un lecteur vido personnel permettant
de lire des donnes enregistres dans des fichiers MP3, AVI, etc.
Ce type d'application peut paraitre un peu dlicat pour un dbutant. Cependant, grce au niveau d'abstraction
qu'offrent les API Java, cela deviendra certes beaucoup plus ais.
II - Java Media Framework
Java Media Framework(JMF) est une API extension la JDK, fournie par Sun Microsystems et IBM. Elle permet
d'incorporer des donnes de type audio ou vido dans des applications Java et des applets.
On peut citer d'autres binding comme FMJ Project (Freedom for Media in Java) qui prsente une alternative
JMF. Comme FMJ est compatible avec JMF, on peut l'utiliser avec du code JMF existant.
Depuis la version 1.0 de JMF, on peut lire divers formats vido dans des applications Java. D'autres fonctionnalits
sont ajoutes depuis la version 2.0 comme la capture camra, la sauvegarde, la transmission, le transcodage, etc.
Quand cet article a t rdig, JMF tait dans sa version 2.1.1, avec une mise jour qui date de Mars 2001. Elle
a intgr plusieurs amliorations au niveau RTP / RTSP et de nombreux composants ont t ajouts et plusieurs
bogues ont t corrigs. JMF est considre comme l'un des composants les plus importants de la famille Java
Media, qui comprend galement Java3D, Java2D, Java Sound et Java Advanced Image(JAI) qui permettent aux
dveloppeurs d'ajouter facilement et rapidement des fonctionnalits multimdias leurs applications, telle que le
streaming vido, le graphisme 3D et le traitement des images.
En fait, JMF utilise Java Sound pour le rendu sonore.
III - Les formats supports par l'API
JMF prend en charge diffrents types de mdias, y compris :
les protocoles : FILE, HTTP, FTP, RTP ;
les formats audio : AIFF, AU, AVI, GSM, MIDI, MP2, MP3, QT, RMF, WAV ;
les formats vido : AVI, MPEG-1, QT, H.261, H.263 ;
Le format MP3 est pris en charge uniquement sur la plate-forme Windows, pour cela il faut installer le Plugin MP3.
Bien que JMF pourrait soutenir un certains type de mdias, elle peut ne pas supporter la compression spcifique
(CODEC) utilise pour les donnes l'intrieur du fichier ressource. Par exemple, un fichier QuickTime avec vido
Cinepak peut tre lu, mais un autre QuickTime avec une vido Sorensen ne peut pas tre lu. Cela est d au fait que
JMF 2.1.1 ne prend pas en charge le dcodage des vido base de Sorensen.
Dans d'autre cas, on voit la vido s'afficher sans entendre le son. Cela est d au fait que JMF ne prend pas en charge
le format de compression de la piste audio. D'ailleurs, le format .AVI n'est pas totalement support par JMF et on
risque de rencontrer des soucis avec des .AVI rcents.
Pour plus de dtails sur les diffrents formats traits par l'API, vous pouvez consulter cette page. Ne vous inquitez
pas car l'un des avantages importants de JMF est qu'elle admet une architecture base de plugins qui permet
d'ajouter de nouveaux codecs que vous pouvez crer vous mme.
IV - Fonctionnalit de l'API
Outre la possibilit d'incorporer de l'audio et de la vido dans vos applications, JMF permet l'envoi et la rception de
mdias partir du rseau grce JMF RTP.
L'API permet en outre :
Traitement vido en Java par Mohamed Slim
- 4 -
http://slim-boukettaya.developpez.com/tutoriels/JMF/
la capture audio et vido avec un microphone et une camra, puis l'enregistrement de ces donnes dans un
format donn ;
Le traitement des fichiers vido (multiplexage, segmentation, compression) ;
la transmission et la rception de l'audio et de la vido en temps rel sur Internet (streaming vido) ou sur le
rseau comme dj mentionn ;
le transcodage des donnes, c'est--dire le passage d'un format un autre avec de nouveaux codecs tout en
admettant une architecture de plugin qui permet d'intgrer facilement de nouveaux codecs.
V - Architecture de l'API
Comme le montre la figure ci-dessous, des appareils tels que le lecteur de cassettes et le magntoscope fournissent
un modle familier pour l'enregistrement, le traitement et la prsentation des mdias base de temps.
En effet, lorsque vous regardez un film l'aide d'un magntoscope, vous devez fournir le flux mdia au magntoscope
en insrant une cassette vido. Le magntoscope lit et interprte les donnes sur la bande et envoie les signaux
appropris votre tlviseur et au haut-parleurs pour la diffusion vido.
La chaine de traitement en JMF peut tre assimile ce processus de diffusion en admettant quatre noeuds
principaux pour le traitement :
Capture Device : est le priphrique de capture ;
Data Source : c'est la source de donnes qui modlise les sources de donnes audio et vido ;
Processor (player) : qui assemble les sources de donnes pour construire un format vido pouvant tre
affich l'utilisateur ;
OutPutDevice : est la sortie du player rcupre par le DataSink qui peut tre un fichier, un cran, etc. ;
Datasink : une rfrence de l'interface DataSink rcupre le mdia du player et le redirige vers une
destination. Un DataSink permet par exemple d'enregistrer un mdia dans un fichier ou de l'afficher
directement sur l'cran.
Traitement vido en Java par Mohamed Slim
- 5 -
http://slim-boukettaya.developpez.com/tutoriels/JMF/
Regardons ces notions avec plus de dtails.
Priphrique de capture (Capture Device)
Comme son nom l'indique, ce priphrique reprsente le matriel utilis pour saisir les donnes multimdia, comme
un microphone ou un camra vido.
La source de donnes ( DataSource)
Peut tre assimile un support de stockage comme un CD contenant de la musique ou un magntoscope comme
schmatis dans la figure. Ct JMF, on doit crer un objet de la classe DataSource, pour reprsenter les diffrents
mdias. Cet objet peut tre un fichier ou un flux entrant du rseau et peut donner des informations sur l'emplacement
des mdias, les protocoles et les techniques utilises pour les livrer.
Par la suite, cet objet sera trait par le player et de cette faon, ne peut pas tre rutilis pour fournir d'autres mdias .
Plusieurs sources de donnes peuvent tre combines en un seul, par exemple lors de la capture d'une scne, on
peut avoir une source audio et une autre pour l'image. Dans ce cas, on peut penser la combinaison de ces deux
sources pour un meilleur contrle.
Le player :
C'est un objet dont le rle est la lecture des donnes audio ou vido partir de la source de donnes et de leur
renvoi, aprs traitement et un moment prcis la carte son ou la carte graphique pour affichage. C'est similaire
un lecteur CD qui lit un CD audio et renvoie le son au haut-parleur.
Le player est l'acteur capital de l'API JMF. Il contrle le chargement, l'acquisition des ressources et l'excution
(dmarrage, arrt, vitesse d'excution...) des donnes multimdia. Avant d'mettre du son la carte son ou des
informations vido la carte graphique, le player doit passer par six tats, quatre d'entre eux sont fondamentaux et
les autres sont considrs comme intermdiaires. Bref, un tat intermdiaire se situe entre deux tats fondamentaux.
Vu que le player effectue un traitement ou attend la disponibilit d'une ressource, on peut en fait considrer les tats
intermdiaires comme des tats d'attente pour passer un tat fondamental.
On peut schmatiser le passage du player par ces tats selon le schma suivant :
Comme montre le schma, certaines transitions peuvent tre invoques par des appels de mthodes.
Voyons donc de plus prs ces diffrents tats.
Unrealized
Le player est instanci comme un nouveau n qui ne connait rien de son environnement et des ressources qu'il doit
raliser. On peut obtenir cet objet partir du gestionnaire de document multimdia (la classe Manager).
MonPlayer player = Manager.createPlayer(URL du document);
Realizing
C'est un tat intermdiaire dans lequel le player dtermine ses ressources qu'il pourrait partager avec d'autre player.
Ce sont la plupart du temps des ressources rseau. Du fait qu'elles peuvent tre partages entre plusieurs players,
on peut les appeler des ressources non exclusives.
Le passage cet tat est fait suite un appel la mthode realize() :
Traitement vido en Java par Mohamed Slim
- 6 -
http://slim-boukettaya.developpez.com/tutoriels/JMF/
monPlayer .realize() ;
Realized
Le player connait cet tat le type de document multimdia qu'il doit traiter et sait quelles ressources il doit acqurir.
De ce fait, il peut prparer le composant visuel pour l'affichage de la vido ainsi que le panneau des boutons de
commandes et de lecture.
Prefetching
tat intermdiaire o le player se prpare prsenter cette fois-ci ses ressources exclusives, c'est--dire celles qu'il
doit tre le seul utiliser.
Le passage cet tat se fait suite l'appel de la mthode prefetch() :
monPlayer.prefetch();
Prefetched
cette tape, le palyer aura reu toutes ses ressources exclusives pour traiter convenablement le document
multimdia. Il est prt ainsi le prsenter correctement.
Started
L'appel la mthode start() mne le player l'tat started entrainant ainsi l'affichage de la vido l'cran.
monPlayer.start();
Un appel la mthode stop() permet de retourner l'tat Prefetched.
monPlayer.stop();
Quand les traitements prvus dans l'tat intermdiaire seront achevs, le passage l'tat fondamental sera
automatique. Ce passage est accompagn par la cration d'un objet d'une classe hritant de TransitionEvent par le
player. La figure ci-dessous prsente les diffrentes sous classes de TransitionEvent que le player peut instancier
lors de son passage de l'tat Unrealized l'tat Started.
Ce mcanisme est semblable la gestion d'vnements en SWING. Chaque objet cr est pass comme argument
de la mthode controllerUpdate() :
public void controllerUpdate(ControllerEvent event)
{
if (event instanceof PrefetchCompleteEvent)
{
}
else if (event instanceof RealizeCompleteEvent)
{
}
else if (event instanceof StartEvent)
{
}
else if (event instanceof stopEvent)
Traitement vido en Java par Mohamed Slim
- 7 -
http://slim-boukettaya.developpez.com/tutoriels/JMF/
{
}
}
Cependant, on peut faire des appels de mthodes pour faire le passage un tat donn d'une faon asynchrone. Par
exemple, dans le cas o on fait une invocation de la mthode prefetch() quand le player est Unrealized. Suite cet
appel, la mthode prefetch() essayera d'emmener le player l'tat Realizing puis l'tat Realized pour atteindre
la fin l'tat Prefetching.
De mme, un appel la mthode start() peut se faire un tat diffrent de Prefetched, ce qui entraine un parcours
de l'ensemble des tats intermdiaires dans l'ordre.
Aprs avoir eu une ide sur l'architecture de JMF et de ces diffrents composants, essayons maintenant d'exploiter
ces connaissances dans un exemple qui permet d'afficher une vido dans une fentre.
VI - tude de cas : affichage de la vido
VI-A - Installation
Pour dvelopper en Java, il faut avoir install la JDK. Mieux vaut travailler avec une version rcente. Vous pouvez
consulter la dernire mise jour sur la page de tlchargement du site de SUN.
Il faut aussi utiliser un EDI puissant comme Eclipse ou netBeans. Une liste non exhaustive des diffrents EDI de
dveloppement en Java est donne sur la page outils avec les liens de tlchargement.
Comme indiqu au dbut de l'article, l'API JMF est une extension la JDK, donc une installation pralable de cette
API est ncessaire afin de pouvoir excuter votre code.
Si vous souhaitez dployer vos applications, il faut aussi avoir recours la JMF et l'installer sur vos postes clients.
Sur le site de SUN, on trouve diffrentes versions de JMF 2.1.1 pour diffrents systmes d'exploitation. Dans le
cadre de cet article on vise les systmes Win32.
Dans la page d'installation, vous devrez slectionner votre systme d'exploitation (on devra choisir Windows), par la
suite, il faudra installer le fichier excutable qui portera le numro de la version de JMF :
L'installation de l'API se lance aprs un double-clique sur l'excutable.
Si vous esprez crire des programmes permettant de capturer des flux de donnes reus partir de votre camra,
l'installation devrait alors suivre cet ordre : le JDK au dbut, le pilote DE LA camra par la suite et JMF la fin. Cet
ordre n'est pas dcisif mais il est conseill pour avoir un bon fonctionnement.
Traitement vido en Java par Mohamed Slim
- 8 -
http://slim-boukettaya.developpez.com/tutoriels/JMF/
Lors de l'installation, vous remarquez trois raccourcis sur votre bureau:
Pour terminer l'installation, il faut redmarrer votre systme.
Un dossier portant le nom de JMF 2.1.1e sera cr dans le rpertoire C:\Program Files. Ce rpertoire sera compos
de trois sous dossiers :
Bin
Contient les applications suivantes :
JMFRegistry
Une application, qui peut tre utilise pour la configuration de JMF. Elle permet de lister les diffrents plug-ins et la
liste des priphriques de capture installs sur la machine. On peut avec cette application changer certain paramtres
dans le fichier binaire jmf.properties.
JMStudio
Une application qui peut tre utilise pour exploiter les fonctionnalits de l'API telles que la lecture et l'enregistrement
des mdias, la capture des flux camra, le transcodage, etc. On peut aussi utiliser cette application pour essayer
l'envoi et la rception des donnes multimdia sur le rseau via le RTP.
Doc
Contient le fichier de documentation.
Lib :
Contient les classes de l'API JMF compiles dans des archives .jar.
Lors de l'installation de JMF, un plugin sera install pour permettre l'affichage des applets utilisant JMF dans les
navigateurs.
L'installation de JMF est accompagne par l'ajout de bibliothques natives. Ces bibliothques seront ajoutes la
variable d'environnement PATH.
Sous Windows, la configuration des variables d'environnement CLASSPATH et PATH sera automatique :
set CLASSPATH =%% JMFHOME \ lib jmf.jar \;%% JMFHOME \ lib sound.jar \;.;% CLASSPATH%
SET PATH =% WINDIR% \ System32;% PATH% (sur Windows NT)
Si vous utilisez un IDE pour vos dveloppements, il faut donc spcifier les archives jmf.jar, sound.jar dans la
CLASSPATH de votre projet.
Enfin, pour tester si tout s'est bien pass, vous pouvez excuter l'applet de diagnostic fourni par SUN.
Le rsultat que vous obtiendrez devra tre semblable ce qui est donn par cette figure :
Maintenant que vos tests sont positifs, commenons alors notre application.
VI-B - Implmentation
L'application est compose par une seule classe de nom MonLecteur.
Cette classe va implmenter l'interface ControllerListener pour grer le changement d'tat du Player. Cependant,
comme pour la gestion des vnements en SWING, on peut crer une classe part qui jouera le rle de l'auditeur
du player.
Cette classe comporte un menu de nom " fichier " sur lequel on doit appuyer pour lancer la lecture du fichier vido.
Traitement vido en Java par Mohamed Slim
- 9 -
http://slim-boukettaya.developpez.com/tutoriels/JMF/
setJMenuBar(menuBar);

menuBar.add(ouvrirMenu);
ouvrirMenu.setText("Ouvrir");
ouvrirMenu.add(newItemFichier);
newItemFichier.addActionListener((ActionListener) this);
newItemFichier.setText("fichier");
Cette classe doit donc implmenter l'interface ActionListener et redfinir la mthode actionPerformed(ActionEvent
e) qui va tre invoque suite l'appui sur le menu " fichier ".
De ce fait, l'instruction de cration du player doit se faire dans cette mthode.
La classe java.media.Manager utilise l'URL de notre fichier vido pour construire le player.
Ce modle de cration est trs similaire l'tablissement des connexions au bases de donnes avec JDBC.
URL url = fileChooserSaveImage.getSelectedFile().toURL();
L'objet player admet des mthodes pour connaitre l'tat actuel du player et acqurir les ressources ncessaires.
D'autres mthodes permettent de dmarrer, d'arrter ou de contrler la lecture effective d'un fichier mdia en local
ou sur le rseau.
monPlayer = Manager.createPlayer(url);
chaque changement d'tat du player, la mthode controllerUpdate() est appele automatiquement.
monPlayer.addControllerListener((ControllerListener) this);
Avant d'tre dmarr, le player doit avoir l'tat Realized et doit passer ensuite l'tat Prefetched.
monPlayer.realize();
Suite cet appel, il y aura cration d'un objet de type RealizeCompleteEvent qui sera le paramtre de la mthode
controllerUpdate().
La mthode controllerUpdate(ControllerEvent arg0) appartient l'interface ControllerListener. Elle doit tre
redfinie par la classe Monlecteur. Cette mthode doit contenir les instructions pour la gestion de changement d'tat
du Player.
public void controllerUpdate(ControllerEvent arg0)
{
if (arg0 instanceof RealizeCompleteEvent)
//tat realizing
{
monPlayer.prefetch();
}
else if (arg0 instanceof PrefetchCompleteEvent)
//tat perfetching
{
L'objet monPlayer prend en entre un flux de donnes (audio et/ou vido) et effectue un traitement afin de prsenter
ces donnes l'cran.
Quand ce dernier atteint l'tat Prefetched, on peut rcuprer deux composants graphiques permettant l'affichage et
le contrle de la vido.
Traitement vido en Java par Mohamed Slim
- 10 -
http://slim-boukettaya.developpez.com/tutoriels/JMF/
La mthode getVisualComponent() renvoie un composant AWT destin la visualisation de la vido.
if ((visual = (Component) monPlayer.getVisualComponent()) != null)
getContentPane().add("Center", visual);
La mthode getControlPanelComponent() renvoie son tour un panneau de commande, qui permet d'arrter ou
de reprendre la lecture de la vido.
On peut aussi couper la sortie sonore et avoir des informations sur la vido comme son emplacement, sa dure, etc.
Si vous prfrez dfinir des composants GUI personnels, vous pouvez implmenter l'interface Composants et appeler
les mthodes de la classe Player pour grer les actions utilisateur comme la lecture, l'arrt, etc.
Si notre ressource multimdia est un fichier audio par exemple, seul le panneau de contrle est affich c'est pourquoi
on a fait un test avant d'ajouter le composant visuel.
if ((visual = (Component) monPlayer.getVisualComponent()) != null)

getContentPane().add("Center", visual);
Si les composants GUI sont bien disponibles, il faut valider leur ajout avec validate().
validate();
Enfin, on lancera l'excution du player avec start(). L'affichage de la vido tant en cours.
monPlayer.start();
Lorsque la vido est termine et que vous voulez reprendre la lecture, vous devez utiliser la mthode setMediaTime()
pour rendre la tte de lecture l'instant 0.
La fin de la lecture est repre par un objet de type EndOfMediaEvent.
if (arg0 instanceof EndOfMediaEvent)
{
monPlayer.setMediaTime(new Time(0));
monPlayer.start();
}
A la fin, il ne faut pas oublier de librer les ressources dtenues par le player lors de la fermeture de la fentre. Le
player ne sera plus utilis et peut tre donc ferm.
public void windowClosing(WindowEvent arg0)
{
if(monPlayer !=null)
monPlayer.close();
}
Voila enfin ce que vous devez faire pour avoir une vido qui s'affiche dans votre fentre.
Vous pouvez tlcharger le code de l'application ici.
VII - Liens utiles

Ensemble de video tester


Traitement vido en Java par Mohamed Slim
- 11 -
http://slim-boukettaya.developpez.com/tutoriels/JMF/

Documentations de l'API

Formats supports

Documentations

Guide officiel

Sources utiles
VIII - Conclusion
Dans cet article, on a donn une vue gnrale de L'API JMF utilis pour permettre le traitement des mdias bass
sur le temps en Java comme le son et la vido. On a donc prsent les diffrentes fonctionnalits de cette API et son
architecture. En a entam notre prsentation par une tude de cas dans la quelle on a fourni le code d'une application
qui permet d'afficher la vido dans une fentre.
Certainement, l'atout de cet API dpasse la simple lecture d'un mdia en local, vers la capture et l'enregistrement
des flux multimdia et de la vido streaming.
Dans des mises jour futures nous verrons d'autres exemples o nous essayerons d'exposer d'autres fonctions de
l'API.
IX - Remerciements
Je tiens remercier la rubrique Java de Developpez.com, et son responsable Ricky81.
Je remercie aussi Monsieur Jacques pour sa relecture orthographique et ses corrections.

You might also like