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

如何从H.264 NV12 IMFSample输出渲染到DirectX11纹理?,directx,directx-11,ms-media-foundation,hardware-acceleration,dxva,Directx,Directx 11,Ms Media Foundation,Hardware Acceleration,Dxva,有没有什么好的例子可以展示如何呈现H.264解码器的IMFSample输出?我的场景使用4K分辨率的H.264流,我的目标PC将只接受使用DXGI缓冲区的1080p。但是H.264解码器将处理4K,因此我需要找到一种方法,将NV12 IMFSample直接提供给DirectX 11渲染器。我已经尝试过使用这个示例,但由于这个特定的IMFSample没有IMFDXGIBuffer接口,它失败了 在DX11VideoRenderer中,输入IMFDXGIBuffer是NV12类型,可以在硬件中成功渲

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

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

也许我需要用NV12类型创建ID3D11Texture2D纹理或资源?我找到了一些关于如何创建纹理的示例,但没有一个是关于如何从样本创建纹理的,这似乎更有用。如果我可以创建一个NV12纹理,那么如何计算NV12的D3D11_子资源_数据结构中的SysMemPitch和SysMemSlicePitch值呢


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

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


@很有趣,谢谢你的链接。如果我先使用将NV12转换为RGB32会怎么样。那么,渲染该imf示例会更容易吗?我相信MFT也是硬件加速的,所以它可能比链接到的代码示例中显示的转换更快。颜色转换器不使用硬件加速,因为它不会为您生成dxgi示例。您可以尝试使用advanced viseo处理器,但它的输入端可能已经需要一个dxgi曲面。最好自己创建dxgi示例,如链接所示。@VuVirt谢谢,这对我来说很有意义。请原谅,我不是DirectX专家,但链接中的示例似乎缺少一些重要部分。有没有其他例子可以说明这一切是如何结合在一起的?我猜链接代码中带有D3D11_MAPPED_子资源的memcpy会取代我在DX11VideoRenderer示例中看到的CreateVideoProcessorInputView、CreateVideoProcessorOutView和VideoProcessorBlt?CreateVideoProcessorInputView也需要DX纹理。非常感谢分享您的发现,但是,在这里描述这些简单的步幅计算错误,而不是仅仅提到它们的存在,这将是非常棒的