Windows : csebchat010673 et 46 utilisateurs inconnus

 Mot :   Pseudo :  
 
Bas de page
Auteur
 Sujet :

[Java] Enregistrement de vidéos avec JMF

 
n°2606
dealer
Profil : Big Penguin
Avatar
profil
Posté le 21-12-2008 à 16:58:02  
 

Yop tout le monde, :hello:

 

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 : http://www.ceebot.com/ceebot/misc/elements/chhemisson.jpg.

 

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. :cry:

 

Voilà la classe qui me permet d'enregistrer les vidéos (avec en utilisant la DataSource clonée):

 
Code :
  1. /*
  2. * To change this template, choose Tools | Templates
  3. * and open the template in the editor.
  4. */
  5. package botcam.wrk;
  6. import botcam.cste.Constante;
  7. import java.io.IOException;
  8. import javax.media.*;
  9. import javax.media.format.VideoFormat;
  10. import javax.media.protocol.*;
  11. /**
  12. *
  13. * @author
  14. */
  15. public class WrkCapture {
  16.     private Player player;
  17.     private MediaLocator mediaLoc;
  18.     private CaptureDeviceInfo captureDevice;
  19.     private DataSource dSource;
  20.     private DataSink dSink;
  21.     private Processor proc;
  22.    
  23. //Méthode s'ocupant de récupérer la caméra puis de le retourner à l'IHM pour l'affichage
  24.     public Player startCam() {
  25.         captureDevice = CaptureDeviceManager.getDevice("vfw:Microsoft WDM Image Capture (Win32):0" );
  26.         mediaLoc = captureDevice.getLocator();
  27.         try {
  28.             dSource = Manager.createDataSource(mediaLoc);
  29.             player = Manager.createRealizedPlayer(dSource);
  30.             player.start();
  31.         } catch (CannotRealizeException ex) {
  32.             System.out.println("Erreur CannotRealizeException : " + ex.getMessage());
  33.         } catch (NoDataSourceException ex) {
  34.             System.out.println("Erreur NoDataSourceException : " + ex.getMessage());
  35.         } catch (IOException ex) {
  36.             System.out.println("Erreur IOException : " + ex.getMessage());
  37.         } catch (NoPlayerException ex) {
  38.             System.out.println("Erreur NoPlayerException : " + ex.getMessage());
  39.         }
  40.         return player;
  41.     }
  42. //Méthode s'occupant d'enregistrer la vidéo
  43.     public boolean commencerEnregsitrement(String nomFichier) {
  44.         boolean ok = false;
  45.         try {
  46. //Définition du format utilisé
  47.             String outputFormat = FileTypeDescriptor.QUICKTIME;
  48.             FileTypeDescriptor ftd = new FileTypeDescriptor(outputFormat);
  49.             Format[] format = new Format[]{new VideoFormat(null)};
  50. //Création de la datasource clone
  51.             DataSource dSourceClonable = Manager.createCloneableDataSource(dSource);
  52.             DataSource dSourceCloned = ((SourceCloneable) dSourceClonable).createClone();
  53. //Création du Processor
  54.             ProcessorModel pm = new ProcessorModel(dSourceCloned, format, ftd);
  55.             proc = Manager.createRealizedProcessor(pm);
  56.             DataSource ds = proc.getDataOutput();
  57. //Création du fichier
  58.             MediaLocator ml = new MediaLocator("file:" + Constante.LOCATION_VIDEO + nomFichier + ".mov" );
  59. //Initialisation de la DataSink
  60.             dSink = Manager.createDataSink(ds, ml);
  61. //Démarrage du Processor et de la DataSink
  62.             dSink.open();
  63.             dSink.start();
  64.             proc.start();
  65.             ok = true;
  66.         } catch (NoDataSinkException ex) {
  67.             System.out.println("Erreur NoDataSinkException : " + ex.getMessage());
  68.         } catch (IOException ex) {
  69.             System.out.println("Erreur IOException : " + ex.getMessage());
  70.         } catch (NoProcessorException ex) {
  71.             System.out.println("Erreur NoProcessorException : " + ex.getMessage());
  72.         } catch (CannotRealizeException ex) {
  73.             System.out.println("Erreur CannotRealizeException : " + ex.getMessage());
  74.         }
  75.         return ok;
  76.     }
  77. //Méthode s'occupant de terminer le téléchargement
  78.     public boolean terminerEnregsitrement() {
  79.         boolean ok = false;
  80.         try {
  81.             proc.stop();
  82.             dSink.stop();
  83.             dSink.close();
  84.             proc.close();
  85.             ok = true;
  86.         } catch (IOException ex) {
  87.             System.out.println("Erreur IOException : " + ex.getMessage());
  88.         }
  89.         return ok;
  90.     }
  91. }
 

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
answer
mood
GoogleAds
profil
Posté le 21-12-2008 à 16:58:02  
 

answer
n°3142
Sino
Profil : New Penguin
Avatar
profil
Posté le 13-02-2010 à 21:55:07  
 

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

