获得从MPEG-2节目/传输流的位图信息?(Get bitmap info from MPEG-2

2019-07-17 19:11发布

为了使我的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。

Answer 1:

如果你想有一个位图,你需要一个接收未压缩的视频在某处放置样品采集。 当samplegrabber是MPEG-2节目流针的背后,您将收到的MPEG2节目流。 当然,有可能得到一个位图出来的那个,但你需要解复用和手动解压缩。 这两者都是要在DirectShow过滤器来执行任务。

但是,即使你收到未压缩的视频,你可能仍然得到不同的格式。 取决于解码器可以收到RGB24,YUY2,YV12,...检查MediaSubType什么你到底收到。 如果你总是希望得到RGB24,您可以使用包含在SDK中的RGBFilters / TransNull24过滤器。 另见这个答案 。

编辑 :另外也请注意,如果你既想解决,也是位图本身,你必须把解码器和渲染器之间的samplegrabber。 如果MS解码器不能正常工作,尝试ffdshow的 。



文章来源: Get bitmap info from MPEG-2 Program / Transport Stream?