为了使我的WPF应用程序一个DirectShow图形,我用一个样本采集写一个位图到内存中,并在代码的其他地方阅读。 这似乎是一个奇怪的解决方案,但似乎是得到一个WPF刷出它的唯一途径。
下面的代码给了我,我需要对位图的信息:
AMMediaType mt = grabber.GetConnectedMediaType();
VideoInfoHeader header = (VideoInfoHeader)Marshal.PtrToStructure(mt.formatPtr, typeof VideoInfoHeader);
header.BmiHeader // ...
现在, header.BmiHeader
是类型的BITMAPINFOHEADER和提供诸如位图的宽度和高度 。 我需要这些信息来写位图到内存中。
然而,这段代码似乎并不总是工作。 例如,当样品采集滤波器被连接到一个MPEG-2节目流销, header
将是null
。 为什么我的代码不能与某些媒体类型的工作,并在那里得到它的BITMAPINFOHEADER结构有什么其他的方法是?
请注意,即使我现在用的是directshow.net库,在C ++的答案也欢迎。
编辑 :这是我的图表看起来像:
*source* -> MPEG2-Demultiplexer -> SampleGrabber -> MS DTV-DVD Video Decoder -> Video Renderer
我不能放置解码器和渲染器之间的采集。 关于解复用的视频引脚:
Major Type: Video
Sub Type: MPEG2_VIDEO
Format: MPEG2Video
我已连接所述样品采集后,它的输入引脚也具有上述的介质类型。 当我在我的应用程序中打开该图形文件并使用grabber.GetConnectedMediaType();
,我也得到了相同的介质类型。 然而, formatPtr
或( pbFormat
该媒体类型的在C ++中)为0。