Extrême lenteur pour decoder et afficher un jpeg. [JAVA] - Java - Programmation
Marsh Posté le 25-04-2005 à 15:33:27
spiderbanana a écrit : et fait ralentir toute l'application (conso CPU ~70% pour du 10 fps ). |
je n'y crois pas. Ta caméra doit simplement être mal réglée (réglée avec un cadence de 10fps).
si vraiment le taquet venait du décodage, tu serais à 100%.
utilise-tu le même code avec JMF et sans JMF pour initialiser la caméra ?
Marsh Posté le 25-04-2005 à 17:31:27
En fait j'ai un thread qui tourne en permanance et récupère les images jpeg. J'utilise des callback pour indiquer au SourceStream JMF ou à mon panel qu'un nouvelle image est dispo. Dans le cas de JMF, je lui fait remonter le byte[] et il se debrouille avec ses codec, dans le cas de mon panel je decode moi même le byte[] (en fait dans ce cas là, c'est le thread de production qui va decoder l'image, pour jmf il a son propre thread). Tant que le decodage n'est pas en route j'ai un bon FPS ...
Citation : si vraiment le taquet venait du décodage, tu serais à 100%. |
J'ai un peu de mal à trouver des explication pour ca. C'est vrai que c'est étrange. En plus, quand je veux decoder pas mal d'images par secondes ET que je les affiches le temps de decodage varie enormement (passe de 100ms à 0 ms ??!!).
Marsh Posté le 27-04-2005 à 11:23:48
Hello,
J'ai le meme souci que toi !!
je voudrais bien connaitre ta solution avec le JMF moi je ne m'en sort pas !
merci d'avance
Marsh Posté le 27-04-2005 à 14:37:03
guinoumi a écrit : Hello, |
Je te conseille d'aller voir ici: http://java.sun.com/products/java- [...] Movie.html
Tu y trouveras le code pour faire une vidéo .mov à partie d'images jpeg avec jmf.
Modifie le code et utilise un Player à la place du Processor, vire tout ce qui est utile au processing, et modifie DataStream pour que ca colle avec ton programme.
Bonne chance !
Marsh Posté le 27-04-2005 à 16:52:37
Pourrais tu m'expliquer ce que tu entend par :
J'utilise des callback pour indiquer au SourceStream JMF ou à mon panel qu'un nouvelle image est dispo!
Marsh Posté le 27-04-2005 à 17:16:37
De meme j'aimerais savoir comment tu crée ton tableau de byte m_rawImage (moi je detecte les caractere de debut et de fin d'un fichier JPEG :0xffd8 et 0xffd9 car je ne connais pas la taille du fichier a l'avance mais c'est vraiment la galere !!)
Marsh Posté le 27-04-2005 à 18:01:52
guinoumi a écrit : Pourrais tu m'expliquer ce que tu entend par : |
En fait j'utilise le même principe que les evenements en java. En gros ma classe SourceStream implemente un listener (une interface) et la classe qui va chercher les images renseigne tout ses listeners connus qu'une nouvelle image est dispo.
C'est une methode très utilisée en java, fait une recherche sur les interface et les callbacks.
Citation : De meme j'aimerais savoir comment tu crée ton tableau de byte m_rawImage (moi je detecte les caractere de debut et de fin d'un fichier JPEG :0xffd8 et 0xffd9 car je ne connais pas la taille du fichier a l'avance mais c'est vraiment la galere !!) |
Ben moi je récupère un flux mjpeg, donc je cherche les balises --myboundary pour decouper le flux. Mais c'est vrai que c'est très chiant. Par contre y a la classe StreamTokeniser (chuis pas sûr du nom) en java qui pourra bien t'être utile.
Marsh Posté le 27-04-2005 à 18:08:46
Merci pour tout ces renseignements je vais essayer de m'en sortir !
Marsh Posté le 27-04-2005 à 18:10:29
guinoumi a écrit : Merci pour tout ces renseignements je vais essayer de m'en sortir ! |
Elles viennent d'ou tes images ?
Marsh Posté le 27-04-2005 à 21:35:25
Mes image viennent de camera IP mais de differentes marque ! et la resolution et la vitesse d'affichage peuvent changer a tout moment !
J'ai regerder la classe StremTokenizer mais c'est plus de l'analyse lexical que "byte a byte" !
c'est donc aussi un flux MJPEG et j'utilise aussi ta methode pour delimiter les images mais je ne vois pas comment les mettre dans un tableau dont je ne peu connaitre la taille a l'avance ?
pour l'instant j"envoyai le flux directement dans le decodeur mais je doit sauvgarder les images et la je suis un peu bloquer !
Marsh Posté le 28-04-2005 à 10:09:16
pourrais tu m'en dire plus sur ron listener que tu as mis sur ta classe DataStream ?
C'est la methode read qui'il faut lancer lorsque une nouvelle image est dispo ?
Marsh Posté le 28-04-2005 à 12:02:42
Code :
|
Voilà pour le stream
Sinon pour ton flux mjpeg, tu devrais regarde du côté là: http://www.charliemouse.com/code/cambozola/
Il y a absolument toutes les classes nécessaires (et les sources).
Sinon certaines camera envoient aussi la taille de chaques images avant celle ci, c'est un petit raccourci pour parser le flux.
Bonne chance !
Marsh Posté le 28-04-2005 à 17:11:39
que faut t'il mettre dans :
public void controllerUpdate(ControllerEvent ce) ???
Marsh Posté le 25-04-2005 à 14:12:52
Je suis en train de concevoir un programme java qui manipule des cameras IP. Celles-ci renvoyent un flux mjpeg, dont j'extrais des tableaux de bytes correspondant chacun à un fichier jpeg.
Le problème c'est que le décodage de ce byte[] est extrêmement lent (~ 100ms pour un petit jpeg de 12ko en 512*512) et fait ralentir toute l'application (conso CPU ~70% pour du 10 fps ). J'ai testé différentes méthodes et libraries utilisant des méthodes natives pour arriver au même résultat.
Avec jmf et en utilisant le même tableau de byte au départ les performances sont très bonnes, je peux atteindre les 30 fps en gardant des utilisation CPU très faibles <10%.
Comment avoir de si bon résultats sans utiliser JMF ? Quel est le secret de JMF ? Je me remet à vous car ca fait 2 semaines que je craque sur ce problème
Je vous montre quand même le code, mais c'est basic ...