1

我必须手动构建视频拓扑,其中包括使用加载和配置 mpeg2videoextension(解码器)。否则默认的 topoloader 无法自动解析视频流。我正在使用默认拓扑加载器来解析拓扑的其余部分。

由于我手动加载解码器,文档说我负责让解码器成为硬件加速管理器。(此解码器支持 D3D11)。如果我创建一个 DXGI 设备,然后在代码中创建管理器,我可以将管理器传递给解码器,它似乎可以工作。

文档还说,“在媒体会话场景中,视频渲染器创建 Direct3D 11 设备。”

如果是这种情况,我如何获得该设备的句柄?我假设我应该在设备管理器中使用该设备来传递给解码器。

我在兜圈子。所有示例代码都使用 IDirect3DDeviceManager9。我无法让这些样品发挥作用。所以我决定使用 11。但是我找不到任何使用 11 的示例代码。

有人可以指出我正确的方向吗?

4

1 回答 1

1

对于这一挑战,微软没有给出好的解决方案。事实上,Media Foundation 的标准视频渲染器是 EVR,它仅“感知”Direct3D 9。所以你不能将它与使用通用 DXGI 设备管理器的解码器结合起来。较新的 Microsoft 应用程序使用不同的 Direct3D 11 感知渲染器,它不作为 API 发布:您可以利用这些渲染服务作为包装 API 的一部分,例如播放视频的 UWP 或 HTML5 媒体元素。MPEG-2 解码器扩展主要针对这些扫描仪,如果您将其插入较旧的媒体基础拓扑,则会给您带来问题。

我可以想到一些解决这个问题的方法,但没有一个听起来完全完美:

  1. 停止使用 EVR 并DX11VideoRenderer改用:Microsoft 提供了此示例的起点,您可以自己建立所需的接线以共享 DXGI 设备管理器。

  2. 使用多个 Direct3D 设备并在两者之间传输视频帧;应该有图形 API 互操作来帮助以有效的方式传输,但总体而言,尽管可行,但截至 2020 年,这看起来是一种愚蠢的工作。如果您可以接受通过系统内存传输带来的性能损失,那么这条路径看起来或多或少可以接受,这会使事情更容易实现。

  3. 停止使用 MPEG-2 解码器扩展并在较低级别的 DXVA2 API 之上实现您自己的解码器,并在不回退到软件的情况下实现硬件辅助解码器,在这种情况下,您可以更好地控制使用 GPU 服务并适应渲染器的设备。

于 2020-12-30T08:07:54.633 回答