je veux savoir comment je peux découper une vidéo en images avec la jmf.
plus précisemment je veux générer les séquences d'images qui constituent une vidéo.
je veux savoir comment je peux découper une vidéo en images avec la jmf.
plus précisemment je veux générer les séquences d'images qui constituent une vidéo.
salut,
ça m'a pris trop de temps mais en fin ça marche très bien.
voici le code qui permet d'en extraire toutes le images d'une vidéo.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127 /* Code écrit par Mehdiing Avant d'éxécuter le code vous devriez installer le package JMF. Ce code ne marche que pour les médias de format AVI. */ import javax.media.*; import java.awt.Image; import java.awt.image.BufferedImage; import java.io.FileOutputStream; import javax.media.control.FrameGrabbingControl; import javax.media.control.FramePositioningControl; import javax.media.format.VideoFormat; import javax.media.util.BufferToImage; public class Video_Images implements ControllerListener{ Buffer buf = null; Image img = null; BufferToImage btoi = null; private Player player = null; //Constructeur public Video_Images(String a) { super(); try { /*La création du lecteur et le chargement du fichier à lire.*/ player = Manager.createPlayer( new MediaLocator(a) ); /*L'ajout d'un écouteur sur le player pour pouvoir gérer les évenements de ce dernier*/ player.addControllerListener( this ) ; /*Cette fonction permet au player d'acquérir toutes les informations et toutes les ressources qui lui sont nécessaires sur le média*/ System.out.println("Acquésition des ressources et des informations média en cours."); System.out.println("Patientez S'il vous plait."); player.realize(); } catch (Exception e) { /*Traitement des erreurs qui peuvent survenir lors de la création du lecteur.*/ System.out.println("Error creating player"); return; } } /*On implimente la fonction controllerUpdate de la classe ControllerListener qui nous permet de gérer les évenemnts du player.*/ public void controllerUpdate( ControllerEvent ce ) { /* une fois les ressources et les informations nécessaires pour le média sont reconnus on passe au traitement.*/ if ( ce instanceof RealizeCompleteEvent ) { int NomImage = 1; int dest; FramePositioningControl fpc; FrameGrabbingControl fgc; Time duration = player.getDuration(); int totalFrames = FramePositioningControl.FRAME_UNKNOWN; fpc = (FramePositioningControl) player.getControl("javax.media.control.FramePositioningControl"); if (fpc == null) { System.out.println("Le média ne supporte pas les FramePositioningControl."); } else { /* On calcul le nombre d'images dans le média. */ totalFrames = fpc.mapTimeToFrame(duration); System.out.println("Nombre total des images dans le média : " + totalFrames); /* boucle de parcours des images de le média. */ while (NomImage <= totalFrames) { /* La fonction skip nous permet d'avancer dans les images par exemple si le player pointe sur l'image 45 de le média et on fait dest = fpc.skip(10); le player pointera sur l'image 55. Pour la fonction seek on peut accéder directement à l'image qu'on désire par exemple quelque soit l'image sur laquelle pointe le player et on fait dest = fpc.seek(10) le player pointera sur l'image 10. */ dest = fpc.skip(1);//avec dest = fpc.seek(NomImage); ça marche aussi. /* On capture l'image pointé par le player. */ fgc = (FrameGrabbingControl) player.getControl("javax.media.control.FrameGrabbingControl"); /* On met l'image dans un buffer. */ buf = fgc.grabFrame(); /* On convertit l'image dans le buffer. */ btoi = new BufferToImage( (VideoFormat) buf.getFormat()); img = btoi.createImage(buf); /* Ici vous pouvez soit enregistrez l'image ou bien l'afficher dans un JPanel ... je vous laisse e choix. */ System.out.println("Image " + NomImage + "extraite"); NomImage = NomImage + 1; } } } } /*La fonction main. N'oubliez pas de changer le chemin de la video. */ public static void main(String[] args) { new Video_Images("file:C:\\video.avi" ); } }
Mercibeaucoup au nom de ceux qui pourront réutiliser ton travail par la suite (même si personellement, pour l'instant je n'en ais aucunement l'utilité)...
Pour l'utilité, crois moi c'est vraiment très utile.
car ça simplifie beaucoup la tâche de traitement de la vidéo.
avec ça en peut aider à la détection de mouvement, on applique des filtres aux vidéos : détection de contours, transformation niveaux de gris...
hey dis donc !
Moi c'est exactement l'inverse que je veux faire ?
vous pourriez m'aider ?
bon tu peux trouver le code sur le site de sun.
ce code te permet de générer une vidéo .mov(quicktime movie)
voilà le lien
http://java.sun.com/products/java-me...esToMovie.html
il existe un autre dans le même site celui ci te permet de générer un fchier .avi
http://forum.java.sun.com/thread.jsp...sageID=2394574
J'avoue merci beaucoup pour le code, il me fait beaucoup progresser dans mon projet !!
Cependant, reste un hic :
ma variable fpc est null, le programme m'indiquant alorsSachant que ma vidéo est en .mpg et que JMF la supporte!!"Le média ne supporte pas les FramePositioningControl."
Quelqu'un a-t-il une idée de l'origine du problème ??
Merci d'avance.
merci
Mais le problème qu'il me signale des erreurs et puisque je suis débutante je ne sais pas quoi faire ou d'ou vient le problème j'ai essayé avec un video.avi::
Unable to handle format: MJPG, 320x240, FrameRate=7.4, Length=230400 0 extra bytes
Exception in thread "JMF thread: SendEventQueue: com.sun.media.content.unknown.Handler" java.lang.NullPointerException
at PFE.Video_Images.controllerUpdate(Video_Images.java:129)
at com.sun.media.BasicController.dispatchEvent(BasicController.java:1254)
at com.sun.media.SendEventQueue.processEvent(BasicController.java:1286)
at com.sun.media.util.ThreadedEventQueue.dispatchEvents(ThreadedEventQueue.java:65)
at com.sun.media.util.ThreadedEventQueue.run(ThreadedEventQueue.java:92)
Ca veut dire que JMF ne sait pas lire ce format de vidéo. JMF supporte très peu de format.Unable to handle format: MJPG, 320x240, FrameRate=7.4, Length=230400 0 extra bytes
j ai le même probleme que nadou114, mon lecteur ne supporte que les MP3, jmf ne supporte pas tous les formats, comment remédier à ce problème,en fait j'ai posté cette question plusieurs fois mais mon problème reste le même
cc mehdi c amira, dans le code qui décompose la vidéo en images, vous avez écris dans un commentaire( ici je vous laisse le choix si vous voulez enregistrer ou affichez les images) j'ai essayé de les enregistrer et les afficher par la suite mais sa n'a pas marché. si vous pouvez me dire comment je dois faire
Bonjour,
Pour enregistrer les images ajoute ce bout de code après la ligne 107
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 ImageIO.write(img, "png", "c:\\monimage"+NomImage+".png");
j'ai essayé ce bout de code mais une erreur s'affiche sur cette meme ligne. voici l'erreur:
(The method write(RenderedImage, String, ImageOutputStream) in the type ImageIO is not applicable for the arguments (Image, String, String)
Pardon,
Il faut convertir d'abord img de Image vers BufferedImage (rajoute cette méthode dans la classe)
et le 3ème argument doit être un fichier et non une chaine de caractère
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 private BufferedImage toBufferedImage(Image src) { int w = src.getWidth(null); int h = src.getHeight(null); int type = BufferedImage.TYPE_INT_RGB; // other options BufferedImage dest = new BufferedImage(w, h, type); Graphics2D g2 = dest.createGraphics(); g2.drawImage(src, 0, 0, null); g2.dispose(); return dest; }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 ImageIO.write(toBufferedImage(img), "png", new File("c:\\monimage"+NomImage+".png"));
merci d'avoir répondu, ouii j'ai remarqué que l'image n'était pas convertis en bufferImage, j'ai essayé mais j'ai toujours un problème d'affichage. de toute façon c'est rien je vais le régler. En ce moment je suis entrain de développer une application de détection de mouvement avec le flux optique. et je voudrais savoir si vous avez travaillez avec!!
Bonjr,
Mais les images ne seront pas enregistré dans le repertoire C:\
pourquoi!!!?
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager