windows 媒体基金会:使用Direct3D 11自定义拓扑

s4chpxco  于 2023-03-19  发布在  Windows
关注(0)|答案(2)|浏览(132)

我必须手动建立一个视频拓扑,包括使用加载和配置mpeg2videoextension(解码器)。否则默认的拓扑加载器无法自动解析视频流。我使用默认的拓扑加载器解析其余的拓扑。
由于我是手动加载解码器,文档说我负责让解码器硬件加速管理器。(这个解码器是D3D11感知的)。如果我创建一个DXGI设备,然后在代码中创建管理器,我可以将管理器传递给解码器,它似乎工作。
然而,文档还说,“在媒体会话场景中,视频渲染器创建Direct3D 11设备。”
如果是这样的话,我如何获得那个设备的句柄呢?我假设我应该在设备管理器中使用那个设备来传递到解码器。
我在绕圈子。所有的示例代码都使用IDirect3DDeviceManager9。我无法使这些示例工作。所以我决定使用11。但是我找不到任何使用11的示例代码。
有人能给我指一下正确的方向吗?

dwbf0jvd

dwbf0jvd1#

微软并没有给予一个很好的解决方案来应对这个挑战。事实上,Media Foundation的标准视频渲染器是EVR,它只“感知”Direct 3D 9。所以你不能使用通用的DXGI设备管理器将它与解码器结合起来。较新的微软应用程序使用不同的Direct 3D 11感知渲染器,它没有作为API发布:您可以利用这些呈现服务作为 Package API的一部分,如播放视频的UWP或HTML5媒体元素。MPEG-2解码器扩展主要针对这些扫描,如果您将其插入旧的Media Foundation拓扑,则会给您带来问题。
我能想到一些解决这个问题的方法,但没有一个听起来是完美的:
1.停止使用EVR并改用DX11VideoRenderer:微软给出了一个起点与此示例,你是自己的建立所需的布线共享DXGI设备管理器。
1.使用多个Direct 3D设备并在两者之间传输视频帧;应该有图形API互操作来帮助以有效的方式传输,但总体而言,这看起来是一种愚蠢的工作,截至2020年,即使是可行的。如果你能接受通过系统内存传输的性能冲击,这条路径看起来或多或少是可以接受的,这使得事情更容易实现。
1.停止使用MPEG-2解码器扩展,在较低级别的DXVA 2 API上实现自己的解码器,并实现硬件辅助解码器,而无需回退到软件,在这种情况下,您可以更好地控制GPU服务的使用并适应渲染器的设备。

wd2eg0qa

wd2eg0qa2#

我也支持使用DX11VideoRenderer作为熟悉D3D11感知设备和管理器的方法。DX11VideoRenderer代码大量使用了ID3D11Device、ID3D11VideoDevice和IMFDXGIDeviceManager接口,没有发布的API不会妨碍您学习如何构建D3D11感知拓扑。
有一个小的不便模糊的建议测试DX11VideoRenderer与topoedit应用程序,该项目的自述文件给. I updated the topoedit code,以便您可以示例化DX11VideoRenderer接收节点和建立拓扑与此节点。我相信这个项目将帮助您朝着正确的方向前进。

相关问题