Capture webcam avec JMF, les formats de capture

elawem Messages postés 3 Date d'inscription mardi 12 avril 2005 Statut Membre Dernière intervention 15 avril 2005 - 13 avril 2005 à 18:54
mina1206 Messages postés 4 Date d'inscription vendredi 21 août 2009 Statut Membre Dernière intervention 14 mai 2010 - 18 nov. 2009 à 15:48
Bonjour à tous, je dois afficher les flux vidéos de plusieurs webcams pour un jeu de belote en réseau.

Grâce aux différents tutoriaux et exemples du site j'ai réussi à
acquérir le flux et l'afficher dans un JPanel, cependant comme cela est
destiné à un jeu de belote, je dois obtenir ce flux dans un format bien
précis: du 160*120 en RGB.

Voici le code que j'ai mis en oeuvre pour récupérer les périphériques video de la machine:




videoFormat = new VideoFormat(VideoFormat.RGB, new Dimension(160, 120), 230400, Format.byteArray, 20f);

deviceList = CaptureDeviceManager.getDeviceList(new VideoFormat(VideoFormat.RGB));

webcam = (CaptureDeviceInfo)deviceList.get(i);





Je pensais que l'object VideoFormat ainsi crée allait me donner un flux
en 160*120. En fait il ne permet que de selectionner les peripheriques
supportant ce mode.



Je ne trouve pas comment modifier la taille de ce flux apres acquisition du CaptureDeviceInfo.

J'ai bien trouvé qu'apres avoir crée un Player on pouvait accéder à une
interface de tyep Control pour modifier le flux mais je voudrai que ca
soit automatique.



Pour résumer, je cherche un moyen de spécifier la taille du rendu vidéo avant de faire un:



player.start();



sans solliciter une action de l'utilisateur.

12 réponses

elawem Messages postés 3 Date d'inscription mardi 12 avril 2005 Statut Membre Dernière intervention 15 avril 2005
13 avril 2005 à 18:57
Petit rectificatif, j'ai mal copié mon code source, le voila:





videoFormat = new VideoFormat(VideoFormat.RGB, new Dimension(160, 120), 230400, Format.byteArray, 20f);

deviceList = CaptureDeviceManager.getDeviceList(new VideoFormat(videoFormat));

webcam = (CaptureDeviceInfo)deviceList.get(0);

0
frank_sauvage Messages postés 56 Date d'inscription jeudi 14 avril 2005 Statut Membre Dernière intervention 9 avril 2006
14 avril 2005 à 22:12
bonjour,

effectivement, le fait de specifier un format lors de la recuperation du CDI, ne permet pas d'obtenir un flux dans ce meme format.

pour cela, il vous faudra utiliser un Processor. et specifier ce format en tant que format de sortie grace à, si mes souvenirs sont bons, la methode setOutputFormat.

si je puis me permettre,
vous semblez vous attaquer à la JMF depuis peu, et ce que vous cherchez à faire n'est pas des plus simples. quel est votre delai de livraison ?

sinon pour vous aiguiller un peu dans vos recherches, vous devrez utiliser quelque chose du type :

