Swing - Animation d'images [Résolu]

Lyorix 12 Messages postés jeudi 18 mai 2006Date d'inscription 26 novembre 2009 Dernière intervention - 26 nov. 2009 à 10:49 - Dernière réponse : Lyorix 12 Messages postés jeudi 18 mai 2006Date d'inscription 26 novembre 2009 Dernière intervention
- 26 nov. 2009 à 14:38
Bonjour,

J'ai une question concernant l'affichage d'images et l'API Swing.

Je cherche à lire un flux vidéo depuis une Webcam. Pour cela, je fais des appels à une librairie native Windows (Direct Show) depuis mon programme JAVA.

Le principe est le suivant : Je récupère l'image capturée dans mon buffer, que je "transforme" en AWT Image. J'ajoute ensuite cette image dans un JComponent, pour l'afficher à l'écran (à l'intérieur de ma JFrame). Ainsi, chaque image capturée est affichée dans mon JComponent (15 images par secondes). En 320x240, tout fonctionne parfaitement.

Mon problème : En 640x480, j'utilise 80% du CPU (avec un Core 2). J'ai donc cherché d'où venait le problème, et j'ai trouvé la réponse. Malheureusement, je n'ai pas la solution :(.
En fait, la capture d'images ne consomme pas de ressources et fonctionne bien. Par contre, la méthode repaint(), qui affiche mon Image dans mon JComponent (g.drawImage), occupe presque toute la ressource CPU.

Ma question est la suivante : "c'est quoi la solution ?". Plus sérieusement, j'aimerais savoir comment faire pour afficher successivement des images (15 images par secondes) dans un composant swing ? Le drawImage() est apparemment trop consommateur en ressources CPU pour mon cas...


Merci par avance,


PS : J'utilise un SwingWorker pour mes traitement. Je sépare bien les traitement effectués dans l'EDT (repaint du JComponent), des traitements effectués pour la capture d'images (avec directshow dans mon cas, mais ça pourrait aussi être des fichiers GIF animés sur le disque).
Afficher la suite 

Votre réponse

4 réponses

Meilleure réponse
cs_DARKSIDIOUS 15838 Messages postés jeudi 8 août 2002Date d'inscription 4 mars 2013 Dernière intervention - 26 nov. 2009 à 12:57
3
Merci
Salut,

Un flux vidéo est différent qu'une succession d'image :
- bien souvent les frameworks utilisent la carte graphique, qui est bien plus optimisée pour afficher des vidéos que le CPU !
- Une vidéo, ce n'est pas forcément une succession d'image, ca peut être une image de référence, puis les delta entre l'image de référence et la nouvelle image à afficher (principe utilisé par le divX par exemple) et donc beaucoup moins de pixels à modifier !

Je te conseille de regarder du côté de JMF (et ses extensions, telle que Fobs4JMF par exemple) pour afficher une vidéo (il gère le streaming).
______________________________________
DarK Sidious

Merci cs_DARKSIDIOUS 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 73 internautes ce mois-ci

Commenter la réponse de cs_DARKSIDIOUS
cs_DARKSIDIOUS 15838 Messages postés jeudi 8 août 2002Date d'inscription 4 mars 2013 Dernière intervention - 26 nov. 2009 à 11:14
0
Merci
Salut,

Forcément que ca prend du temps CPU ! 15 images par secondes avec une telle résolution, ca en fait des pixels à afficher à chaque seconde, et tout est géré par le CPU !

La solution ? Ben à moins de trouver une librairie qui utilise le GPU pour afficher des images et non le CPU, ou alors de réussir à capturer le flux vidéo de la webcam plutôt que de récupèrer les images, je ne vois pas trop !
______________________________________
DarK Sidious
Commenter la réponse de cs_DARKSIDIOUS
Lyorix 12 Messages postés jeudi 18 mai 2006Date d'inscription 26 novembre 2009 Dernière intervention - 26 nov. 2009 à 12:27
0
Merci
C'est ce que je me suis dit concernant l'affichage successive des images (hélas, je n'ai pas pensé à ce problème avant de développer mon application...)

Admettons que je trouve le moyen de capturer le flux vidéo (je n'ai pas trop l'habitude de faire du streaming, mais je pense que je trouverai bien quelque chose). Si je veux afficher ce flux dans un container swing, il n'y aura pas de repaint effectué sur ce dernier ? Quel container je peux utiliser ?

Merci pour la réponse.
Commenter la réponse de Lyorix
Lyorix 12 Messages postés jeudi 18 mai 2006Date d'inscription 26 novembre 2009 Dernière intervention - 26 nov. 2009 à 14:38
0
Merci
Merci bien pour tes réponses Darksidious !

En fait, j'ai déjà cherché une API pour faire du streaming en Java, mais je n'ai rien trouvé de très intéressant pour la capture vidéo d'une webcam. Concernant JMF, il utilise un "ancien" framework multimedia de microsoft (vfw). Le problème c'est que ma caméra n'est pas compatible vfw. J'ai trouvé d'autres API Java, basées cette fois sur WDM pour la capture vidéo depuis une webcam, mais je n'ai pas réussi à piloter plusieurs webcam simultanément depuis ce framework.

Je n'avais pas entendu parler de Fobs4JMF avant de passer sur ce forum, il faut que je vérifie si il se base bien sur l'API DirectShow pour la capture depuis une webcam (et non sur vfw comme la plupart des librairies que j'ai trouvé). Sinon, j'ai trouvé aussi LTI-CIVIL qui est sous LGPL et qui utilise DirectShow.

Il faut que je regarde tout ça de plus près, dès que j'aurai un peu plus de temps. En attendant, j'ai déjà quelques points qui se sont éclairés grâce à tes réponses.
Commenter la réponse de Lyorix

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.