【问题标题】:How to get video frame using DirectShow.net?如何使用 DirectShow.net 获取视频帧?
【发布时间】:2010-01-06 16:28:40
【问题描述】:

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

我已经确定我需要使用 DirectShow.net 在使用 .Net 的 Windows XP 上执行此操作,但我不知道如何完成它。我正在尝试使用 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 cast 行和最后的 GetCurrentBuffer 行,因为没有缓冲区变量...但我不确定如何修复它。

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 这就是我最终使用的,只是还没来得及把它发回到这里。不过感谢您的回答。
    • IMediaDet 有一个大问题 - 它不支持 VIDEOINFOHEADER2 格式的视频。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      将其更改为:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-23
        • 2022-01-06
        • 2023-03-12
        • 2014-06-12
        相关资源
        最近更新 更多