directshow - IMediaSample(DirectShow) 到 IDirect3DSurface9/IMFSample(MediaFoundation)

标签 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 并将其传递给渲染,这样我就不必担心颜色空间转换。

我对此很陌生。如果我错了,请纠正我。 谢谢

最佳答案

您从 DirectShow 中的上游解码器获得的

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

您遇到的问题是您希望缓冲区格式(媒体类型)匹配,以便您可以复制而无需转换。其中一种方法(可能有几种)是首先建立 MF 管道,并找出视频硬件上的缓冲区为您提供的确切像素类型。然后,通过使用相应的采集器初始化或色彩空间转换过滤器,或通过色彩空间转换 DMO/,确保 DirectShow 管道中具有此像素格式和媒体类型MFT.

关于directshow - IMediaSample(DirectShow) 到 IDirect3DSurface9/IMFSample(MediaFoundation),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9161213/

相关文章:

c++ - direct3d 中奇怪的照明效果切换黑暗和光明

c++ - DirectX 等效于 glBlendFunc(…………)

c++ - 在 .NET Web 应用程序中重用 C++/CLI 用户控件

c++ - 将相机旋转到模型的中心

directshow - 编写直接显示源过滤器

c++ - 如何从 IMFMediaSource 获取 Pin 图类别

audio - 我听到点击带有使用Graph Edit创建的DirectShow图的音频,但PC上的播放器软件可以流畅地播放音频

c++ - 位图数据乱码显示

c++ - 使用 DirectXMath 获取两点之间距离的最佳方法是什么

具有 16 位颜色深度的 C++ Direct3D9 GetFrontBufferData