2

我想在使用 Media Foundation 对桌面复制 API 帧进行编码后通过网络发送它们。当我调用 IMFTransform::ProcessInput 时,我遇到了 E_NOTIMPL 错误,这让我有点不知所措。

这些是我到目前为止所做的步骤,我正在详细说明它们,因为我花了几天时间从网络上稀缺的分散信息中收集所有内容,所以如果它得到解决,它希望能帮助其他人。下面的所有内容都会遇到 S_OK:

  • 我通过 Duplication API 获取表面,使用 MFCreateVideoSampleFromSurface 从它创建一个 IMFSample
  • 我正在使用 IMFActivate::ActivateObject 从使用 MFT_CATEGORY_VIDEO_ENCODER 和 MFVideoFormat_H264 初始化的 IMFActivate 获取视频编码器
  • 我正在使用比特率、帧率、纵横比等在输入上初始化 IMFMediaType。最重要的是:MFVideoFormat_NV12,似乎是唯一一个与桌面复制 API 的 DXGI_FORMAT_B8G8R8A8_UNORM 一起使用的。
  • 除了将 MFVideoFormat_H264 设置为 SUB_TYPE 之外,我在输出上设置 IMFMediatype 与上述相同。
  • 我用上面的 2 调用 IMFTransform::SetOutputType 然后 IMFTransform::SetInputType 。
  • 我将 IMFSample 时间设置为 0,因为它似乎不是由 MFCreateVideaSampleFromSurface 设置的。还使用输入 FPS 设置带有 MFFrameRateToAverageTimePerFrame 的 SampleDuration。

在这一切之后,我使用上面创建的 IMFSample 调用 MFTransform::ProcessInput,并获得一个“E_NOTIMPL 未实现”作为 HRESULT。我已经读到我应该在上面的 IMFTransform 编码器中设置一个 IMFDXGIDeviceManager,所以我使用了:

  • 我的 ID3D11Device 中的 MFCreateDXGIDeviceManager 与桌面复制 API 和任意重置令牌一起使用。
  • 使用设备和令牌执行 IMFDXGIDeviceManager::ResetDevice。
  • 调用 IMFTransform::ProcessMessage(MFT_MESSAGE_SET_D3D_MANAGER, reinterpret_cast(m_pDXDeviceManager)。

在这最后一步中,我的 HRESULT 上出现了另一个“E_NOTIMPL 未实现”,这就是我不知道自己做错了什么或需要做什么的地方。

4

1 回答 1

1

首先要做的是检查您的编码器是否为MF_SA_D3D11_AWARE

我认为没有,阅读此内容:MFT_MESSAGE_SET_D3D_MANAGER

如果 MFT 不支持此消息,则应返回 E_NOTIMPL

但有一件事很奇怪:DirectX Surface Buffer

调用 IMFMediaBuffer::Lock。通常不建议这样做,因为它会强制对象从 Direct3D 表面复制内存,然后再返回。

ProcessInput 应该可以工作。

于 2019-06-03T21:09:17.883 回答