[DirectShow - Java] Est-ce que c'est possible ? - Ou alors je suis en plein délire

Salut salut,

je cherche depuis pas mal de temps à créer un programme qui travaille sur des videos. Les algo de traitement sont faits mais :

  • j’aimerais trouver un activeX ou une classe qui permette de capturer l’image d’une video
  • pouvoir travailler sur n’importe quelle video (si les filtres DS sint installés sur la mchine)

Vu que je suis en plein monde java, autant chercher dans cette voie.

Je sais qu’il existe des composants pour Dephi mais je ne connais pas du tout.

Voilà, à votre bon coeur msieur, dames :o

Tout se trouve dans le JMF 2.0 :

1 - javax.media.control (ou JARVideo),
2 - A part le JNI, je ne vois pas.

Edit : grilled :slight_smile:

merci pour vos réponses :jap:

je profite un peu … :paf:

qqn serait-il comment ça marche GetCurrentImage de IBasicVideo avec C# ?! :smiley:

D’apres ce que j’ai compris sur la MSDN, tu doit faire un premier appel à GetCurrentImage avec 0 pour le deuxième paramettre, ca te permettra de connaitre la taille du buffer à allouer lors du second appel.

bon hmm après 3h j’ai pu le faire marcher grrr
c’est vraiment un truc de fou :confused:


int bfr, sz;
int[] img;
int x, y, pp=10;
int rr, gg, bb;
Color col;
Bitmap bmp = new Bitmap(_BasicVideo.VideoWidth, _BasicVideo.VideoHeight);

sz = _BasicVideo.VideoHeight * _BasicVideo.VideoWidth + 10;
bfr = sz * 4;
img = new int[sz];
_BasicVideo.GetCurrentImage(ref bfr, out img[0]);

for (y=0; y<_BasicVideo.VideoHeight; y++)
{
	for (x=0; x<_BasicVideo.VideoWidth; x++)
	{
  bb = img[pp] & 255;
  gg = (img[pp] / 256) & 255;
  rr = (img[pp] / 65536) & 255;
  col = Color.FromArgb(rr, gg, bb);
  bmp.SetPixel(x, _BasicVideo.VideoHeight-y-1, col);
  pp++;
	}
}
bmp.Save("c:\\test.png");

hmm KarLKoX, c’est possible de simplifier ?! ^^

arf je vais essayer ça… :paf:
edit :
ça marche pas avec c#…

Ouhla, une boucle hyper longue et l’appel à SetPixel, ça doit être achement lent :ane:
Utilise plutôt SetDIBits.

Bon euh … je vais modifier ton code C# en C paske je code pas en C# :

[cpp]
int bfr, sz;
int[] img;
int x, y, pp=10;
int rr, gg, bb;
Color col;

// ici bfr contiendra la taille du buffer à allouer
_BasicVideo.GetCurrentImage(ref bfr, 0);
// alloue ici un buffer de la taille bfr (unsigned char *)
// Bitmap bmp = new Bitmap(_BasicVideo.VideoWidth, _BasicVideo.VideoHeight);
unsignec char * buffer = malloc(bfr);
if (buffer == 0)
return -1;

sz = _BasicVideo.VideoHeight * _BasicVideo.VideoWidth + 10;
bfr = sz * 4;
img = new int[sz];
_BasicVideo.GetCurrentImage(ref bfr, out buffer);
// je sais pas comment on gere les params en C#
SetDIBits()

bmp.Save("c:\\test.png");
[/cpp]

Mercii :jap:

effectivement, avec SetDIBits c’est bcp plus propre ;p

:super: (désolé pour le massacre plus haut :whistle: )

oan.
J’ai aussi besoin de savoir comment faire pour capturer une image d’une vidéo mais j’avoue que hors c# en managé j’ai du mal.
Est ce que quelqu’un peut m’expliquer comment faire? même en prenant la version de copie pixel par pixel je n’ai rien a la fin, sinon une image toute noire. J’ai l’impression de ne rien récupérer en sortie de mon appel à getcurrentimage(). :frowning:
Comment le vérifier?
(Je sais que ce sujet date mais comme il correspond pile à ce que je cherche…)