【问题标题】:Encoding a D3D Surface obtained through Desktop Duplication using Media Foundation使用 Media Foundation 对通过桌面复制获得的 D3D 表面进行编码
【发布时间】:2019-10-17 19:06:55
【问题描述】:

我想对 Desktop Duplication API 帧进行编码,以便在使用 Media Foundation 对其进行编码后通过网络发送。我在调用 IMFTransform::ProcessInput 时遇到了 E_NOTIMPL 错误,这让我有点不知所措。

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

  • 我正在通过 Duplication API 获取表面,并使用 MFCreateVideoSampleFromSurface 从中创建一个 IMFSample
  • 我从使用 MFT_CATEGORY_VIDEO_ENCODER 和 MFVideoFormat_H264 初始化的 IMFActivate 中使用 IMFActivate::ActivateObject 获取视频编码器
  • 我正在使用比特率、帧率、纵横比等在输入上初始化 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 未实现”,这就是我不知道自己做错了什么或需要做什么的地方。

【问题讨论】:

  • 我也陷入了困境。你能解决问题吗?如果是的话,你能指导我任何资源吗?

标签: c++ h.264 direct3d ms-media-foundation desktop-duplication


【解决方案1】:

首先要做的是检查你的编码器是不是MF_SA_D3D11_AWARE

我认为不是,请阅读:MFT_MESSAGE_SET_D3D_MANAGER

如果一个 MFT 不支持这个消息,它应该返回 E_NOTIMPL

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

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

ProcessInput 应该可以工作的。

【讨论】:

  • 我在做同样的事情,但在解码器的输出中只得到绿屏。 stackoverflow.com/questions/58503662/…
  • 我真的很难修复它。您能指导我访问任何在线资源吗?
  • 我会看看你的问题。
猜你喜欢
  • 2016-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-18
  • 2018-11-14
  • 2018-11-02
  • 1970-01-01
  • 2018-12-23
相关资源
最近更新 更多