如何使用DirectShow.net获取视频帧?

时间:2010-01-06 16:28:40

标签: .net-3.5 directshow video-processing directshow.net

作为程序的一部分,我必须能够从用户指定的视频文件中提取一些随机帧。我对视频处理编程没有任何经验,所以这对我来说是新的。

我已经确定我需要使用DirectShow.net在Windows XP上使用.Net执行此操作,但我无法弄清楚如何完成它。我正在尝试使用ISampleGrabber接口,但我无法弄明白,也无法找到任何示例。

在互联网上使用DirectShow.net的例子非常少,但肯定有人使用.net从视频中删除了帧,所以我只是想知道是否有人知道这样做的示例代码或关闭的东西

尝试按照这个代码项目文章我已经提出了这个代码:

// 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);

不会编译的部分是videoHeader强制转换线和最后的GetCurrentBuffer行,因为没有缓冲变量...但我不知道该怎么做才能修复它。

3 个答案:

答案 0 :(得分:1)

尝试使用IMediaDet。我的项目Here is a sample;

答案 1 :(得分:1)

更好的解决方案是使用IBasicVideo.GetCurrentImage方法。它更具普遍性,适用于大多数视频。

答案 2 :(得分:1)

将其更改为:

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