Media Foundation有很多例子,并提供硬件加速解码。Media Foundation是DirectX的包装器还是在做其他事情?
如果不是,与DX 12方法相比,Media Foundation等效方法会少多少优化?
从根本上讲,Media Foundation和DirectX 12视频解码之间的主要区别是什么?
我已经在我的引擎中使用了DirectX 12,所以这个问题是与DX12相关的。
提前感谢你的回答。
硬件视频解码来自DXVA(DXVA2)API。它的DirectX 11演化是D3D11 Video Device,是D3D11 API的一部分。Microsoft提供了在Media Foundation API原语格式中对硬件加速解码器的包装,例如H.264视频解码器。此解码器提供使用硬件解码能力以及回退到软件解码场景。
请注意,即使Media Foundation可用于UWP开发,您的选项也受到限制,不会直接提供像上述变换这样的原语。但是,如果您使用更高级别的API(尤其是Media Foundation 源阅读器API),则可以利用硬件加速的视频解码在您的UWP应用程序中。
Media Foundation实现提供与Direct3D 11的互操作性,特别是视频编解码方面,但不支持Direct3D 12。您将无法直接将Media Foundation和DirectX 12一起使用。您将需要实现Direct3D 11/12互操作性以在API之间传输数据(或者,在适用的情况下,使用共享访问相同GPU数据)。
或者,您可以转向底层ID3D12VideoDevice :: CreateVideoDecoder
,它是上述DXVA2和Direct3D 11视频解码API的进一步演化,用法类似。
不幸的是,Media Foundation以文档质量差和难以开始开发而闻名,而直接使用D3D 12视频解码则没有任何信息,您将感受到先驱的感觉。
无论哪种方式,所有提到的都是相对较薄的硬件辅助视频解码实现的包装,性能相同。我建议走Media Foundation路线,并在必要时实现11/12互操作性。
MF_SA_D3D12_AWARE
开始,类似于MF_SA_D3D11_AWARE
。我们目前还没有看到它。 - Roman R.如果你将D3D12设备传递给IMFDXGIDeviceManager :: ResetDevice,可能会因Media Foundation而导致许多D3D12错误。
如果您缓慢调用IMFSourceReader :: ReadSample,则可以避免这些错误。使用此方法采用同步或异步模式都没有关系。而且,调用速度应根据运行程序的计算机而定。我在从网络播放流时的同步模式下,在ReadSample调用之间使用:: Sleep(1),在我的机器上播放本地mp4文件的同步模式下使用:: Sleep(3)。
不要问我是谁。我的名字是“先锋”。