为了在我的 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
我不允许将抓取器放在解码器和渲染器之间。关于 demux 的视频引脚:
Major Type: Video
Sub Type: MPEG2_VIDEO
Format: MPEG2Video
连接采样采集器后,它的输入引脚也具有上述媒体类型。当我在我的应用程序中打开这个图形文件并使用grabber.GetConnectedMediaType();
时,我也得到了相同的媒体类型。但是,这种媒体类型的formatPtr
或(pbFormat
在 C++ 中)为 0。