我想使用DirectX 12将H264文件的每一帧加载到纹理中并渲染它。然而,关于这样做的信息很少,而且Microsoft网站只有有限的表面文档。
Media Foundation提供了大量的示例,并提供了硬件支持的解码。媒体基金会是对DirectX的包装,还是在做别的事情?
如果不是,与DX 12方法相比,Media Foundation等效项的优化程度会有多低?
从本质上讲,媒体基础和DirectX12视频解码的最大区别是什么?
我已经在我的引擎中使用了DirectX 12,所以这是专门针对DX12的。
提前谢谢。
发布于 2020-11-11 17:40:10
硬件视频解码来自DXVA (DXVA2)接口。它的DirectX 11演进是D3D11视频设备的D3D11应用编程接口的一部分。微软以媒体基础API原语的格式在硬件加速解码器上提供了包装器。此解码器提供硬件解码功能的使用,以及回退到软件解码方案。
请注意,即使Media Foundation可用于UWP开发,您的选择也是有限的,并且不能直接为您提供像前面提到的transform这样的原语。但是,如果您使用更高级别的API(特别是Media Foundation ),则可以在Source Reader API应用程序中利用硬件加速的视频解码。
Media Foundation实现提供与Direct3D 11的互操作性,特别是在视频编码/解码部分,但不能与Direct3D 12互操作。您将无法开箱即用Media Foundation和DirectX 12。您必须实现GPU11/12互操作来在API之间传输数据(或者,在适用的情况下,使用对相同Direct3D数据的共享访问)。
或者,你将不得不转向底层ID3D12VideoDevice::CreateVideoDecoder
,这是前面提到的DXVA2和Direct3D 11视频解码API的进一步发展,具有类似的用法。
不幸的是,如果媒体基金会以糟糕的文档和难以启动的开发而臭名昭著,那么Direct3D 12视频解码没有任何信息,您将不得不享受先驱的感觉。
无论哪种方式,所有提到的都是硬件辅助视频解码实现的相对较薄的包装器,具有相同的出色性能。我建议采用媒体基础路径,并在必要时实现11/12互操作。
发布于 2020-12-08 22:24:11
如果你将一个D3D12设备传递给IMFDXGIDeviceManager::ResetDevice,你会得到很多由媒体基础引起的D3D12错误。
如果你慢慢地调用IMFSourceReader::ReadSample,这些错误是可以避免的。使用此方法时,采用同步模式还是异步模式都无关紧要。而且,它应该有多慢取决于运行程序的机器。我在ReadSample调用之间使用::Sleep(1)用于同步模式播放来自网络的流,而::Sleep(3)用于同步模式播放我机器上的本地mp4文件。
别问我是谁。我的名字是“先驱者”。
https://stackoverflow.com/questions/64773552
复制相似问题