簡體   English   中英

媒體基礎:使用 Direct3D 11 的自定義拓撲

[英]Media Foundation: Custom Topology with Direct3D 11

我必須手動構建視頻拓撲,其中包括使用加載和配置 mpeg2videoextension(解碼器)。 否則默認 topoloader 無法自動解析視頻 stream。 我正在使用默認拓撲加載器來解析拓撲的 rest。

由於我手動加載解碼器,文檔說我負責讓解碼器成為硬件加速管理器。 (此解碼器支持 D3D11)。 如果我創建一個 DXGI 設備,然后在代碼中創建管理器,我可以將管理器傳遞給解碼器,它似乎可以工作。

文檔還說,“在 Media Session 場景中,視頻渲染器創建 Direct3D 11 設備。”

如果是這種情況,我如何獲得該設備的句柄? 我假設我應該在設備管理器中使用該設備來傳遞給解碼器。

我在兜圈子。 所有示例代碼都使用 IDirect3DDeviceManager9。 我無法讓這些樣品發揮作用。 所以我決定使用 11。但是我找不到任何使用 11 的示例代碼。

有人可以指出我正確的方向嗎?

對於這一挑戰,微軟沒有給出好的解決方案。 事實上,Media Foundation 的標准視頻渲染器是 EVR,它僅“感知”Direct3D 9。 所以你不能將它與使用通用 DXGI 設備管理器的解碼器結合起來。 較新的 Microsoft 應用程序使用不同的 Direct3D 11 感知渲染器,該渲染器未發布為 API:您可以利用這些渲染服務作為包裝 API 的一部分,例如 UWP 或 Z6BFF62B10D884FB77428CFE168 媒體元素播放視頻。 MPEG-2 解碼器擴展主要針對這些掃描儀,如果您將其插入較舊的媒體基礎拓撲,則會給您帶來問題。

我可以想到一些解決這個問題的方法,但沒有一個聽起來完全完美:

  1. 停止使用 EVR 並改用DX11VideoRenderer :Microsoft 提供了此示例的起點,您可以自己建立所需的接線以共享 DXGI 設備管理器。

  2. 使用多個 Direct3D 設備並在兩者之間傳輸視頻幀; 應該有圖形 API 互操作來幫助以有效的方式傳輸,但總的來說,盡管可行,但截至 2020 年,這看起來是一種愚蠢的工作。 如果您可以接受通過系統 memory 傳輸帶來的性能損失,那么這條路徑看起來或多或少可以接受,這會使事情更容易實現。

  3. 停止使用 MPEG-2 解碼器擴展,並在較低級別的 DXVA2 API 之上實現您自己的解碼器,並在不回退到軟件的情況下實現硬件輔助解碼器,在這種情況下,您可以更好地控制使用 GPU 服務並適合渲染器的設備。

暫無
暫無

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

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