CDI -> DataSource -> processor -> CloneableDataSource-> RTPManager |_______| RTPManager -> Player.
(la cloneable datasource vous servant a utiliser une seconde fois le flux pour l'affichage local)
pour votre transmission reseau il vous sera neccessaire d'utiliser le protocole RTP grace à :
-soit l'implémentation par defaut.
- soit definir votre propre support à RTP grace à l'interface RTPConnector.

si effectivement, il vous sera probablement apparent qu'il est plus rapide d'utiliser l'implementation par defaut, sachez que cette derniere suit à la lettre le RFC 1889/1890 ( mis à jour vers le 3550 ?? pas sur, mais non essentiel), et que donc vous serez pas à meme de passer les NAT et les firewalls dans la diffusion de vos flux.
c'est donc la que vous devrez trouver un autre moyen de passer, soit en implementant vous meme STUN (toujours pas porté sur JAVA), soit en bidouillant votre propre protocole.

donc pour résumer :
- la premiére etape est de vous familiariser avec les objets de la JMF sus-cités.
- la seconde étant un travail sur la partie reseau pour la transmission des flux.

il s'agit ici de visio-conférence temps réelle, c'est une partie interressante mais ardue de la JMF.
cependant, si votre but n'est que la possibilité pour les differents participants de pouvoir se voir, il existe neanmoins une autre possibilité : l'utilisation de capture d'image et leur publication via HTML. si l'idée peut paraitre saugrenue, elle est malgré tout rapidement realisable.
pour cela utilisez le GrabFrameControl..cette interface ne posséde qu'une seule methode grabFrame qui renvoi un buffer. il vous suffit ensuite d'utiliser la classe BufferToImage et de la serializer vers le serveur ou autre.

cette fois ci c'est donc plutot :

CDI -> DataSource -> Player -> GrabFrameControl -> Buffer -> BufferToImage -> Image.

Voila,
en esperant que cela vous aidera a diriger vos travaux.

Cdlt;
FSA;
0
elawem Messages postés 3 Date d'inscription mardi 12 avril 2005 Statut Membre Dernière intervention 15 avril 2005
15 avril 2005 à 10:44
Le jeu constitue mon projet de langage Java en école d'ingénieur, il ne
sera testé que sur le réseau local donc les flux n'ont pas besoin de
passer a travers des firewalls. C'est un peu triste de passer par la
facilité, mais comme il y a 5 autres projets à rendre dans un mois il
va falloir aller vite avec le streaming.



Merci pour votre aide, elle est précieuse et va nous permettre d'avancer après 2 jours de galere :)
0
frank_sauvage Messages postés 56 Date d'inscription jeudi 14 avril 2005 Statut Membre Dernière intervention 9 avril 2006
15 avril 2005 à 17:09
oh un collégue étudiant :)



je suis moi même en licence d'informatique à paris 5..donc je suis plus où moins dans les mêmes conditions actuellement ;)



sinon pour revenir à votre probléme, si vous n'avez qu'à le faire marcher en reseau local..

sachez que la version 2.1.1 de la JMF implemente desormais le protocole
RTSP (streaming multicast) ce qui sera probablement alors encore plus
simple pour vous.



P.S. la documentation de la JMF en ligne n'est pas à jour si vous y acceder via le site de sun..

le mieux est donc de telecharger les sources et de regenerer les javadocs localement.

il est aussi possbile d'avoir accés à une mise à jour mais cette fois
il vous faudra passer par ce lien :
http://java.sun.com/products/java-media/jmf/2.1.1/apidocs/index.html



voila en esperant que cela vous aidera dans votre projet.

Cdlt;

FSA;
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
madjonk Messages postés 1 Date d'inscription jeudi 28 avril 2005 Statut Membre Dernière intervention 10 mai 2005
10 mai 2005 à 14:56
Salut,

Je travaille aussi dans mon projet avec l'API JMF avec lequel je débute.
J'aurais besoin de quelques éclaircissements... voila mon probleme:

Je récupère des datas frame d'une video, grace à l'API JMF, que j'envoie dans le réseau.
A l'autre bout du réseau, je les récupère et je voudrais les remettre dans le format de départ.

Mon problème réside dans le fait que l'API JMF ne me permet pas de construire un fichier de sortie .avi me contenant tous les frames de la vidéo. C'est à dire un fichier .avi contenant les bon headers, etc..(Les frames arrivent dans l'ordre à l'autre bout du réseau.) Y t-il moyen avec l'api JMF de générer le fichier .avi (avec les bon headers et le bon format)

Merci de votre aide.
0
frank_sauvage Messages postés 56 Date d'inscription jeudi 14 avril 2005 Statut Membre Dernière intervention 9 avril 2006
11 mai 2005 à 15:29
Bonjour,



je ne suis pas sur de comprendre ce que vous voulez faire exactement..

Comment faites vous pour recuperer les dataFrame ? a partir de quel
classe et quel type de flux en entrée.. pour l'envoi reseau.comment
faites vous ? utilisez vous le RTPManager ?



par contre, en ce qui concerne l'enregistrement dans un fichier, et
plus particulierement un AVI, la jmf le permet sans trop de
difficultées normalement..

en fait pour ca, vous devez utiliser un processeur et un datasink..

