Bonjour tout le monde
Dans le but de réaliser un module VOD avec JMF, j'ai essayé d’implémenter un serveur qui diffuse un fichier vidéo stocké sur le disque dur de celui-ci vers un client.
Le client lui, devrait capter le flux vidéo en provenance de l'adresse du serveur et essaye de le visualiser. Cependant, le client n’arrive pas à visualiser la vidéo.
Voici le code du serveur :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140
| package newserveur;
import javax.media.*;
import javax.media.rtp.*;
import javax.media.format.*;
import javax.media.control.*;
import javax.media.protocol.*;
import java.io.*;
import java.net.*;
public class Main {
public static Processor configure(Processor p)
{
// Attendre tant que le Processor n'est pas configuré.
while(p.getState() < Processor.Configured)
{
//Configuration du Processor
p.configure();
}
return p;
}
public static void setSupportedFormat(Processor p)
{
// On met la description du contenu de sortie à RAW_RTP
// pour limiter les formats supportés
ContentDescriptor cd = new ContentDescriptor(ContentDescriptor.RAW_RTP);
p.setContentDescriptor(cd);
//On obtient les différentes pistes du processor
TrackControl track[] = p.getTrackControls();
for(int i = 0 ; i < track.length ; i++)
{
//on obtient les formats supportés pour cette piste
Format suppFormats[] = track[i].getSupportedFormats();
//Si il y a au moins un format supporté alors on met le premier
if (suppFormats.length > 0)
{
track[i].setFormat(suppFormats[0]);
}
else
{
track[i].setEnabled(false);
}
}
}
public static Processor realize(Processor p)
{
// Attendre tant que le Processor n'est pas réalisé.
while(p.getState() < Processor.Realized)
{
//Réalisation du Processor
p.realize();
}
return p;
}
public static void demarre(Processor p)
{
//Demarrage du Processor
p.start();
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// TODO code application logic here
//Entrée de l'adresse du fichier
String fichierAdresse = "file://d:/test.mov";
//Création du MédiaLocator à partir de ce fichier
MediaLocator fichierLocator = new MediaLocator(fichierAdresse);
//Declaration du Processor
Processor fichierCessor = null;
try
{
//Creation du Processor à partir du Medialocator
fichierCessor = Manager.createProcessor(fichierLocator);
fichierCessor = configure(fichierCessor);
setSupportedFormat(fichierCessor);
fichierCessor = realize(fichierCessor);
demarre(fichierCessor);
System.out.println("Creation du processor a partir du Medialocator réussie");
}
catch(IOException e)
{
System.out.println("Erreur : " + e.getMessage());
}
catch(NoProcessorException e)
{
System.out.println("Erreur : " + e.getMessage());
}
//Creation du DataSource correspondant au Processor
DataSource fichierSource = fichierCessor.getDataOutput();
//Adresse de Destination
String outputAddress = "rtp://192.168.3.2:22224/video/1";
//Creation du MediaLocator pour l'Adresse de destination
MediaLocator outputLocator = new MediaLocator(outputAddress);
try
{
//Creation du DataSink
DataSink outputSink = Manager.createDataSink(fichierSource, outputLocator);
//Ouverture du DataSink
outputSink.open();
//Demarrage du DataSink
outputSink.start();
System.out.println("Started");
}
catch(IOException e)
{
System.out.println("Erreur" + e.getMessage());
}
catch(NoDataSinkException e)
{
System.out.println("Erreur" + e.getMessage());
}
}
} |
D'un autre côté le code du client est :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
| package newclient;
import javax.media.*;
import javax.media.rtp.*;
import javax.media.rtp.event.*;
import javax.media.format.*;
import java.io.*;
import java.net.*;
import javax.swing.*;
public class Main
{
public static void main(String[] args)
{
//Adresse de la Source
String sourceAddress = "rtp://192.168.3.6:22224/video/1";
//Creation du MediaLocator avec l'adresse de la Source
MediaLocator sourceLocator = new MediaLocator(sourceAddress);
// Verification que la source existe dans le cas contraire, arret du programme
if(sourceLocator == null)
{
System.out.println("no Source");
System.exit(-1);
}
else
{
System.out.println("Connected");
}
// Declaration du Player
Player player;
try
{
// Creation du player réalisé à partir du MediaLocator de la source
player = Manager.createRealizedPlayer(sourceLocator);
System.out.println("Création du player à réaliser");
// Demarrage du Player
player.start();
System.out.println("Demarrage du player réussie");
// Creation d'une JFrame
JFrame fenetre = new JFrame("Player");
fenetre.setSize(160,140);
// Ajout du Composant visuel du Player dans la fenetre (pour un flux vidéo)
fenetre.getContentPane().add(player.getVisualComponent());
fenetre.setVisible(true);
}
catch (NoPlayerException e)
{
System.out.println("Erreur " + e.getMessage());
}
catch (IOException e)
{
System.out.println("Erreur " + e.getMessage());
}
catch (CannotRealizeException e)
{
System.out.println("Erreur " + e.getMessage());
}
}
} |
Lors de l'exécution du serveur voici le message qui est affiché :
init:
deps-jar:
compile:
run:
Creation du processor a partir du Medialocator réussie
streams is [Lcom.sun.media.multiplexer.RawBufferMux$RawBufferSourceStream;@b1b4c3 : 2
sink: setOutputLocator rtp://192.168.3.2:22224/video/1
Started
Lors de l'exécution du client j’obtiensLes deux programmes ont l'air de bien fonctionner, cependant il y a un problème chez le client à partir de la ligne du code
player = Manager.createRealizedPlayer(sourceLocator);
à partir de laquelle le client reste bloqué et ne peut pas terminer l’exécution du reste du code pour visualiser la vidéo.
Les deux machines 192.168.3.2 (client) et 192.168.3.6 (serveur) sont bien connectées.
Pouvez vous m'aider à résoudre ce problème ?
Merci d'avance
Partager