2

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

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

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

4

1 回答 1

4

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

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

于 2012-02-07T07:36:23.817 回答