首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用DirectShow.net获取视频帧?

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

Stack Overflow用户
提问于 2010-01-07 00:28:40
回答 2查看 11.8K关注 0票数 2

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

我已经决定,在使用.Net的Windows XP上,我需要使用DirectShow.net来完成此操作,但我不知道如何完成此操作。我正在尝试使用ISampleGrabber接口,但我无法将其全部弄清楚,也找不到任何示例。

在互联网上使用DirectShow.net的例子很少,但肯定有人使用.net从视频中提取帧,所以我只是想看看是否有人知道做这件事的示例代码或类似的东西。

为了继续阅读这篇代码项目文章,我想出了以下代码:

代码语言:javascript
复制
// 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行,因为没有缓冲区变量...但我不知道该怎么做才能修复它。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-01-08 08:57:54

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

票数 1
EN

Stack Overflow用户

发布于 2010-02-01 23:34:26

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2014426

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档