使用Media Foundation对Direct X曲面进行编码

Tia*_*ães 5 c++ directx-11 dxgi ms-media-foundation

我正在尝试使用MediaFoundation API对视频进行编码,但是我在将样本推送到SinkWriter时遇到了问题.

我正在通过桌面复制API获取帧编码.我最终得到的是ID3D11Texture2D,其中包含桌面图像.

我正在尝试创建一个包含此表面的IMFVideoSample,然后将该视频样本推送到SinkWriter.

我尝试过不同的方式:

  • 我调用MFCreateVideoSampleFromSurface(texture, &pSample)了纹理是ID3D11Texture2D,填充在SampleTime和SampleDuration中,然后将创建的样本传递给SinkWriter.
    SinkWriter返回E_INVALIDARG.

  • 我尝试通过传递nullptr作为第一个参数并使用MFCreateDXGISurfaceBuffer自己创建缓冲区,然后将生成的缓冲区传递给Sample来尝试创建示例.
    那也行不通.

  • 我阅读了MediaFoundation文档,但无法找到有关如何使用DirectX纹理创建样本的详细信息.

我没有东西可以试试.
有没有人以前使用过这个API,可以想到我应该检查的东西,或者我可以如何调试这个?

Soo*_*nts 2

首先你应该学会使用mftrace工具。\n很可能它会立即告诉你问题所在。

\n\n

但我的猜测是,可能会出现以下问题。

\n\n
    \n
  1. 除了 SampleTime / SampleDuration 之外,可能还需要一些其他属性。

  2. \n
  3. 也许,SinkWriter 需要一个可以在 CPU 上读取的纹理。要解决此问题,当帧可用时,创建相同格式和大小的暂存纹理,调用 CopyResource 将桌面复制到暂存纹理,然后将该暂存纹理传递给 MF。

  4. \n
  5. 即使您使用硬件编码器,因此 CPU 永远不会尝试读取纹理数据,我也不认为将桌面纹理直接传递给 MF 是个好主意。

  6. \n
\n\n

当您为样本设置 D3D 纹理时,不会复制任何数据,样本仅保留纹理。

\n\n

MF 异步工作,如果愿意,它可以在其拓扑节点中缓冲多个样本。

\n\n

DD 同步为您提供数据,您只能在 AcquireNextFrame 和 ReleaseFrame 调用之间访问纹理。

\n