【发布时间】: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