如何从 H.264 NV12 IMFSample 输出渲染到 DirectX11 纹理?
Posted
技术标签:
【中文标题】如何从 H.264 NV12 IMFSample 输出渲染到 DirectX11 纹理?【英文标题】:How to render to a DirectX11 texture from H.264 NV12 IMFSample output? 【发布时间】:2018-05-18 00:08:05 【问题描述】:有没有什么好的例子可以展示如何渲染来自 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 的示例,但没有找到如何从样本创建纹理的示例,这似乎更有用。如果我可以创建 NV12 纹理,如何找出 NV12 的 D3D11_SUBRESOURCE_DATA
结构中的 SysMemPitch
和 SysMemSlicePitch
值?
任何帮助将不胜感激!谢谢。
【问题讨论】:
social.msdn.microsoft.com/Forums/sqlserver/en-US/… @VuVirt 这很有趣,感谢您的链接。如果我先使用Color Converter DSP MFT 从 NV12 转换为 RGB32 会怎样。那么渲染那个 IMFSample 会更容易吗?我相信 MFT 也是硬件加速的,因此它也可能比您链接到的代码示例中显示的转换更快。 颜色转换器不使用硬件加速,它不会为您生成 dxgi 样本。您可能会尝试使用高级 viseo 处理器,但它可能需要在其输入上已经有 dxgi 表面。最好自己创建 dxgi 示例,如链接所示。 @VuVirt 谢谢,这对我来说很有意义。原谅我,我不是 DirectX 专家,但链接中的示例似乎缺少一些重要部分。有没有其他例子可以说明这一切是如何结合在一起的?我猜链接代码中的memcpy
和D3D11_MAPPED_SUBRESOURCE
替换了我在DX11VideoRenderer 示例中看到的CreateVideoProcessorInputView
、CreateVideoProcessorOutputView
和VideoProcessorBlt
?
CreateVideoProcessorInputView 也需要 DX 纹理。
【参考方案1】:
我找到了一个将 NV12 样本呈现到屏幕上的完整示例。尽管在渲染自己的示例图像时存在一些简单的步幅计算错误,但实际渲染代码确实可以正常工作。它似乎是一个旧的 Microsoft 示例,我找不到任何其他信息。
D3D11NV12Rendering
【讨论】:
非常感谢您分享您的发现,但最好在这里描述那些“简单的步幅计算错误”,而不是仅仅提及它们的存在以上是关于如何从 H.264 NV12 IMFSample 输出渲染到 DirectX11 纹理?的主要内容,如果未能解决你的问题,请参考以下文章