Domanda

Come parte di un programma devo essere in grado di tirare un paio di fotogrammi casuali da un file video specificato dall'utente. Non ho alcuna esperienza con la programmazione di elaborazione video, quindi questo è nuovo per me.

Ho deciso che ho bisogno di usare DirectShow.net per fare questo su Windows XP utilizzando .Net, ma non riesco a capire come farlo fare. Sto cercando di utilizzare l'interfaccia ISampleGrabber, ma non riesco a ottenere capito tutto e non riesco a trovare alcun esempio.

Ci sono pochissimi esempi di utilizzo DirectShow.net su internet, ma cornici sicuramente qualcuno ha tirato da un video utilizzando .net, quindi sto solo cercando di vedere se qualcuno sa di codice di esempio che fa questo o qualcosa di simile .

Cercando di seguire insieme a questo articolo progetto di codice che è venuta in mente questo codice:

// 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 parte che sogliono compilazione è la linea videoHeader cast e la linea GetCurrentBuffer alla fine perché non c'è variabile del buffer ... ma non sono sicuro di cosa fare per risolvere il problema.

È stato utile?

Soluzione

Provare a usare IMediaDet. Ecco un campione dal mio progetto;

Altri suggerimenti

Una migliore soluzione è quella di utilizzare il metodo IBasicVideo.GetCurrentImage. E 'più universale e funziona per la maggior parte di video.

Cambia che a:

VideoInfoHeader videoHeader = (VideoInfoHeader)Marshal.PtrToStructure(connectedMediaType.formatPtr, typeof(VideoInfoHeader));
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top