answer
n°3209
dealer
Profil : Big Penguin
Avatar
profil
Posté le 30-03-2010 à 21:16:43  
 

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 :
  1. /*
  2. * To change this template, choose Tools | Templates
  3. * and open the template in the editor.
  4. */
  5. package botcam.wrk;
  6. import botcam.cste.Constante;
  7. import java.io.IOException;
  8. import java.util.logging.Level;
  9. import java.util.logging.Logger;
  10. import javax.media.*;
  11. import javax.media.format.VideoFormat;
  12. import javax.media.protocol.*;
  13. /**
  14. *
  15. * @author croisiery
  16. */
  17. public class WrkCapture {
  18.     /**
  19.      * Contient la caméra du robot
  20.      */
  21.     private Player player;
  22.     /**
  23.      * Locator du périphériques de capture
  24.      */
  25.     private MediaLocator mediaLoc;
  26.     /**
  27.      * Contient toutes les infos sur le périphérique de capture
  28.      */
  29.     private CaptureDeviceInfo captureDevice;
  30.     /**
  31.      * DataSource de base
  32.      */
  33.     private DataSource dSource;
  34.     /**
  35.      * DataSource originale qui sera clonée
  36.      */
  37.     private DataSource dSourceOriginal;
  38.     /**
  39.      * Flux de donées servant à l'enregistremende de la vidéo
  40.      */
  41.     private DataSink dSink;
  42.     /**
  43.      * Processor utilisé par le player
  44.      */
  45.     private Processor proc;
  46.     /**
  47.      * Processor utilisé pour l'enregistrement des vidéos
  48.      */
  49.     private Processor proc1;
  50.     /**
  51.      * Clone de la DataSource originale. Cette DataSource est utilisée par
  52.      * le player.
  53.      */
  54.     private DataSource dSourceClonable;
  55.     /**
  56.      * Clone de dSourceClonable. Cette DataSource est utilisée pour enregitré des
  57.      * vidéos
  58.      */
  59.     private DataSource dSourceClone;
  60.     /**
  61.      * Méthode de démarrag de la caméra du robot.
  62.      *
  63.      * @return player : le player contenant la caméra du robot
  64.      */
  65.     public Player startCam() {
  66.         //On réupère le périphériqque de capture
  67.         captureDevice = CaptureDeviceManager.getDevice("vfw:Microsoft WDM Image " +
  68.                 "Capture (Win32):0" );
  69.         //On initialise le Locator par rapport au périphérique de capture
  70.         mediaLoc = captureDevice.getLocator();
  71.         try {
  72.             //Initialisation de la DataSource de base
  73.             dSource = Manager.createDataSource(mediaLoc);
  74.             //On Connecte la DataSource
  75.             dSource.connect();
  76.             //Initialisation du processor utilisé par le player
  77.             proc = Manager.createProcessor(dSource);
  78.             //Réalisation du processor
  79.             proc.realize();
  80.             //On attend que le processor soit réalisé avant de continuer
  81.             while (proc.getState() != proc.Realized) {
  82.                 try {
  83.                     Thread.sleep(10);
  84.                 } catch (InterruptedException ex) {
  85.                     Logger.getLogger(WrkCapture.class.getName()).log(Level.SEVERE,
  86.                             null, ex);
  87.                 }
  88.             }
  89.             //Initialistion de la DatSource originale
  90.             dSourceOriginal = proc.getDataOutput();
  91.             //On démarre le processor
  92.             proc.start();
  93.             //On attend que le processor soit bien démarrer
  94.             while (proc.getState() != proc.Started) {
  95.                 try {
  96.                     Thread.sleep(10);
  97.                 } catch (InterruptedException ex) {
  98.                     Logger.getLogger(WrkCapture.class.getName()).log(Level.SEVERE,
  99.                             null, ex);
  100.                 }
  101.             }
  102.             //On clone la DataSource Origniale
  103.             dSourceClonable = Manager.createCloneableDataSource(dSourceOriginal);
  104.             //On crée le player en utilisant la DataSource clonée
  105.             player = Manager.createRealizedPlayer(dSourceClonable);
  106.             //On démarre le player
  107.             player.start();
  108.             //On attend que le player soit bien démarré
  109.             while (player.getState() != player.Started) {
  110.                 try {
  111.                     Thread.sleep(10);
  112.                 } catch (InterruptedException ex) {
  113.                     Logger.getLogger(WrkCapture.class.getName()).log(Level.SEVERE,
  114.                             null, ex);
  115.                 }
  116.             }
  117.         } catch (CannotRealizeException ex) {
  118.             System.out.println("Erreur CannotRealizeException : " + ex.getMessage());
  119.         } catch (NoDataSourceException ex) {
  120.             System.out.println("Erreur NoDataSourceException : " + ex.getMessage());
  121.         } catch (IOException ex) {
  122.             System.out.println("Erreur IOException : " + ex.getMessage());
  123.         } catch (NoPlayerException ex) {
  124.             System.out.println("Erreur NoPlayerException : " + ex.getMessage());
  125.         }
  126.         return player;
  127.     }
  128.     /**
  129.      * Méthode servant à l'enregitrement de la vidéo
  130.      *
  131.      * @param nomFichier : nom sous lequel la vidéo sera enregitrée
  132.      * @return true : si l'enregistrement a bien démarré
  133.      */
  134.     public boolean commencerEnregsitrement(String nomFichier) {
  135.         boolean ok = false;
  136.         try {
  137.             //On définit un format de sortie (ici QuickTime)
  138.             String outputFormat = FileTypeDescriptor.QUICKTIME;
  139.             //On crée un file descriptor sur la base du format de sortie
  140.             FileTypeDescriptor ftd = new FileTypeDescriptor(outputFormat);
  141.             Format[] formats = new Format[]{new VideoFormat(null)};
  142.             //On crée un modèle de processor en utilisant un noveau clone de la
  143.             //DataSource clonée
  144.             ProcessorModel pm = new ProcessorModel(((SourceCloneable)
  145.                     dSourceClonable).createClone(), formats, ftd);
  146.             try {
  147.                 //On crée le processor destiné à l'enregistrement de la vidéo
  148.                 proc1 = Manager.createRealizedProcessor(pm);
  149.             } catch (NoProcessorException ex) {
  150.                 Logger.getLogger(WrkCapture.class.getName()).log(Level.SEVERE, null, ex);
  151.             } catch (CannotRealizeException ex) {
  152.                 Logger.getLogger(WrkCapture.class.getName()).log(Level.SEVERE, null, ex);
  153.             }
  154.             //Création d'un nouveau médialocator qui définit où on enregistre la
  155.             //vidéo et quel est son extension (l'extension doit correspondre au format)
  156.             MediaLocator ml = new MediaLocator("file:" + Constante.LOCATION_VIDEO +
  157.                     nomFichier + ".mov" );
  158.             //Création d'une nouvelle dataSource
  159.             DataSource ds = proc1.getDataOutput();
  160.             //Création d'une DataSink en utilisant la DataSource créée précèdemment
  161.             //et le médialocator crée en début de méthode
  162.             dSink = Manager.createDataSink(ds, ml);
  163.             //On ouvre la dataSink
  164.             dSink.open();
  165.             //On démarre la dataSink
  166.             dSink.start();
  167.             //On démarre le processor
  168.             proc1.start();
  169.             ok = true;
  170.         } catch (NoDataSinkException ex) {
  171.             System.out.println("Erreur NoDataSinkException : " + ex.getMessage());
  172.         } catch (IOException ex) {
  173.             System.out.println("Erreur IOException : " + ex.getMessage());
  174.         }
  175.         return ok;
  176.     }
  177.     /**
  178.      * Méthode qui sert à terminer l'enregistrement d'une vidéo
  179.      *
  180.      *@return true : si l'enregistrement a bient été terminé
  181.      */
  182.     public boolean terminerEnregsitrement() {
  183.         boolean ok = false;
  184.         //on teste si le processor et datasink ne sont pas null
  185.         if (proc1 != null && dSink != null) {
  186.             //on arrête le processor
  187.             proc1.stop();
  188.             //on ferme le processor
  189.             proc1.close();
  190.             //on ferme la DataSink
  191.             dSink.close();
  192.             ok = true;
  193.         }
  194.         return ok;
  195.     }
  196.     /**
  197.      * Méthode servant à mettre en pause un registrement en cours
  198.      *
  199.      * @return true : si l'enregistrement a bien été mis en pause
  200.      */
  201.     public boolean mettreEnPause() {
  202.         boolean ok = false;
  203.         try {
  204.             proc1.wait();
  205.             dSink.wait();
  206.             ok = true;
  207.         } catch (InterruptedException ex) {
  208.             Logger.getLogger(WrkCapture.class.getName()).log(Level.SEVERE, null, ex);
  209.         }
  210.         return ok;
  211.     }
  212.     /**
  213.      * Méthode servant à reprendre un enregsitrement lorsqu'il a été mis en pause
  214.      *
  215.      * @return true : si l'enregistrment a bien repris
  216.      */
  217.     public boolean reprendreEnregsitrement() {
  218.         boolean ok = false;
  219.         if (proc1 == null && dSink == null) {
  220.             proc1.notify();
  221.             dSink.notify();
  222.             ok = true;
  223.         }
  224.         return ok;
  225.     }
  226. }



---------------
Mon Twitter
answer
n°3221
BaZoubir
Profil : New Penguin
Avatar
profil
Posté le 19-04-2010 à 05:16:03  
 

import botcam.cste.Constante;????????????? quoi sa

answer
n°3225
dealer
Profil : Big Penguin
Avatar
profil
Posté le 23-04-2010 à 10:11:29  
 

BaZoubir a écrit :

import botcam.cste.Constante;????????????? quoi sa


 
C'est simplement la classe ou je garde mes constantes ;)

answer

Aller à :
Ajouter une réponse