2010-01-06 5 views
2

Dans le cadre d'un programme, je dois être en mesure de tirer quelques images aléatoires d'un fichier vidéo spécifié par l'utilisateur. Je n'ai aucune expérience avec la programmation de traitement vidéo, donc c'est nouveau pour moi.Comment obtenir une image vidéo en utilisant DirectShow.net?

J'ai déterminé que je devais utiliser DirectShow.net pour faire cela sur Windows XP en utilisant .Net, mais je n'arrive pas à comprendre comment le faire. J'essaie d'utiliser l'interface ISampleGrabber mais je n'arrive pas à tout comprendre et je ne trouve aucun exemple. Il y a très peu d'exemples d'utilisation de DirectShow.net sur internet, mais sûrement quelqu'un a tiré des images d'une vidéo en utilisant .net, donc je cherche juste à voir si quelqu'un connaît un exemple de code qui fait ça ou quelque chose Fermer.

Essayer de suivre cet article du projet de code que je suis venu avec ce code:

// step 1 
IGraphBuilder graphBuilder = (IGraphBuilder)new FilterGraph(); 

// step 2 
IBaseFilter grabberBaseFilter; 
ISampleGrabber sampleGrabber; 
AMMediaType mt; 
grabberBaseFilter = (IBaseFilter)new SampleGrabber(); 
sampleGrabber = (ISampleGrabber)grabberBaseFilter; 
graphBuilder.AddFilter(grabberBaseFilter, "Grabber"); 

// step 3 

mt = new AMMediaType(); 
mt.majorType = MediaType.Video; 
mt.subType = MediaSubType.RGB24; 
mt.formatType = FormatType.VideoInfo; 
sampleGrabber.SetMediaType(mt); 
graphBuilder.RenderFile(filename, null); 

IMediaControl mediaControl = (IMediaControl)graphBuilder; 
IMediaEvent mediaEventEx = (IMediaEvent)graphBuilder; 

sampleGrabber.SetBufferSamples(true); 
sampleGrabber.SetOneShot(true); 

// step 4 

mediaControl.Run(); 

EventCode evCode; 
mediaEventEx.WaitForCompletion(int.MaxValue, out evCode); 

AMMediaType connectedMediaType = new AMMediaType(); 
sampleGrabber.GetConnectedMediaType(connectedMediaType); 

VideoInfoHeader videoHeader = (VideoInfoHeader)connectedMediaType.formatType; 

BitmapInfo bitmapInfo = new BitmapInfo(); 
bitmapInfo.bmiHeader = videoHeader.BmiHeader; 

// ::CreateDIBSection(0, &BitmapInfo, DIB_RGB_COLORS, &buffer, NULL, 0); 
// legacy - GdiFlush(); 

// Copy the image into the buffer. 
int size = 0; 
sampleGrabber.GetCurrentBuffer(ref size, buffer); 

La partie qui compilent l'habitude est la ligne de coulée videoHeader et la ligne GetCurrentBuffer à la fin, car il n'y a tampon variable ... mais je ne sais pas quoi faire pour le réparer.

Répondre

1

Essayez d'utiliser IMediaDet. Here is a sample de mon projet;

+0

C'est ce que je fini par utiliser, juste n'a pas eu l'occasion de le poster de nouveau ici. Merci pour la réponse si. –

+2

IMediaDet a un énorme problème - il ne supporte pas les vidéos avec le format VIDEOINFOHEADER2. – Yurec

1

Une meilleure solution consiste à utiliser la méthode IBasicVideo.GetCurrentImage. Il est plus universel et fonctionnera pour la plupart des vidéos.

1

changement qui à:

 
VideoInfoHeader videoHeader = (VideoInfoHeader)Marshal.PtrToStructure(connectedMediaType.formatPtr, typeof(VideoInfoHeader)); 
Questions connexes