【发布时间】: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 值?
任何帮助将不胜感激!谢谢。
【问题讨论】:
-
@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 纹理。
标签: directx directx-11 ms-media-foundation hardware-acceleration dxva