| dealer Profil : Big Penguin | Yop tout le monde,  Bon alors, je dois réaliser une application java consistant à enregistrer des vidéos depuis un périphérique relié à mon ordinateur. Le périphérique en question, est un robot capable de se déplacer doté d'une caméra wireless. Voilà la bête en question sans la caméra : . Pour ce faire j'utilise la librairie JMF. En fait le réel problème est que je dois pouvoir en même temps afficher ce que j'enregistre. Pour l'instant, j'arrive à faire sois l'un sois l'autre mais pas les deux. J'ai essayé d'utiliser une DataSource clonné à ce moment tout à l'air de fonctionner mais les vidéos ont une taille de 0 ko. Voilà la classe qui me permet d'enregistrer les vidéos (avec en utilisant la DataSource clonée): Donc avec ce code là, j'ai des vidéos de 0 ko. Merci à ceux et celles qui se pencheront sur mon problème. Message édité par dealer le 23-12-2008 à 19:59:09
| |
Sino Profil : New Penguin | Salut dealer,
J'ai le meme probleme que toi et j'essaye depuis une semaine de trouver une solition.
SI t'as pu le résoudre SVP veuillez le partager.
Merci d'avance | |
dealer Profil : Big Penguin | Sino a écrit :
Salut dealer,
J'ai le meme probleme que toi et j'essaye depuis une semaine de trouver une solition.
SI t'as pu le résoudre SVP veuillez le partager.
Merci d'avance
|
Oui, j'avais finit par trouver la solution. Désolé pour le temps de réponse, ça fait un moment que je suis pas repassé sur CXP.
En fait il faut créer une DataSourceClonable pour pouvoir la cloné 2 fois. Une fois pour ton Player et une autre fois pour l'enregistrement.
Voilà le code que ça donne au final.
Code :
- /*
- * To change this template, choose Tools | Templates
- * and open the template in the editor.
- */
- package botcam.wrk;
- import botcam.cste.Constante;
- import java.io.IOException;
- import java.util.logging.Level;
- import java.util.logging.Logger;
- import javax.media.*;
- import javax.media.format.VideoFormat;
- import javax.media.protocol.*;
- /**
- *
- * @author croisiery
- */
- public class WrkCapture {
- /**
- * Contient la caméra du robot
- */
- private Player player;
- /**
- * Locator du périphériques de capture
- */
- private MediaLocator mediaLoc;
- /**
- * Contient toutes les infos sur le périphérique de capture
- */
- private CaptureDeviceInfo captureDevice;
- /**
- * DataSource de base
- */
- private DataSource dSource;
- /**
- * DataSource originale qui sera clonée
- */
- private DataSource dSourceOriginal;
- /**
- * Flux de donées servant à l'enregistremende de la vidéo
- */
- private DataSink dSink;
- /**
- * Processor utilisé par le player
- */
- private Processor proc;
- /**
- * Processor utilisé pour l'enregistrement des vidéos
- */
- private Processor proc1;
- /**
- * Clone de la DataSource originale. Cette DataSource est utilisée par
- * le player.
- */
- private DataSource dSourceClonable;
- /**
- * Clone de dSourceClonable. Cette DataSource est utilisée pour enregitré des
- * vidéos
- */
- private DataSource dSourceClone;
- /**
- * Méthode de démarrag de la caméra du robot.
- *
- * @return player : le player contenant la caméra du robot
- */
- public Player startCam() {
- //On réupère le périphériqque de capture
- captureDevice = CaptureDeviceManager.getDevice("vfw:Microsoft WDM Image " +
- "Capture (Win32):0" );
- //On initialise le Locator par rapport au périphérique de capture
- mediaLoc = captureDevice.getLocator();
- try {
- //Initialisation de la DataSource de base
- dSource = Manager.createDataSource(mediaLoc);
- //On Connecte la DataSource
- dSource.connect();
- //Initialisation du processor utilisé par le player
- proc = Manager.createProcessor(dSource);
- //Réalisation du processor
- proc.realize();
- //On attend que le processor soit réalisé avant de continuer
- while (proc.getState() != proc.Realized) {
- try {
- Thread.sleep(10);
- } catch (InterruptedException ex) {
- Logger.getLogger(WrkCapture.class.getName()).log(Level.SEVERE,
- null, ex);
- }
- }
- //Initialistion de la DatSource originale
- dSourceOriginal = proc.getDataOutput();
- //On démarre le processor
- proc.start();
- //On attend que le processor soit bien démarrer
- while (proc.getState() != proc.Started) {
- try {
- Thread.sleep(10);
- } catch (InterruptedException ex) {
- Logger.getLogger(WrkCapture.class.getName()).log(Level.SEVERE,
- null, ex);
- }
- }
- //On clone la DataSource Origniale
- dSourceClonable = Manager.createCloneableDataSource(dSourceOriginal);
- //On crée le player en utilisant la DataSource clonée
- player = Manager.createRealizedPlayer(dSourceClonable);
- //On démarre le player
- player.start();
- //On attend que le player soit bien démarré
- while (player.getState() != player.Started) {
- try {
- Thread.sleep(10);
- } catch (InterruptedException ex) {
- Logger.getLogger(WrkCapture.class.getName()).log(Level.SEVERE,
- null, ex);
- }
- }
- } catch (CannotRealizeException ex) {
- System.out.println("Erreur CannotRealizeException : " + ex.getMessage());
- } catch (NoDataSourceException ex) {
- System.out.println("Erreur NoDataSourceException : " + ex.getMessage());
- } catch (IOException ex) {
- System.out.println("Erreur IOException : " + ex.getMessage());
- } catch (NoPlayerException ex) {
- System.out.println("Erreur NoPlayerException : " + ex.getMessage());
- }
- return player;
- }
- /**
- * Méthode servant à l'enregitrement de la vidéo
- *
- * @param nomFichier : nom sous lequel la vidéo sera enregitrée
- * @return true : si l'enregistrement a bien démarré
- */
- public boolean commencerEnregsitrement(String nomFichier) {
- boolean ok = false;
- try {
- //On définit un format de sortie (ici QuickTime)
- String outputFormat = FileTypeDescriptor.QUICKTIME;
- //On crée un file descriptor sur la base du format de sortie
- FileTypeDescriptor ftd = new FileTypeDescriptor(outputFormat);
- Format[] formats = new Format[]{new VideoFormat(null)};
- //On crée un modèle de processor en utilisant un noveau clone de la
- //DataSource clonée
- ProcessorModel pm = new ProcessorModel(((SourceCloneable)
- dSourceClonable).createClone(), formats, ftd);
- try {
- //On crée le processor destiné à l'enregistrement de la vidéo
- proc1 = Manager.createRealizedProcessor(pm);
- } catch (NoProcessorException ex) {
- Logger.getLogger(WrkCapture.class.getName()).log(Level.SEVERE, null, ex);
- } catch (CannotRealizeException ex) {
- Logger.getLogger(WrkCapture.class.getName()).log(Level.SEVERE, null, ex);
- }
- //Création d'un nouveau médialocator qui définit où on enregistre la
- //vidéo et quel est son extension (l'extension doit correspondre au format)
- MediaLocator ml = new MediaLocator("file:" + Constante.LOCATION_VIDEO +
- nomFichier + ".mov" );
- //Création d'une nouvelle dataSource
- DataSource ds = proc1.getDataOutput();
- //Création d'une DataSink en utilisant la DataSource créée précèdemment
- //et le médialocator crée en début de méthode
- dSink = Manager.createDataSink(ds, ml);
- //On ouvre la dataSink
- dSink.open();
- //On démarre la dataSink
- dSink.start();
- //On démarre le processor
- proc1.start();
- ok = true;
- } catch (NoDataSinkException ex) {
- System.out.println("Erreur NoDataSinkException : " + ex.getMessage());
- } catch (IOException ex) {
- System.out.println("Erreur IOException : " + ex.getMessage());
- }
- return ok;
- }
- /**
- * Méthode qui sert à terminer l'enregistrement d'une vidéo
- *
- *@return true : si l'enregistrement a bient été terminé
- */
- public boolean terminerEnregsitrement() {
- boolean ok = false;
- //on teste si le processor et datasink ne sont pas null
- if (proc1 != null && dSink != null) {
- //on arrête le processor
- proc1.stop();
- //on ferme le processor
- proc1.close();
- //on ferme la DataSink
- dSink.close();
- ok = true;
- }
- return ok;
- }
- /**
- * Méthode servant à mettre en pause un registrement en cours
- *
- * @return true : si l'enregistrement a bien été mis en pause
- */
- public boolean mettreEnPause() {
- boolean ok = false;
- try {
- proc1.wait();
- dSink.wait();
- ok = true;
- } catch (InterruptedException ex) {
- Logger.getLogger(WrkCapture.class.getName()).log(Level.SEVERE, null, ex);
- }
- return ok;
- }
- /**
- * Méthode servant à reprendre un enregsitrement lorsqu'il a été mis en pause
- *
- * @return true : si l'enregistrment a bien repris
- */
- public boolean reprendreEnregsitrement() {
- boolean ok = false;
- if (proc1 == null && dSink == null) {
- proc1.notify();
- dSink.notify();
- ok = true;
- }
- return ok;
- }
- }
|
---------------
Mon Twitter
| |
BaZoubir Profil : New Penguin | import botcam.cste.Constante;????????????? quoi sa | |
dealer Profil : Big Penguin |
C'est simplement la classe ou je garde mes constantes  | |
| |