gpt4 book ai didi

c++ - 使用媒体基础对通过桌面复制获得的 D3D 表面进行编码

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:02:49 26 4
gpt4 key购买 nike

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

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

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

完成所有这些之后,我使用上面创建的 IMFSample 调用 MFTransform::ProcessInput,并获得“E_NOTIMPL 未实现”作为 HRESULT。我读过我应该将 IMFDXGIDeviceManager 设置为上面的 IMFTransform 编码器,所以我使用:

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

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

最佳答案

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

我认为没有,读到这里:MFT_MESSAGE_SET_D3D_MANAGER

If an MFT does not support this message, it should return E_NOTIMPL

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

Call IMFMediaBuffer::Lock. Generally this is not recommended, because it forces the object to copy memory from the Direct3D surface and then back again.

ProcessInput 应该有效。

关于c++ - 使用媒体基础对通过桌面复制获得的 D3D 表面进行编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56406825/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com