Swing - Animation d'images

Résolu
Lyorix Messages postés 12 Date d'inscription jeudi 18 mai 2006 Statut Membre Dernière intervention 26 novembre 2009 - 26 nov. 2009 à 10:49
Lyorix Messages postés 12 Date d'inscription jeudi 18 mai 2006 Statut Membre Dernière intervention 26 novembre 2009 - 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).

4 réponses

cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
26 nov. 2009 à 12:57
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
3
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
26 nov. 2009 à 11:14
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
0
Lyorix Messages postés 12 Date d'inscription jeudi 18 mai 2006 Statut Membre Dernière intervention 26 novembre 2009
26 nov. 2009 à 12:27
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.
0
Lyorix Messages postés 12 Date d'inscription jeudi 18 mai 2006 Statut Membre Dernière intervention 26 novembre 2009
26 nov. 2009 à 14:38
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.
0
Rejoignez-nous