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

时间:2016-07-25 19:46:31

标签: c++ directx-11 ms-media-foundation dxgi

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

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

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

我尝试过以不同的方式解决这个问题:

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

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

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

我用完了很多东西试试 有没有人以前使用过这个API,可以想一想我应该检查的东西,或者我可以怎样调试这个?

1 个答案:

答案 0 :(得分:1)

首先,您应该学会使用mftrace tool。 很可能,它会马上告诉你这个问题。

但我的猜测是,可能存在以下问题。

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

  2. 可能SinkWriter需要一个可以在CPU上读取的纹理。要解决这个问题,当一个框架可用时,创建一个相同格式+大小的分段纹理,调用CopyResource将桌面复制到分段纹理,然后将该分段纹理传递给MF。

  3. 即使你使用硬件编码器让CPU从不尝试读取纹理数据,我也不认为将桌面纹理直接传递给MF是个好主意。

  4. 为样本设置D3D纹理时,不会在任何地方复制数据,样本只会保留纹理。

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

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