UWP硬件视频解码-DirectX12与Media Foundation

问题描述

我想使用DirectX 12将H264文件的每一帧加载到纹理中并进行渲染。但是,执行此操作的信息很少甚至没有,并且Microsoft网站的肤浅文档数量有限。

Media Foundation有很多示例,并提供了“硬件启用”解码。媒体基金会是DirectX的包装器还是在做其他事情?

如果没有,与DX 12方法相比,Media Foundation的优化程度要低多少?

本质上,Media Foundation和DirectX12视频解码之间有什么大区别?

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

谢谢。

解决方法

硬件视频解码来自DXVA(DXVA2)API。 DirectX 11的演变是D3D11 API的D3D11视频设备的一部分。 Microsoft以Media Foundation API原语(例如H.264 Video Decoder)的格式提供了对硬件加速解码器的包装。该解码器提供了硬件解码功能的使用以及软件解码方案的后备功能。

请注意,即使可以使用Media Foundation进行UWP开发,您的选择也受到限制,并且无法直接提供像提到的transform这样的原语。但是,如果您使用更高级别的API(尤其是Media Foundation Source Reader API),则可以在UWP应用程序中利用硬件加速的视频解码。

Media Foundation实施提供了与Direct3D 11的互操作性,尤其是在视频编码/解码方面,但不是Direct3D12。您将不能立即使用Media Foundation和DirectX 12。您将必须实现Direct3D 11/12互操作以在API之间传输数据(或在适用时使用对同一GPU数据的共享访问)。

或者,您将不得不进入基础ID3D12VideoDevice::CreateVideoDecoder,这是上述DXVA2和Direct3D 11视频解码API的相似用法的进一步发展。

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

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

,

如果将D3D12设备传递给IMFDXGIDeviceManager :: ResetDevice,您会遇到很多由Media Foundation引起的D3D12错误。

如果缓慢调用IMFSourceReader :: ReadSample,则可以避免错误。您可以采用同步或异步模式来使用此方法。并且,其运行速度取决于运行该程序的计算机。在ReadSample调用之间使用:: Sleep(1)进行同步模式以播放来自网络的流,而在同步模式下使用:: Sleep(3)进行同步模式以在计算机上播放本地mp4文件。

不要问我是谁。我叫“先锋”。