簡體   English   中英

UWP 硬件視頻解碼 - DirectX12 vs Media Foundation

[英]UWP Hardware Video Decoding - DirectX12 vs Media Foundation

我想使用 DirectX 12 將 H264 文件的每一幀加載到紋理中並進行渲染。 然而,關於這樣做的信息很少甚至沒有,而且微軟網站的表面文檔也很有限。

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 開發,但您的選擇是有限的,並且不會直接向您提供像提到的轉換這樣的原語。 但是,如果您使用更高級別的 API(尤其是 Media Foundation Source Reader 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 以糟糕的文檔和難以啟動的開發而聞名,那么 Direct3D 12 視頻解碼的信息為零,您將不得不享受先鋒的感覺。

無論哪種方式,所有提到的都是相對於硬件輔助視頻解碼實現的相對較薄的包裝,具有相同的出色性能。 如果/在必要時,我建議采用 Media Foundation 路徑並實施 11/12 互操作。

如果你將 D3D12 設備傳遞給 IMFDXGIDeviceManager::ResetDevice,你會得到很多由 Media Foundation 引起的 D3D12 錯誤。

如果您緩慢地調用 IMFSourceReader::ReadSample,則可以避免這些錯誤。 您采用同步或異步模式來使用此方法都沒有關系。 而且,它應該有多慢取決於運行程序的機器。 我在 ReadSample 調用之間使用 ::Sleep(1) 以同步模式播放來自網絡的流,而 ::Sleep(3) 用於同步模式在我的機器上播放本地 mp4 文件。

不要問我是誰。 我的名字是'先驅'。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM