首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >利用媒体基础对桌面复制获得的D3D曲面进行编码

利用媒体基础对桌面复制获得的D3D曲面进行编码
EN

Stack Overflow用户
提问于 2019-06-01 12:38:35
回答 1查看 578关注 0票数 2

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

到目前为止,我已经完成了这些步骤,我正在详细说明这些步骤,因为我花了几天的时间从网络上的稀少的零散信息中收集所有的信息,所以如果这个问题解决了,它将有希望帮助到其他人。下面的所有内容都有一个S_OK:

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

在所有这些之后,我使用上面创建的IMFSample调用MFTransform::ProcessInput,并将"E_NOTIMPL未实现“作为HRESULT。我已经读到应该将IMFDXGIDeviceManager设置为上面的IMFTransform编码器,所以我使用了以下方法:

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

在最后一步中,我在我的HRESULT上得到了另一个"E_NOTIMPL未实现“,在那里,我不知道我做错了什么,也不知道需要做什么。

EN

回答 1

Stack Overflow用户

发布于 2019-06-03 21:09:17

首先要做的是检查编码器是否为觉知

我认为没有,读到这个:经理

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

但有一件事很奇怪:DirectX表面缓冲器

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

ProcessInput应该能工作的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56406825

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档