pour specifier le format des pistes utilisez la methode setFormat()

pour pouvoir specifier le format en sortie du processeur, utilisez la methode : setContentDescriptor()



par exemple : (tres simplifié au niveau de la gestion des tracks)

this.track = processeur.getTrackControls();

this.track[0].setFormat(new Format(VideoFormat.CINEPAK));

processeur.setContentDescriptor(new ContentDescriptor

(FileTypeDescriptor.MSVIDEO)));



par contre..si vous voulez que ca marche bien..n'oubliez pas un detail
: vous devrez toujours stopper le processeur avant le datasink.



bon..n'etant pas sur de ce que vous vouliez..

en cas de PB, je reste sur ce forum..



Cdlt;

FSA;
0
salvucho Messages postés 2 Date d'inscription dimanche 3 avril 2005 Statut Membre Dernière intervention 8 août 2005
8 août 2005 à 07:47
Bonjour à tous, je suis un pt nouveau en programmation, et je dois afficher les flux vidéos de plusieurs webcams connectées sur des USB d'un seul PC.
J'arrive à voir le flux d'une webcam, mais quand je connecte la 2ème il bug !

Quelqu'un pourrait m'aider ? ?
Voici un bout de code

String str1 = "vfw:Logitech USB Video Camera:0";
String str2 = "vfw:Microsoft WDM Image Capture(Win32):0";
captDeviceInfo = CaptureDeviceManager.getDevice(str2);
medialocator = new MediaLocator( "vfw://0" );
try
{
this.player = Manager.createRealizedPlayer(medialocator);
this.player.start();
this.componentWebCam = this.player.getVisualComponent();
}
catch (Exception e)
{
System.out.println( "ERREUR : WebCam..." );
e.printStackTrace();
}
0
PhoeniXX52 Messages postés 38 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 8 mars 2006
3 mars 2006 à 12:17
Ce post m'a bien aidé ... Bonne continuation à tous

Simon.

Pourvu que ca dure ...

[url]www.eagendas.be/url
0
hakim8086 Messages postés 1 Date d'inscription lundi 21 mai 2007 Statut Membre Dernière intervention 19 juillet 2007
19 juil. 2007 à 12:15
Bonjour a tous:
 



Je travaille aussi dans mon projet avec l'API JM  



, je veus afficher un flux video sur mon ardinateur et en meme je l'envoyer ds le reseau .
le probleme est : si j'onvoyer  le flux



sur le reseau 



je peut pas l'afficher sur mon ordinateur et le contraire
et lors de l'execution il affiche un erreur d'exception "java.io.IOException: Capture device in use"
c_ad le data source de webcam est utilise par un autre  player ou autre processor ??????
alors je veut recupere le flux video et je l'affiche dans sur mon ordinateur dans un panel et en meme temps  j'envoyer sur le reseau .
Est ce que je peut dupliquer l'affichage d'un seul player dans 2 panel ou + ?????
Est ce je peut creer + d'un player pour un seul data source ?????
Merci de votre aide  .
0
ghilashamza Messages postés 3 Date d'inscription lundi 5 novembre 2007 Statut Membre Dernière intervention 11 mai 2008
11 mai 2008 à 15:04
moi aussi j'ai le même probleme mais je n'arive pas encor à le faire, si vous avez la solution,j'attend votre aide.
e-mail:  [mailto:zivou123@yahoo.fr zivou123@yahoo.fr]
0
ghilashamza Messages postés 3 Date d'inscription lundi 5 novembre 2007 Statut Membre Dernière intervention 11 mai 2008
11 mai 2008 à 15:07
bonjour tous.
je veux afficher le flux acqui par une webcame et l'enregistrer en même temps, mais j'arrive pas, j'attend votre aide
0
mina1206 Messages postés 4 Date d'inscription vendredi 21 août 2009 Statut Membre Dernière intervention 14 mai 2010
18 nov. 2009 à 15:48
Bonjour tous le monde, alors je dois capturer les images d'une webcam pour effectuer un traitement dessus mais je débute avec le concept du flux vidéo, je souhaite obtenir une petite orientation pour voir comment commencer
0
Rejoignez-nous