如何从 H.264 NV12 IMFSample 输出渲染到 DirectX11 纹理?

How to render to a DirectX11 texture from H.264 NV12 IMFSample output?

是否有任何很好的示例说明如何呈现 H.264 解码器的 IMFSample 输出?我的场景使用 4K 分辨率的 H.264 流,而我的目标 PC 将仅接受使用 DXGI 缓冲区的 1080p。但是 H.264 解码器将处理 4K,所以我需要找到一种方法将 NV12 IMFSample 直接提供给 DirectX 11 渲染器。我已经尝试使用 DX11VideoRenderer 示例,但由于这个特定的 IMFSample 没有 IMFDXGIBuffer 接口而失败。

看起来 DX11VideoRenderer 输入 IMFDXGIBuffer 是 NV12 类型,可以在硬件中成功渲染。因此,NV12 类型的非 DXGI 缓冲区也应该是可以接受的,这似乎合乎逻辑?

也许我需要创建 NV12 类型的 ID3D11Texture2D 纹理或资源?我找到了有关如何 create a texture from a file 的示例,但 none 有关如何从样本创建纹理的示例,这似乎更有用。如果我可以创建 NV12 纹理,如何计算 NV12 的 D3D11_SUBRESOURCE_DATA 结构中的 SysMemPitchSysMemSlicePitch 值?

任何帮助将不胜感激!谢谢。

我找到了一个将 NV12 示例渲染到屏幕的完整示例。尽管它在如何呈现自己的示例图像方面存在一些简单的步幅计算错误,但实际的呈现代码确实可以正常工作。它似乎是一个旧的 Microsoft 示例,我找不到任何其他相关信息。

D3D11NV12Rendering