UWP 硬件视频解码 - DirectX12 与媒体基础

UWP Hardware Video Decoding - DirectX12 vs Media Foundation

我想使用 DirectX 12 将 H264 文件的每一帧加载到纹理中并进行渲染。然而,关于执行此操作的信息很少甚至没有,并且 Microsoft 网站的表面文档有限。

Media Foundation 有大量示例并提供硬件启用解码。 Media Foundation 是 DirectX 的包装器还是在做其他事情?

如果不是,与 DX 12 方法相比,Media Foundation 的优化程度会低多少?

从本质上讲,Media Foundation 和 DirectX12 视频解码之间的最大区别是什么?

我已经在我的引擎中使用 DirectX 12,所以这是专门针对 DX12 的。

提前致谢。

硬件视频解码来自DXVA (DXVA2) API。它的 DirectX 11 演变是 D3D11 API 的 D3D11 Video Device 部分。 Microsoft 以 Media Foundation API 原语的格式提供硬件加速解码器的包装器,例如 H.264 Video Decoder。此解码器提供使用硬件解码功能以及回退到软件解码方案。

请注意,即使 Media Foundation 可用于 UWP 开发,您的选择也是有限的,并且不会直接向您提供上述转换等原语。但是,如果您使用更高级别的 APIs(尤其是媒体基础 Source Reader API),您可以在 UWP 应用程序中利用硬件加速视频解码。

Media Foundation 实现提供与 Direct3D 11 的互操作性,特别是在视频 encoding/decoding 部分,但不提供 Direct3D 12。您将无法开箱即用地同时使用 Media Foundation 和 DirectX 12。您将必须实施 Direct3D 11/12 互操作以在 API 之间传输数据(或者,在适用的情况下,使用对相同 GPU 数据的共享访问)。

或者您将不得不降级到底层 ID3D12VideoDevice::CreateVideoDecoder,这是上述 DXVA2 和 Direct3D 11 视频解码 API 的进一步发展,具有相似的用法。

不幸的是,如果 Media Foundation 以糟糕的文档和难以开始的开发而著称,那么 Direct3D 12 视频解码的信息为零,您将不得不享受先锋的感觉。

无论哪种方式,所有提到的都是相对较薄的硬件辅助视频解码实现包装器,具有同样出色的性能。我建议采用 Media Foundation 路径并实施 11/12 互操作 if/when 这是必要的。

如果您将 D3D12 设备传递给 IMFDXGIDeviceManager::ResetDevice,您将遇到很多由媒体基础引起的 D3D12 错误。

如果你慢慢调用IMFSourceReader::ReadSample,这些错误是可以避免的。使用此方法无论采用同步还是异步模式都没有关系。而且,它应该有多慢取决于运行该程序的机器。我在 ReadSample 调用之间使用 ::Sleep(1) 以同步模式从网络播放流,并使用 ::Sleep(3) 以同步模式在我的机器上播放本地 mp4 文件。

别问我是谁。我叫 'the pioneer'.