L'API JMF : API de base
introduction : L'API de base contient les outils nécessaires à la manipulation de données multimédia. Elle fournit les méthodes
pour gérer des données média(DataSource), les lire (Player) ou encore effectuer des traitements (Processor).
Gestion des données
les lecteurs JMF utilisent en général des "Datasource"(définis par l'API JMF) pour gérer le transfert du contenu d'un media. Il encapsule un ensemble de données sur le transfert à effectuer :
- L'emplacement du fichier que l'on veut transporter
- Le protocole que l'on va utiliser pour délivrer le flux
- Les outils utilisés pour le transfert
Un DataSource est identifié par un objet MediaLocator ou URL permettant de spécifier l'emplacement du media à gérer.
Un MediaLocator est similaire à l'objet URL et peut être construit à partir de celui-ci. La seule différence est qu'il
ne nécessite pas que le handler(gestionnaire) du protocole utilisé soit installé sur la machine pour être utilisé.
ex : ftp://... On pourrait l'utiliser même si le handler ftp n'était pas installé
Il existe alors deux types de DataSources en fonction de l'emetteur et du récepteur :
- Pull Data-Source : Le client initialise le transfert de données et contrôle le flot de données avec le PullDataSource
- Push Data-Source : Le serveur initialise le transfert de données et contrôle le flow de données avec le PushDataSource
Les formats de fichiers multimédias sont gérés par des classes de type Format contenant les attributs spécifiques
du format utilisé.
Les managers
Pour simplifier l'utilisation des différentes fonctions de l'API, JMF fournit des classes Managers permettant d'accéder à tous les services principaux. Cela permet de centraliser les différentes fonctions :
- Manager : Cette classe permet la construction des objets principaux, autrement dit les Players, Processors, DataSources et DataSinks(permettre l'enregistrement d'un flux ou la capture)
- PackageManager : Maintient un registre de packages contenant des classes JMF customisés(Players particuliers ...)
- CaptureDeviceManager : Maintient une liste des périphériques de capture valable dans JMF
- PlugInManager : maintient une liste des plugins JMF de traitement utilisables (Multiplexers, Demultiplexers, Codecs, Effects, Renderers)
Les Players
Un objet Player prend un flux en entrée sous la forme d'un DataSource et le présente(effectue un rendu) à un temps donné. On peut alors le configurer pour obtenir le rendu que l'on désire. Il est en fait le lecteur qui va nous permettre d'interpréter le flux et l'afficher.
Il peut se trouver dans six états différents en respectant l'ordre suivant :
- Unrealized : Le Player vient d'être instancié mais ne connais rien sur le média qu'il doit traiter
- Realizing : A l'appel de la methode "realize" il passe dans cet état. Cela consiste à acquérir les ressources qu'il n'a besoin d'acquérir qu'une fois. Cela comprend le rendu et les différentes informations dont il a besoin sur le media à présenter
- Realized : Le player passe dans cet état à la sortie de la methode "realize". Il connait toutes les ressourcs dont il a besoin, le type du media à présenter et la façon dont il doit le faire.
- Prefetching : Il passe dans cet état à l'appel de "prefetch". Le player précharge le média, prend un accès exclusif sur les ressources dont il a besoin et prépare tout ce dont il a besoin pour lancer la lecture.
- Prefetched : Le player est près a être lancé.
- Started : Il a commencé la lecture ou la commencera à un temps donné.
Le Player envoie des "TransitionEvents" lorsqu'il passe d'un état à un autre.
L'objet Processor
Les données d'un flux média sont soumises à un traitement avant d'être présentées à un utilisateur. On pourra alors effectuer les opérations suivantes avant la présentation du média :
- Si le flux est multiplexé, on peut extraire les pistes individuelles
- Si les pistes sont compréssées, elles sont décodées et décompressées
- On peut convertir le flux dans un autre format
- On peut appliquer des filtres d'effets sur le flux
L'objet Processor est en fait un Player particulier pouvant contrôler les traitement effectués sur le flux. Il peut présenter un média ou proposer un nouveau DataSource en sortie.
Voici un exemple simple sur la méthode "init" d'une applet :
public static void init {
   //adresse de la source correspondant à un flux RTP
   String SourceAddress = "rtp://192.168.0.1:33335/video/1";
   //création de la source
   MediaLocator SourceLocator = new MediaLocator(SourceAddress);
   //Verification que la source existe
   if(SourceLocator == null)
   {
     System.out.println("pas de source");
     System.exit(-1);
   }
   else
   {
     System.out.println("Connecté au flux");
   }
   //l'objet Player qui va présenter le flux
   Player player;
   try
   {
     //Creation du player dans l'etat realized avec la source
     player = Manager.createRealizedPlayer(SourceLocator);
     //Demarrage du Player
     player.start();
     //Creation d'une fenetre de test
     JFrame fenetre = new JFrame("Player");
     fenetre.setSize(180,160);
     //Ajout du Composant visuel du Player dans la fenetre
     fenetre.getContentPane().add(player.getVisualComponent());
     fenetre.setVisible(true);
   }
   catch (Exception e)
   {
     e.printStackTrace();
   }
}
Cet exemple montre uniquement la création d'un Player basique. Il est possible ensuite de lui ajouter de nombreuses fonctionnalités afin d'améliorer les services offerts à l'utilisateur
On peut également choisir d'enregistrer le flux arrivant plutôt que de le présenter en utilisant un objet DataSink :
DataSink sink;
MediaLocator dest = new MediaLocator("file://newfile.wav");
try {
//p est le processor qui a reçu le flux
sink = Manager.createDataSink(p.getDataOutput(), dest);
sink.open();
sink.start();
} catch (Exception) {}