如何从 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 结构中的 SysMemPitchSysMemSlicePitch 值?

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

【问题讨论】:

social.msdn.microsoft.com/Forums/sqlserver/en-US/… @VuVirt 这很有趣,感谢您的链接。如果我先使用Color Converter DSP MFT 从 NV12 转换为 RGB32 会怎样。那么渲染那个 IMFSample 会更容易吗?我相信 MFT 也是硬件加速的,因此它也可能比您链接到的代码示例中显示的转换更快。 颜色转换器不使用硬件加速,它不会为您生成 dxgi 样本。您可能会尝试使用高级 viseo 处理器,但它可能需要在其输入上已经有 dxgi 表面。最好自己创建 dxgi 示例,如链接所示。 @VuVirt 谢谢,这对我来说很有意义。原谅我,我不是 DirectX 专家,但链接中的示例似乎缺少一些重要部分。有没有其他例子可以说明这一切是如何结合在一起的?我猜链接代码中的memcpyD3D11_MAPPED_SUBRESOURCE 替换了我在DX11VideoRenderer 示例中看到的CreateVideoProcessorInputViewCreateVideoProcessorOutputViewVideoProcessorBlt CreateVideoProcessorInputView 也需要 DX 纹理。 【参考方案1】:

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

D3D11NV12Rendering

【讨论】:

非常感谢您分享您的发现,但最好在这里描述那些“简单的步幅计算错误”,而不是仅仅提及它们的存在

以上是关于如何从 H.264 NV12 IMFSample 输出渲染到 DirectX11 纹理?的主要内容,如果未能解决你的问题,请参考以下文章

C++ 中的 NV12 到 RGB24 转换代码

处理来自 IMFSourceReader 和 IMFSample 的图像数据

arm5718下的h264编码解码测试

arm5718下的h264编码解码测试

arm5718下的h264编码解码测试

X264使用流程文述