IMediaSample(DirectShow)到IDirect3DSurface9 / IMFSample(MediaFoundation)

时间:2012-02-06 13:59:47

标签: directshow direct3d direct3d9 ms-media-foundation

我正在制作自定义视频播放器。我在我的架构中使用了DirectShow / Media Foundation。基本上,我使用DS来获取VOB帧(不受MF支持)。我可以从DirectShow获取样本,但我坚持将它传递给渲染器。在MF中,我得到一个Direct3DSurface9(来自IMFSample),并使用IDirect3D9Device将它呈现在后备缓冲区上。

使用DirectShow,我将IMediaSample作为我的数据缓冲区对象。我不知道如何转换并将其作为IMFSample传递。我发现其他人从示例中获取位图信息并使用GDI +进行渲染。但我的视频数据可能并不总是有RGB数据。我希望从IMediaSample获取IDirect3DSurface9或IMFSample,并将其传递给渲染,我不必为色彩空间转换而烦恼。

我是新手。如果我出错了,请纠正我。 感谢

1 个答案:

答案 0 :(得分:4)

来自IMediaSample的上游解码器的

DirectShow只不过是内存支持缓冲区的包装器。它背后没有也不可能有任何D3D表面(除非你自己处理它并提供自定义分配器,在这种情况下你首先不会有问题)。因此,您要将数据从此缓冲区内存复制到MF样本缓冲区。

在那里,您会遇到一个问题,即您希望缓冲区格式(媒体类型)匹配,以便您可以在不进行转换的情况下进行复制。其中一种方法 - 也许可能有一些 - 是首先建立MF管道,并找出视频硬件上缓冲区提供的确切像素类型。然后确保在DirectShow管道中使用此像素格式和媒体类型,方法是使用相应的抓取器初始化或颜色空间转换过滤器,或通过颜色空间转换DMO / MFT